무민이의 반반무많이

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

Reversing/Basic

PE 파일 줄이기(Tiny PE) ⑤

M00min 2016.10.16 23:30

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


■ IDT(Import Directory Table)를 상단의 빈 영역으로 옮기기

1. txt Section안의 IDT가 존재하는 영역을 확인한다. 224h부터 24Bh까지 총 28h 크기만큼 존재하는 것을 확인할 수 있다.


2. IDT의 RVA 값을 확인하면, 1024h부터 104Bh까지 존재하는 것을 확인할 수 있다. 구조상에서 IDT의 하단에 있는 IMPORT DLL Names, IMPORT Name Table, IMPORT Address Table, IMPORT Hints/Names를 확인하여 1024h부터 104Bh 사이의 값을 가지는 것이 있으면 위치 변경 이후의 RVA 값으로 바꿔주어야 한다. 여기서는 해당 범위의 값을 가지는 것이 없으므로 넘어가면 된다.



3. IDT 영역을 복사한다. 


4. 복사한 영역을 상단의 빈 부분에 붙여넣는다.


5. 제대로 옮겨졌는지 확인하기 위해, 기존의 IDT에 존재하는 값을 0으로 바꿔준다.


6. IMAGE_OPTIONAL_HEADER에서 IDT의 시작 RVA 값이 지정되어있는 위치를 확인한다.


7. 5번에서 확인한 100h의 값을, 새로운 RVA 시작 위치인 40h으로 변경한다.


8. 저장 후 결과를 확인하면, IDT가 정상적으로 옮겨진 것을 확인할 수 있다.


9. 저장 후 결과를 확인하면, 정상적으로 실행되는 것을 알 수 있다.


■ IMPORT DLL Names를 상단의 빈 영역으로 옮기기

1. IMPORT DLL Names 영역을 확인한다. 260h부터 278h까지 존재하는 것을 확인할 수 있다.


2. 해당 위치로 이동해서 값을 복사한다.


3. 상단의 빈 영역에 붙여넣는다.


4. 제대로 옮겨졌는지 확인하기 위해, 기존의 IMPORT DLL Names에 존재하는 값을 0으로 바꿔준다.


5. IMPORT DLL Names의 RVA 값을 확인하면, 1060h부터 1078h까지 존재하는 것을 확인할 수 있다. IMPORT Directory Table, IMPORT Name Table, IMPORT Address Table, IMPORT Hints/Names를 확인하여 1060h부터 1078h사이의 값을 가지는 것이 있으면 위치 변경 이후의 RVA 값으로 바꿔주어야 한다.


6. IMPORT Directory Table을 확인하면 총 2곳에서 IMPORT DLL Names 영역의 값을 참조하는 것을 확인할 수 있다.


7. 해당 위치로 이동해서 위치 이동 이후의 RVA 값으로 변경한다.


8. 저장 후 결과를 확인하면, IMPORT DLL Names가 정상적으로 옮겨진 것을 확인할 수 있다.


9. 저장 후 결과를 확인하면, 정상적으로 실행되는 것을 알 수 있다.


■ IMPORT Name Table, IMPORT Address Table, IMPORT Hints/Names를 상단의 빈 영역으로 옮기기

1. IMPORT Name Table의 시작 위치를 확인한다. 27Ch 위치에서 부터 시작하는 것을 알 수 있다.


2. 해당 영역을 복사한다.


3. 복사한 것을 상단의 빈 영역에 붙여넣는다.


4. 제대로 옮겨졌는지 확인하기 위해, 기존의 IMPORT Name Table, IMPORT Address Table, IMPORT Hints/Names에 존재하는 값을 0으로 바꿔준다.


5. IMPORT Name Table의 RVA 값을 확인하면, 107Ch부터 10A7h까지 존재하는 것을 확인할 수 있다. IMPORT DLL Names, IMPORT Directory Table, IMPORT Address Table, IMPORT Hints/Names를 확인하여 해당 값을 가지는 것이 있으면 위치 변경 이후의 RVA 값으로 바꿔주어야 한다.


6. IMPORT Name Table의 총 3군데에서 107Ch부터 10A7h사이의 값을 참조하는 것을 확인할 수 있다.


7. 해당 위치로 이동해서 위치 이동 이후의 RVA 값으로 변경한다.


8. IMPORT Address Table의 총 3군데에서 107Ch부터 10A7h사이의 값을 참조하는 것을 확인할 수 있다.


9. 해당 위치로 이동해서 위치 이동 이후의 RVA 값으로 변경한다.


10. IMPORT Directory Table의 총 4군데에서 107Ch부터 10A7h사이의 값을 참조하는 것을 확인할 수 있다.


11. 해당 위치로 이동해서 위치 이동 이후의 RVA 값으로 변경한다.


12. IMPORT Name Table의 위치가 변경되었기 때문에, IMPORT Name Table안의 함수를 호출하기 위한 주소 값도 변경되어야 한다. 0040107Ch부터 004010A7h사이의 값을 참조하는 부분을, 위치 이동 이후의 VA값으로 변경해야 한다.


13. 총 3군데에서 0040107Ch부터 004010A7h사이의 값을 참조하는 것을 확인할 수 있다.


14. 해당 값을 위치 이동 이후의 VA 값으로 변경한다.


15. IMAGE_OPTIONAL_HEADER에서 IMPORT Address Table의 시작 RVA 값을 가지는 위치를 확인한다.


16. 위치 변경 이후의 IMPORT Address Table의 시작 RVA 값을 확인한다.


17. 15번에서 확인한 위치에서 시작 RVA 값을 1A8h로 변경한다.


18. 저장 후 결과를 확인하면, IMPORT Name Table, IMPORT Address Table, IMPORT Hints/Names가 정상적으로 옮겨진 것을 확인할 수 있다.


19. 저장 후 결과를 확인하면, 정상적으로 실행되는 것을 알 수 있다.


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

1. txt Section의 맨 끝에있는 A8 01 40 00 이후에 오는 값들은 txt Section의 남는 영역을 채워주기 위한 불필요한 값이다.


2. 224h 이후의 값들을 모두 삭제하여 24h 크기만큼만 남긴다.


3. txt Section Header에서 txt Section의 크기를 나타내는 위치를 찾는다.


4. 해당 위치로 이동하여, 불필요한 부분을 삭제한 이후의 크기인 24h로 변경한다.


5. 결과를 확인하면, 파일의 크기는 548 바이트 이고, 정상적으로 실행되는 것을 알 수 있다.


최종적으로 2,048 바이트에서 548 바이트가 되어, 약 3/4을 줄일 수 있었다.

최종 실행 파일 :  helloworld.exe

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

PE 파일 Patch(패치)  (0) 2016.10.27
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
0 Comments
댓글쓰기 폼