무민이의 반반무많이

PE 파일 줄이기(Tiny PE) ③ 본문

Reversing/Basic

PE 파일 줄이기(Tiny PE) ③

M00min 2016.10.12 23:26

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)


■ rdata Section 끝 부분의 남는 영역 삭제

1. 마지막 Section인 rdata Section을 확인하면, 400부터 5FF까지의 영역에 값이 채워져 있는 것을 확인할 수 있다.


2. rdata Section의 맨 끝에있는 IMPORT Hints/Names를 확인하면, 65 6D 00 00로 끝나는 것을 확인할 수 있고, 이 이후에 오는 값들은 rdata Section의 남는 영역을 채워주기 위한 불필요한 값이다.


3. 65 6D 00 00 이후의 값들을 모두 삭제한다. 400부터 4A3까지 총 A4h 크기만 남게 되었다.


4. rdata Section Header에서 rdata 영역의 크기를 나타내는 부분의 주소를 확인한다. 1B0 위치에 rdata 영역의 크기가 존재함을 알 수 있다.


5. 해당 위치로 이동하여, 불필요한 부분을 제거한 이후 크기인 A4h로 바꿔준다.


6. 변경 결과 helloworld.exe 파일의 크기는 1,188 바이트이고, 정상적으로 실행되는 것을 알 수 있다.


■ rdata Section 삭제 (Section 갯수 : 2 → 1)

1. rdata Section에 남아있는 전체 크기인, A4h 만큼의 값을 잘라낸다.


2. 바로 위에 있는 Section인 text Section의 뒷 부분에 잘라낸 값을 붙여넣는다.


3. rdata Section에 존재하던 모든 값들이 text Section 뒷 부분으로 옮겨졌으므로, rdata Section이 비어있는 것을 확인할 수 있다.


4. IMAGE_NT_HEADERS의 IMAGE_FILE_HEADER에서 Section의 갯수를 확인한다. 86 위치에 Section의 갯수가 존재하는 것을 확인할 수 있다


5. 해당 위치로 이동해서 Section의 갯수를 1개로 변경한다.


6. IMAGE_NT_HEADERS의 IMAGE_OPTIONAL_HEADER에서 Size of initialized Data, Base of Data, Size of Image가 존재하는 위치를 확인한다. rdata 섹션을 없애면서, data Section은 아예 존재하지 않게 되었으므로, Size of initialized Data와 Base of Data의 값은 0이 되고, Size of Image는 1000이 감소한 2000이 된다.


7. Size of initialized Data와 Base of Data의 값은 0, Size of Image의 값을 2000으로 변경한다.


8. IMAGE_NT_HEADERS의 IMAGE_OPTIONAL_HEADER에서 IMPORT Table이 존재하는 위치를 확인한다. 기존 RVA값이 2000에서, text Section의 1024로 이동하였으므로 RVA 값은 1024가 된다.


9. IMPORT Table의 RVA 값을 1024로 변경한다.


10. rdata Section의 IMPORT Address Table에서 Data에 값이 존재하는 위치를 확인한다. 시작 위치는 400에서 224로 이동하였으므로 1DC 만큼 감소하였고, 값은 2000에서 1024로 이동하였으므로 FDC 만큼 감소하였다.


11. 460에서 1DC만큼 감소한 284위치의 00002068의 값을 FDC만큼 감소한 0000108C로 변경한다. 나머지 00002090의 값을 000010B4로, 0000209A의 값을 000010BE로 변경한다.


12. rdata Section의 IMPORT Directory Table에서 Data에 값이 존재하는 위치를 확인한다.


13. 11번과 마찬가지로 위치를 계산해서 해당 값의 FDC만큼 뺀 값으로 변경한다.


14. rdata Section의 IMPORT Name Table에서 Data에 값이 존재하는 위치를 확인한다.


15. 11번과 마찬가지로 위치를 계산해서 해당 값의 FDC만큼 뺀 값으로 변경한다.


16. text Section Header에서 Virtual Size는 기존의 값에 rdata Section의 크기인 A4만큼 더한 C8이 되고, Characteristics는 rdata Section에 존재하던 Write 권한을 부여해줘야 하므로, 80000000의 값을 더한 E0000020이 된다.


17. 해당 위치로 이동해서 값을 변경해 준다.


18. rdata Section의 위치가 변경되었으므로, 기존 rdata Section 영역을 호출해주는 부분의 위치를 변경해 주어야 한다. 기존 위치인 004020XX 값을 찾는다.


19. 해당 값을 FDC만큼 빼준 값으로 변경한다.


20. rdata Section Header도 필요가 없어졌기 때문에, 값을 0으로 채우기 위해 위치를 확인한다. 000001A0의 위치부터 000001C4위치의 40000040의 값까지가 rdata Section Header인 것을 확인할 수 있다.


21. 해당 위치의 값들을 0으로 바꿔준다.


22. 저장 후 구조를 확인하면 rdata Section이 삭제되어 총 1개의 Section이 존재하는 것을 확인할 수 있다


23. 결과를 확인하면, 파일의 크기는 기존의 rdata Section 크기인 A4h 만큼 감소한 1,024 바이트이고, 정상적으로 실행되는 것을 알 수 있다.

'Reversing > Basic' 카테고리의 다른 글

PE 파일 줄이기(Tiny PE) ⑤  (0) 2016.10.16
PE 파일 줄이기(Tiny PE) ④  (0) 2016.10.13
PE 파일 줄이기(Tiny PE) ③  (0) 2016.10.12
PE 파일 줄이기(Tiny PE) ②  (0) 2016.10.04
PE 파일 줄이기(Tiny PE) ①  (0) 2016.10.03
PE 파일의 구조와 이해 ④  (0) 2016.09.23
0 Comments
댓글쓰기 폼