WEBVTT

00:00.560 --> 00:01.000
안녕하세요.

00:01.010 --> 00:01.990
돌아온 것을 환영합니다.

00:02.000 --> 00:12.320
이 동영상에서는 이 메모리 덤프가 메모리에서 버려졌기 때문에 이 메모리 덤프를 복구하거나 수정하는 방법을 보여드리겠습니다.

00:12.320 --> 00:22.340
섹션 정렬에 손상이 있을 수 있으며 섹션 헤더와 가져오기 주소 테이블도 제대로 설정되지 않았으므로

00:22.340 --> 00:30.380
분석하거나 추가 작업을 수행하려면 먼저 이 문제를 해결해야 합니다.

00:30.860 --> 00:39.800
그리고 저에게 이 메모리 덤프는 이 메모리 0x10과 그 뒤에 이전 단원에서 덤프한 4개의 0에서

00:39.800 --> 00:41.270
나왔습니다.

00:41.270 --> 00:49.430
귀하의 경우 0x10 다음에 0이 4개가 뒤따르는 것이 아닐 수도 있으므로 메모리 덤프에 따라 필요한 조정을

00:49.430 --> 00:53.210
해야 하며, 이는 저와 다를 수 있습니다.

00:53.240 --> 00:59.600
0x08 다음에 0이 네 개 있거나 0C 다음에 0이 네 개일 수 있습니다.

00:59.600 --> 01:00.860
그러니 상관없습니다.

01:00.870 --> 01:08.160
가장 먼저 필요한 도구는 PE Bear입니다. PE Bear는 여기 FLARE에서 찾을 수 있습니다.

01:08.610 --> 01:16.380
그런 다음 유틸리티로 이동하면 유틸리티 아래에서 PE Bear를 찾을 수 있습니다.

01:18.480 --> 01:25.350
지금 PE에서 이 파일을 열면 PE Bear가 파일 구조를 인식하지 못한다는 것을 알 수 있습니다.

01:25.710 --> 01:28.260
지금 열면 그곳에 도착할 수 있습니다.

01:29.070 --> 01:30.600
경고를 표시합니다.

01:31.410 --> 01:35.340
파일이 메모리에 매핑되었기 때문입니다.

01:35.370 --> 01:39.540
따라서 모든 섹션 헤더가 정렬되지 않습니다.

01:39.660 --> 01:42.000
따라서 여기에서 아무것도 인식되지 않는 것을 볼 수 있습니다.

01:42.030 --> 01:47.550
일반적으로 . 텍스트가 있으면 . 데이터 또는 . 데이터, 재배치 테이블 등입니다.

01:47.550 --> 01:49.740
하지만 현재로서는 모두 인식되지 않습니다.

01:49.910 --> 01:54.030
이 문제를 해결하려면 섹션 헤더를 올바르게 정렬해야 합니다.

01:54.030 --> 01:56.520
헥스 에디터로 이동합니다.

01:56.550 --> 01:58.050
헥스 에디터를 사용하겠습니다. 헥스 에디터의

01:58.050 --> 02:02.880
경우 FLARE에서 찾을 수 있지만 헥스 에디터 아래에서 찾을 수 있습니다.

02:02.880 --> 02:09.660
그래서 이 파일에 적절한 조정을 하기 위해 HxD를 사용하겠습니다.

02:09.660 --> 02:16.440
이제 먼저 PE Bear를 언로드하여 닫겠습니다(모두 언로드, 모두 언로드).

02:16.440 --> 02:21.810
그런 다음 여기 HxD 아래에서 덤프 파일을 엽니다.

02:21.810 --> 02:23.700
HxD로 드래그하기만 하면 됩니다.

02:24.870 --> 02:28.440
따라서 가장 먼저 살펴봐야 할 것은 헤더입니다.

02:28.470 --> 02:31.830
헤더는 여기서는 첫 번째 바이트로 그대로 유지됩니다.

02:32.340 --> 02:34.650
따라서 괜찮다는 뜻입니다. 여기 체육관이 있습니다.

02:34.740 --> 02:35.940
괜찮다는 뜻입니다.

02:36.060 --> 02:43.740
이제 섹션 헤더를 보면 섹션 헤더는 여기서부터 시작해야 하지만

02:43.770 --> 02:50.100
현재 섹션 헤더는 . 텍스트에 널 바이트 3개, 널 바이트 3개가 있습니다.

02:50.790 --> 02:57.060
따라서 이 세 개의 널 바이트를 삭제하여 이 . 텍스트는 섹션 정렬에서 시작됩니다.

02:57.060 --> 02:59.730
여기서는 모든 파일에 대해 동일합니다.

02:59.970 --> 03:02.730
. 텍스트는 섹션 헤더의 시작 부분입니다.

03:02.760 --> 03:06.090
앞에 0 바이트가 표시되면 정렬되지 않았다는 뜻입니다.

03:06.120 --> 03:12.870
따라서 . 텍스트가 여기의 왼쪽 여백에 정렬되도록 이동합니다.

03:13.170 --> 03:17.220
따라서 여기서 이 세 개를 선택하고 이 세 바이트를 잘라내야 합니다.

03:17.880 --> 03:21.660
따라서 마우스 오른쪽 버튼을 클릭하고 선택을 클릭한 다음 마우스 오른쪽 버튼을 클릭하고 잘라내기를 클릭합니다.

03:22.650 --> 03:24.180
경고를 표시합니다. 확인을 클릭합니다.

03:24.180 --> 03:28.500
이제 섹션 헤더가 정렬된 것을 확인할 수 있습니다.

03:29.160 --> 03:35.010
하지만 여기서 널 바이트 3개를 잘라냈기 때문에 전체 파일이 3바이트가 부족하므로 다시 넣어야

03:35.010 --> 03:35.930
합니다.

03:35.940 --> 03:40.920
따라서 다시 넣기에 가장 좋은 위치는 섹션 헤더가 끝나기 바로 직전입니다.

03:41.100 --> 03:42.390
점을 찾아보세요.

03:42.870 --> 03:48.810
40세 이전에는 여기, 40세 이후에는 여기를 참조하세요.

03:50.670 --> 03:53.420
그런 다음 마우스 오른쪽 버튼을 클릭하고 삽입을 붙여넣습니다.

03:54.650 --> 03:55.580
확인을 클릭합니다.

03:56.300 --> 03:59.210
이제 여기에 3바이트를 붙여넣었습니다.

03:59.420 --> 04:05.750
이제 섹션 헤더에 항상 점 다음에 텍스트가 표시되는 것을 확인할 수 있습니다.

04:05.750 --> 04:10.020
또한 저장됨: . 데이터, . 데이터, . reloc.

04:10.040 --> 04:15.120
따라서 점은 제목의 일부이고 문자열은 문자열의 일부입니다.

04:15.140 --> 04:16.960
따라서 항상 점이 있는지 확인해야 합니다.

04:16.970 --> 04:23.000
이제 여기서 3바이트를 잘라내고 여기에 다시 3바이트를 넣었으므로 파일 크기를

04:23.000 --> 04:25.700
손상시키지 않고 보존했습니다.

04:25.700 --> 04:30.110
또한 여기에서 섹션 헤더를 왼쪽 여백에 정렬합니다.

04:30.500 --> 04:32.160
이제 저장할 수 있습니다.

04:32.180 --> 04:33.500
이를 섹션 정렬이라고 합니다.

04:33.500 --> 04:36.140
그래서 저장하고 이제 닫습니다.

04:36.170 --> 04:38.240
백업을 만들었음을 알 수 있습니다.

04:38.780 --> 04:42.290
이제 이 파일을 다시 열면

04:43.190 --> 04:51.900
이제 섹션 정렬을 복구한 후 모든 섹션 헤더를 선명하게 볼 수 있습니다.

04:51.900 --> 04:55.010
이제, . 텍스트, . 데이터, . 데이터, . reloc.

04:55.440 --> 05:02.370
다음으로 할 일은 섹션 헤더의 매핑을 해제하는 것입니다.

05:03.820 --> 05:09.030
이 모든 원시 주소가 메모리에서 매핑되었으므로 매핑 해제 작업이 필요합니다.

05:09.040 --> 05:12.010
따라서 파일과 동기화되지 않은 부분이 모두 있습니다.

05:12.760 --> 05:17.800
따라서 원시 주소와 가상 주소가 동일한지 확인해야 합니다.

05:18.160 --> 05:23.050
따라서 여기의 모든 열을 여기의 이 열과 동일하게 변경해야 합니다.

05:23.470 --> 05:31.570
이를 위해 여기는 1000으로, 여기는 12,000으로, 여기는 19,000으로 변경합니다.

05:31.570 --> 05:38.260
따라서 이를 19,000으로 변경하면 여기에 1D와 0이 세 개 있습니다.

05:38.530 --> 05:41.800
따라서 1D 뒤에 0을 세 개 넣습니다.

05:43.180 --> 05:47.750
다음은 이 열, 즉 원시 크기를 수정하는 것입니다.

05:47.770 --> 05:53.470
따라서 원시 크기는 12,000 - 1000 = 11,000을 취하여 계산합니다.

05:53.650 --> 05:54.880
그래서 이것이 맞습니다.

05:55.270 --> 06:00.370
그리고 7000은 19,000 - 12,000입니다.

06:00.400 --> 06:01.600
그러면 7000이 됩니다.

06:01.600 --> 06:02.530
그래서 이것이 맞습니다.

06:03.230 --> 06:05.450
하지만 이번 사건의 경우 이는 잘못된 것입니다.

06:05.900 --> 06:11.600
이것은 1D30 - 19, 0이 세 개입니다.

06:12.110 --> 06:14.720
자, 계산기를 열어 보겠습니다.

06:18.660 --> 06:22.020
그리고 프로그래머 계산기로 변경합니다.

06:22.560 --> 06:30.850
1D 뒤에 0이 세 개가 붙은 16진법을 사용합니다. 16진수, 1D 다음에 0이 세 개 있는 것을 선택합니다.

06:30.870 --> 06:34.670
이제 19와 0 세 개가 뒤따릅니다.

06:34.680 --> 06:42.300
따라서 마이너스, 마이너스, 19를 차례로 클릭한 다음 0을 세 번 클릭해야 합니다.

06:43.380 --> 06:45.690
4 뒤에 0이 3개 있어야 합니다.

06:45.690 --> 06:47.490
따라서 이것은 4로 변경되어야 합니다.

06:48.210 --> 06:49.300
4000.

06:49.320 --> 06:56.670
따라서 4000을 변경하면 여기 이 부분, 즉 . 데이터 섹션을 선택하면 녹색이 전체 블록을

06:56.670 --> 06:58.380
채웁니다.

06:59.110 --> 07:00.760
그래서 4000을 넣었습니다.

07:03.400 --> 07:04.270
Enter 키를 누릅니다.

07:04.270 --> 07:06.190
이제 블록 전체가 채워지는 것을 볼 수 있습니다.

07:06.640 --> 07:10.030
이제 재배치 섹션은 안전하게 무시해도 됩니다.

07:10.240 --> 07:11.620
아무것도 할 필요가 없습니다.

07:11.620 --> 07:12.850
따라서 그대로 두면 됩니다.

07:13.090 --> 07:16.390
다음으로 수정해야 할 것은 가상 크기입니다.

07:16.420 --> 07:23.120
가상 크기도 매핑을 해제해야 하므로 원시 크기가 되려면 매핑을 해제하세요.

07:23.140 --> 07:27.610
따라서 여기에서 이것을 이렇게 변경해야 합니다.

07:27.730 --> 07:28.950
이것은 이렇게 될 것입니다.

07:28.960 --> 07:29.920
지금 바로 시작하세요.

07:30.310 --> 07:31.690
11,000이 되어야 합니다.

07:33.520 --> 07:35.590
이것은 7000이어야 합니다.

07:38.730 --> 07:40.770
이것은 4000이어야 합니다.

07:44.300 --> 07:46.580
그리고 이것은 1000이어야 합니다.

07:49.790 --> 07:50.300
알겠습니다.

07:50.300 --> 07:53.240
이제 매핑을 해제했습니다.

07:53.510 --> 07:56.330
수입품도 확인할 수 있습니다.

07:56.900 --> 07:59.570
따라서 가져오기 주소 테이블이 그대로 유지되는 것을 볼 수 있습니다.

08:01.220 --> 08:08.270
이제 가져오기 주소 테이블이 손상되지 않은 이유는 두 가지가 있는데, 하나는 적절한 섹션 정렬을 제대로 수행했기

08:08.270 --> 08:09.350
때문입니다.

08:09.590 --> 08:14.570
앞서 육각 편집기를 사용하여 섹션 정렬을 수행했습니다.

08:15.020 --> 08:18.500
헥스 에디터를 보여드리겠습니다.

08:25.820 --> 08:26.060
알겠습니다.

08:26.060 --> 08:26.850
이것은 육각 편집기입니다.

08:26.870 --> 08:35.510
이 앞에 있는 세 개의 널 바이트를 잘라낸다는 것을 기억하세요. 텍스트를 입력한 다음 여기에 다시 넣습니다.

08:35.990 --> 08:42.980
이제 세 개의 널 바이트를 잘라내고 여기에 다시 넣지 않았다면, 세 개의 널 바이트가

08:43.190 --> 08:49.700
모두 빨간색으로 표시되는 가져오기 주소 테이블이 표시됩니다.

08:49.790 --> 08:54.320
즉, 제대로 정렬되지 않고 엉망이라는 뜻입니다.

08:54.350 --> 09:02.840
따라서 섹션 헤더를 정렬하기 위해 잘라낸 널 바이트가 무엇이든 가져오기 주소

09:02.840 --> 09:08.060
테이블이 수정되도록 다시 넣어야 합니다.

09:08.480 --> 09:09.530
빨간색으로 표시되지 않습니다.

09:10.550 --> 09:10.750
알겠습니다.

09:10.760 --> 09:15.260
이제 모든 기능이 제대로 작동하는 것을 볼 수 있습니다.

09:16.550 --> 09:21.740
이제 마지막으로 해야 할 일은 기본 주소를 수정하는 것입니다.

09:22.280 --> 09:24.020
그래서 우리는 그것을 다시 기반으로 삼아야 합니다.

09:24.020 --> 09:25.800
따라서 선택적 헤더를 클릭합니다.

09:26.010 --> 09:33.170
그리고 여기에서는 현재 기본 주소가 40이고 그 뒤에 0이 네 개 있습니다.

09:33.180 --> 09:43.890
따라서 이 덤프는 100,000, 0x100,000 주소에서 왔기 때문에-주소를 보자-내 주소는 100,000,

09:45.040 --> 09:48.220
0x100,000입니다.

09:48.250 --> 09:53.020
따라서 기본 주소를 100,000으로 입력해야 합니다.

09:53.530 --> 09:55.960
여러분에게는 다를 수 있습니다.

09:55.990 --> 09:58.570
80,000 또는 0 C0 뒤에 0이

09:58.600 --> 10:01.750
네 번 나오는 식이 될 수 있습니다.

10:01.750 --> 10:04.560
따라서 기본 주소를 따라야 합니다.

10:04.570 --> 10:06.000
어디서 버린 건가요?

10:06.070 --> 10:09.760
저에게는 이 주소이므로 이 주소를 새 기본 주소로 사용해야 합니다.

10:09.760 --> 10:13.390
그래서 여기와 이미지 베이스로 이동합니다.

10:13.390 --> 10:17.980
100,000으로 다시 설정하겠습니다.

10:18.010 --> 10:20.830
즉, 1 뒤에 0이 다섯 개 있습니다.

10:21.940 --> 10:22.390
Enter 키를

10:22.390 --> 10:22.900
누릅니다.

10:24.010 --> 10:24.340
알겠습니다.

10:24.340 --> 10:32.110
그래서 이제 섹션 정렬을 완료하고 섹션 헤더와 가져오기 주소 테이블을 수정하고

10:32.110 --> 10:34.630
리베이스도 했습니다.

10:34.870 --> 10:42.550
이제 이 파일을 덤프할 준비가 되었으므로 이 파일을 마우스 오른쪽 버튼으로 클릭하고 다른 이름으로 실행 파일을 저장할

10:42.550 --> 10:43.750
수 있습니다.

10:45.870 --> 10:49.470
이제 svchost_fixed를 볼 수 있습니다.

10:52.110 --> 10:53.340
그런 다음 저장을 클릭합니다.

10:55.660 --> 10:56.020
알겠습니다.

10:56.020 --> 11:06.370
따라서 svchost_fixed를 만들었고 이제 IDA에서 열어 제대로 수정되었는지 확인할 수 있습니다. 이제 이것도 닫고, 이것도 닫고,

11:06.370 --> 11:14.950
이것도 닫고, 이것도 닫을 수 있습니다.

11:14.950 --> 11:17.150
그리고 IDA에서 svchost_fixed를

11:17.190 --> 11:21.850
열어 읽을 수 있는지 확인해 보겠습니다.

11:24.260 --> 11:29.760
좋아요, 새로 만들기를 클릭하고 이동하여 고정 파일을 엽니다.

11:30.570 --> 11:31.410
열기를 클릭합니다.

11:33.210 --> 11:33.340
확인을

11:33.450 --> 11:34.140
클릭합니다.

11:35.310 --> 11:37.440
IDA에 분석을 맡기세요.

11:43.390 --> 11:44.620
네, 좋아 보이네요.

11:44.650 --> 11:47.020
API 함수는 여기에서 확인할 수 있습니다.

11:47.530 --> 11:48.610
여기에서도 마찬가지입니다.

11:48.730 --> 11:56.380
또한 가져오기 주소 테이블과 함수에 대한 가져오기를 모두 볼 수 있습니다.

11:56.380 --> 11:57.050
잘됐네요.

11:57.070 --> 11:59.590
이제 진입 지점을 살펴보겠습니다.

11:59.620 --> 12:03.620
여기에는 SetLastError와 ExitProcess가 있는 것을 볼 수 있습니다.

12:03.640 --> 12:10.340
즉, 진입 지점은 오류 및 종료 프로세스 이전의 어딘가에 있어야 합니다.

12:10.360 --> 12:13.120
따라서 이 함수가 호출하는 첫 번째 함수는 다음과 같습니다.

12:13.120 --> 12:14.950
따라서 여기가 시작점이어야 합니다.

12:15.100 --> 12:18.130
그래서 우리는 이것을 두 번 클릭하고 그곳으로 가서 무엇을 얻는지 확인합니다.

12:18.280 --> 12:20.290
좋은 소식도 있습니다.

12:20.290 --> 12:20.780
실제로

12:20.800 --> 12:26.810
모든 API 함수를 명확하게 레이블이 지정된 텍스트로 볼 수 있습니다.

12:27.100 --> 12:34.390
즉, 메모리에서 덤프를 수정하고 매핑을 해제하고 섹션 정렬을 수행하는 데 성공했습니다.

12:34.390 --> 12:36.010
모든 것이 성공적으로 완료되었습니다.

12:36.280 --> 12:38.350
마지막 테스트는 문자열을 볼 수 있는지

12:38.350 --> 12:38.740
확인하는

12:38.740 --> 12:39.670
것입니다.

12:39.670 --> 12:45.920
따라서 보기, 하위 보기 열기로 이동한 다음 문자열을 찾습니다.

12:45.950 --> 12:47.350
여기까지입니다.

12:47.360 --> 12:52.880
많은 문자열을 볼 수 있습니다. 암호화되어 있지만 문자열이 있는 것을 볼 수 있습니다.

12:53.750 --> 12:54.170
맞습니다.

12:54.170 --> 12:55.250
문자열을 볼 수 있습니다.

12:55.400 --> 12:58.070
성공적인 작전이었습니다.

12:58.070 --> 13:06.530
섹션 정렬을 완료하고 섹션 헤더를 수정했으며 파일 매핑도 해제했습니다.

13:06.530 --> 13:11.540
그런 다음 가져오기 주소 테이블도 수정했습니다.

13:11.540 --> 13:14.150
이 영상은 여기까지입니다.

13:14.180 --> 13:16.760
시청해 주셔서 감사합니다.
