📄 脱壳要点.txt
字号:
《加密与解密》(第二版)配套习题(www.pediy.com)
==============================================================================================
由于篇幅,此例没放进书里。
脱壳要点:
1、找OEP大概11个SEH调用后,再跟几步就能找到。
2、DUMP取数据
由于UnpackMe.exe内存映像有9M之多,因此Dump后必须将其减肥。将Dump取的境像文件最后两个区块删除(即
偏移地址为0xd000后的数据全删)
或直接抓取前0xD000大小的数据:PAGEIN D 400000 D000 \??\C:\dump.exe
3、输入表
外壳模拟Windows装载器填充IAT时,会对IAT成员加密(即Hook API),此时IAT的成员指向的是外壳代码。
由于加入了许多垃圾代码干扰,此时用ImportREC是不能重建得到输入表的。
所以第一步就是要得到没加密的IAT。
方法如下:
bpm 4062E4(记事本程序的IAT位置是4062E4)
同时观察数据窗口DD 4062E4 变化
或用这个断点:bpx getprocadress
会来到如下代码处:
001B:0040D2A9 46 INC ESI
001B:0040D2AA 8A0E MOV CL,[ESI]
001B:0040D2AC 0AC9 OR CL,CL
001B:0040D2AE 750A JNZ 0040D2BA
001B:0040D2B0 8A4E03 MOV CL,[ESI+03]
001B:0040D2B3 80F980 CMP CL,80
001B:0040D2B6 7402 JZ 0040D2BA
001B:0040D2B8 EB4C JMP 0040D306
001B:0040D2BA 8B06 MOV EAX,[ESI]
001B:0040D2BC 3D00000080 CMP EAX,80000000
001B:0040D2C1 760B JBE 0040D2CE
001B:0040D2C3 25FFFFFF0F AND EAX,0FFFFFFF
001B:0040D2C8 50 PUSH EAX
001B:0040D2C9 83C604 ADD ESI,04
001B:0040D2CC EB08 JMP 0040D2D6
001B:0040D2CE 56 PUSH ESI
001B:0040D2CF 46 INC ESI
001B:0040D2D0 8A0E MOV CL,[ESI]
001B:0040D2D2 84C9 TEST CL,CL
001B:0040D2D4 75F9 JNZ 0040D2CF
001B:0040D2D6 FFB585040000 PUSH DWORD PTR [EBP+00000485]
001B:0040D2DC FF9534060000 CALL [EBP+00000634]
001B:0040D2E2 8B8D89040000 MOV ECX,[EBP+00000489]
001B:0040D2E8 890F MOV [EDI],ECX // 此行,下A命令改成mov [edi],eax
001B:0040D2EA C601B8 MOV BYTE PTR [ECX],B8
001B:0040D2ED 41 INC ECX
001B:0040D2EE 8901 MOV [ECX],EAX
001B:0040D2F0 83C104 ADD ECX,04
001B:0040D2F3 66C701FFE0 MOV WORD PTR [ECX],E0FF
001B:0040D2F8 83C102 ADD ECX,02
001B:0040D2FB 898D89040000 MOV [EBP+00000489],ECX
001B:0040D301 83C704 ADD EDI,04
001B:0040D304 EBA3 JMP 0040D2A9
在001B:0040D2E8一行,此时EAX中是getprocadress返回的函数地址,EDI指向的IAT,因此将代码改成mov [edi],eax,这样外壳会将正确
的函数地址填充到IAT结构中。程序运行后,再用ImportREC重建输入表。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -