안녕하세요.
돌아온 것을 환영합니다.
이 동영상에서는 이 메모리 덤프가 메모리에서 버려졌기 때문에 이 메모리 덤프를 복구하거나 수정하는 방법을 보여드리겠습니다.
섹션 정렬에 손상이 있을 수 있으며 섹션 헤더와 가져오기 주소 테이블도 제대로 설정되지 않았으므로
분석하거나 추가 작업을 수행하려면 먼저 이 문제를 해결해야 합니다.
그리고 저에게 이 메모리 덤프는 이 메모리 0x10과 그 뒤에 이전 단원에서 덤프한 4개의 0에서
나왔습니다.
귀하의 경우 0x10 다음에 0이 4개가 뒤따르는 것이 아닐 수도 있으므로 메모리 덤프에 따라 필요한 조정을
해야 하며, 이는 저와 다를 수 있습니다.
0x08 다음에 0이 네 개 있거나 0C 다음에 0이 네 개일 수 있습니다.
그러니 상관없습니다.
가장 먼저 필요한 도구는 PE Bear입니다. PE Bear는 여기 FLARE에서 찾을 수 있습니다.
그런 다음 유틸리티로 이동하면 유틸리티 아래에서 PE Bear를 찾을 수 있습니다.
지금 PE에서 이 파일을 열면 PE Bear가 파일 구조를 인식하지 못한다는 것을 알 수 있습니다.
지금 열면 그곳에 도착할 수 있습니다.
경고를 표시합니다.
파일이 메모리에 매핑되었기 때문입니다.
따라서 모든 섹션 헤더가 정렬되지 않습니다.
따라서 여기에서 아무것도 인식되지 않는 것을 볼 수 있습니다.
일반적으로 . 텍스트가 있으면 . 데이터 또는 . 데이터, 재배치 테이블 등입니다.
하지만 현재로서는 모두 인식되지 않습니다.
이 문제를 해결하려면 섹션 헤더를 올바르게 정렬해야 합니다.
헥스 에디터로 이동합니다.
헥스 에디터를 사용하겠습니다. 헥스 에디터의
경우 FLARE에서 찾을 수 있지만 헥스 에디터 아래에서 찾을 수 있습니다.
그래서 이 파일에 적절한 조정을 하기 위해 HxD를 사용하겠습니다.
이제 먼저 PE Bear를 언로드하여 닫겠습니다(모두 언로드, 모두 언로드).
그런 다음 여기 HxD 아래에서 덤프 파일을 엽니다.
HxD로 드래그하기만 하면 됩니다.
따라서 가장 먼저 살펴봐야 할 것은 헤더입니다.
헤더는 여기서는 첫 번째 바이트로 그대로 유지됩니다.
따라서 괜찮다는 뜻입니다. 여기 체육관이 있습니다.
괜찮다는 뜻입니다.
이제 섹션 헤더를 보면 섹션 헤더는 여기서부터 시작해야 하지만
현재 섹션 헤더는 . 텍스트에 널 바이트 3개, 널 바이트 3개가 있습니다.
따라서 이 세 개의 널 바이트를 삭제하여 이 . 텍스트는 섹션 정렬에서 시작됩니다.
여기서는 모든 파일에 대해 동일합니다.
. 텍스트는 섹션 헤더의 시작 부분입니다.
앞에 0 바이트가 표시되면 정렬되지 않았다는 뜻입니다.
따라서 . 텍스트가 여기의 왼쪽 여백에 정렬되도록 이동합니다.
따라서 여기서 이 세 개를 선택하고 이 세 바이트를 잘라내야 합니다.
따라서 마우스 오른쪽 버튼을 클릭하고 선택을 클릭한 다음 마우스 오른쪽 버튼을 클릭하고 잘라내기를 클릭합니다.
경고를 표시합니다. 확인을 클릭합니다.
이제 섹션 헤더가 정렬된 것을 확인할 수 있습니다.
하지만 여기서 널 바이트 3개를 잘라냈기 때문에 전체 파일이 3바이트가 부족하므로 다시 넣어야
합니다.
따라서 다시 넣기에 가장 좋은 위치는 섹션 헤더가 끝나기 바로 직전입니다.
점을 찾아보세요.
40세 이전에는 여기, 40세 이후에는 여기를 참조하세요.
그런 다음 마우스 오른쪽 버튼을 클릭하고 삽입을 붙여넣습니다.
확인을 클릭합니다.
이제 여기에 3바이트를 붙여넣었습니다.
이제 섹션 헤더에 항상 점 다음에 텍스트가 표시되는 것을 확인할 수 있습니다.
또한 저장됨: . 데이터, . 데이터, . reloc.
따라서 점은 제목의 일부이고 문자열은 문자열의 일부입니다.
따라서 항상 점이 있는지 확인해야 합니다.
이제 여기서 3바이트를 잘라내고 여기에 다시 3바이트를 넣었으므로 파일 크기를
손상시키지 않고 보존했습니다.
또한 여기에서 섹션 헤더를 왼쪽 여백에 정렬합니다.
이제 저장할 수 있습니다.
이를 섹션 정렬이라고 합니다.
그래서 저장하고 이제 닫습니다.
백업을 만들었음을 알 수 있습니다.
이제 이 파일을 다시 열면
이제 섹션 정렬을 복구한 후 모든 섹션 헤더를 선명하게 볼 수 있습니다.
이제, . 텍스트, . 데이터, . 데이터, . reloc.
다음으로 할 일은 섹션 헤더의 매핑을 해제하는 것입니다.
이 모든 원시 주소가 메모리에서 매핑되었으므로 매핑 해제 작업이 필요합니다.
따라서 파일과 동기화되지 않은 부분이 모두 있습니다.
따라서 원시 주소와 가상 주소가 동일한지 확인해야 합니다.
따라서 여기의 모든 열을 여기의 이 열과 동일하게 변경해야 합니다.
이를 위해 여기는 1000으로, 여기는 12,000으로, 여기는 19,000으로 변경합니다.
따라서 이를 19,000으로 변경하면 여기에 1D와 0이 세 개 있습니다.
따라서 1D 뒤에 0을 세 개 넣습니다.
다음은 이 열, 즉 원시 크기를 수정하는 것입니다.
따라서 원시 크기는 12,000 - 1000 = 11,000을 취하여 계산합니다.
그래서 이것이 맞습니다.
그리고 7000은 19,000 - 12,000입니다.
그러면 7000이 됩니다.
그래서 이것이 맞습니다.
하지만 이번 사건의 경우 이는 잘못된 것입니다.
이것은 1D30 - 19, 0이 세 개입니다.
자, 계산기를 열어 보겠습니다.
그리고 프로그래머 계산기로 변경합니다.
1D 뒤에 0이 세 개가 붙은 16진법을 사용합니다. 16진수, 1D 다음에 0이 세 개 있는 것을 선택합니다.
이제 19와 0 세 개가 뒤따릅니다.
따라서 마이너스, 마이너스, 19를 차례로 클릭한 다음 0을 세 번 클릭해야 합니다.
4 뒤에 0이 3개 있어야 합니다.
따라서 이것은 4로 변경되어야 합니다.
4000.
따라서 4000을 변경하면 여기 이 부분, 즉 . 데이터 섹션을 선택하면 녹색이 전체 블록을
채웁니다.
그래서 4000을 넣었습니다.
Enter 키를 누릅니다.
이제 블록 전체가 채워지는 것을 볼 수 있습니다.
이제 재배치 섹션은 안전하게 무시해도 됩니다.
아무것도 할 필요가 없습니다.
따라서 그대로 두면 됩니다.
다음으로 수정해야 할 것은 가상 크기입니다.
가상 크기도 매핑을 해제해야 하므로 원시 크기가 되려면 매핑을 해제하세요.
따라서 여기에서 이것을 이렇게 변경해야 합니다.
이것은 이렇게 될 것입니다.
지금 바로 시작하세요.
11,000이 되어야 합니다.
이것은 7000이어야 합니다.
이것은 4000이어야 합니다.
그리고 이것은 1000이어야 합니다.
알겠습니다.
이제 매핑을 해제했습니다.
수입품도 확인할 수 있습니다.
따라서 가져오기 주소 테이블이 그대로 유지되는 것을 볼 수 있습니다.
이제 가져오기 주소 테이블이 손상되지 않은 이유는 두 가지가 있는데, 하나는 적절한 섹션 정렬을 제대로 수행했기
때문입니다.
앞서 육각 편집기를 사용하여 섹션 정렬을 수행했습니다.
헥스 에디터를 보여드리겠습니다.
알겠습니다.
이것은 육각 편집기입니다.
이 앞에 있는 세 개의 널 바이트를 잘라낸다는 것을 기억하세요. 텍스트를 입력한 다음 여기에 다시 넣습니다.
이제 세 개의 널 바이트를 잘라내고 여기에 다시 넣지 않았다면, 세 개의 널 바이트가
모두 빨간색으로 표시되는 가져오기 주소 테이블이 표시됩니다.
즉, 제대로 정렬되지 않고 엉망이라는 뜻입니다.
따라서 섹션 헤더를 정렬하기 위해 잘라낸 널 바이트가 무엇이든 가져오기 주소
테이블이 수정되도록 다시 넣어야 합니다.
빨간색으로 표시되지 않습니다.
알겠습니다.
이제 모든 기능이 제대로 작동하는 것을 볼 수 있습니다.
이제 마지막으로 해야 할 일은 기본 주소를 수정하는 것입니다.
그래서 우리는 그것을 다시 기반으로 삼아야 합니다.
따라서 선택적 헤더를 클릭합니다.
그리고 여기에서는 현재 기본 주소가 40이고 그 뒤에 0이 네 개 있습니다.
따라서 이 덤프는 100,000, 0x100,000 주소에서 왔기 때문에-주소를 보자-내 주소는 100,000,
0x100,000입니다.
따라서 기본 주소를 100,000으로 입력해야 합니다.
여러분에게는 다를 수 있습니다.
80,000 또는 0 C0 뒤에 0이
네 번 나오는 식이 될 수 있습니다.
따라서 기본 주소를 따라야 합니다.
어디서 버린 건가요?
저에게는 이 주소이므로 이 주소를 새 기본 주소로 사용해야 합니다.
그래서 여기와 이미지 베이스로 이동합니다.
100,000으로 다시 설정하겠습니다.
즉, 1 뒤에 0이 다섯 개 있습니다.
Enter 키를
누릅니다.
알겠습니다.
그래서 이제 섹션 정렬을 완료하고 섹션 헤더와 가져오기 주소 테이블을 수정하고
리베이스도 했습니다.
이제 이 파일을 덤프할 준비가 되었으므로 이 파일을 마우스 오른쪽 버튼으로 클릭하고 다른 이름으로 실행 파일을 저장할
수 있습니다.
이제 svchost_fixed를 볼 수 있습니다.
그런 다음 저장을 클릭합니다.
알겠습니다.
따라서 svchost_fixed를 만들었고 이제 IDA에서 열어 제대로 수정되었는지 확인할 수 있습니다. 이제 이것도 닫고, 이것도 닫고,
이것도 닫고, 이것도 닫을 수 있습니다.
그리고 IDA에서 svchost_fixed를
열어 읽을 수 있는지 확인해 보겠습니다.
좋아요, 새로 만들기를 클릭하고 이동하여 고정 파일을 엽니다.
열기를 클릭합니다.
확인을
클릭합니다.
IDA에 분석을 맡기세요.
네, 좋아 보이네요.
API 함수는 여기에서 확인할 수 있습니다.
여기에서도 마찬가지입니다.
또한 가져오기 주소 테이블과 함수에 대한 가져오기를 모두 볼 수 있습니다.
잘됐네요.
이제 진입 지점을 살펴보겠습니다.
여기에는 SetLastError와 ExitProcess가 있는 것을 볼 수 있습니다.
즉, 진입 지점은 오류 및 종료 프로세스 이전의 어딘가에 있어야 합니다.
따라서 이 함수가 호출하는 첫 번째 함수는 다음과 같습니다.
따라서 여기가 시작점이어야 합니다.
그래서 우리는 이것을 두 번 클릭하고 그곳으로 가서 무엇을 얻는지 확인합니다.
좋은 소식도 있습니다.
실제로
모든 API 함수를 명확하게 레이블이 지정된 텍스트로 볼 수 있습니다.
즉, 메모리에서 덤프를 수정하고 매핑을 해제하고 섹션 정렬을 수행하는 데 성공했습니다.
모든 것이 성공적으로 완료되었습니다.
마지막 테스트는 문자열을 볼 수 있는지
확인하는
것입니다.
따라서 보기, 하위 보기 열기로 이동한 다음 문자열을 찾습니다.
여기까지입니다.
많은 문자열을 볼 수 있습니다. 암호화되어 있지만 문자열이 있는 것을 볼 수 있습니다.
맞습니다.
문자열을 볼 수 있습니다.
성공적인 작전이었습니다.
섹션 정렬을 완료하고 섹션 헤더를 수정했으며 파일 매핑도 해제했습니다.
그런 다음 가져오기 주소 테이블도 수정했습니다.
이 영상은 여기까지입니다.
시청해 주셔서 감사합니다.