手动脱壳进阶第五篇yoda's Crypter V1.2
软件后用PEID测NOTEPAD.EXE的壳为yoda's cryptor 1.2
我们把Od中的选项-调试选项-异常选项卡中
除了忽略在内存访问异常不打勾,其余的全部打勾,请检查自己的Od设置。因为Yoda就一次内存异常是最后一次异常,其余的异常全部让OD忽略。
用OD载入程序后。
确定一个入口点警告,Od提示程序加壳,选不继续分析,插件隐藏OD.
0040D060 > 60 PUSHAD 外壳入口。
0040D061 E8 00000000 CALL NOTEPAD.0040D066
0040D066 5D POP EBP
0040D067 81ED F31D4000 SUB EBP,NOTEPAD.00401DF3
0040D06D B9 7B090000 MOV ECX,97B
0040D072 8DBD 3B1E4000 LEA EDI,DWORD PTR SS:[EBP+401E3B]
0040D078 8BF7 MOV ESI,EDI
0040D07A AC LODS BYTE PTR DS:[ESI]
0040D07B F8 CLC
0040D07C F9 STC
0040D07D 34 49 XOR AL,49
0040D07F C0C8 18 ROR AL,18
0040D082 EB 01 JMP SHORT NOTEPAD.0040D085
0040D084 E8 EB01E82C CALL 2D28D274
0040D089 DD ??? ; 未知命令
..................................................................
F9运行,确定一个入口警告。
内存异常。
0040D769 0000 ADD BYTE PTR DS:[EAX],AL 最后一次Seh异常。
0040D76B 0000 ADD BYTE PTR DS:[EAX],AL
0040D76D 0000 ADD BYTE PTR DS:[EAX],AL
0040D76F 0000 ADD BYTE PTR DS:[EAX],AL
0040D771 0000 ADD BYTE PTR DS:[EAX],AL
0040D773 0000 ADD BYTE PTR DS:[EAX],AL
0040D775 0000 ADD BYTE PTR DS:[EAX],AL
0040D777 0000 ADD BYTE PTR DS:[EAX],AL
0040D779 0000 ADD BYTE PTR DS:[EAX],AL
0040D77B 0000 ADD BYTE PTR DS:[EAX],AL
0040D77D 0000 ADD BYTE PTR DS:[EAX],AL
0040D77F 0000 ADD BYTE PTR DS:[EAX],AL
0040D781 0000 ADD BYTE PTR DS:[EAX],AL
0040D783 0000 ADD BYTE PTR DS:[EAX],AL
0040D785 0000 ADD BYTE PTR DS:[EAX],AL
0040D787 0000 ADD BYTE PTR DS:[EAX],AL
..................................................................
看堆栈。
0012FFBC 0012FFE0 指针到下一个 SEH 记录
0012FFC0 0040D70C SE 句柄 去出口下断点。
0012FFC4 77E67903 返回到 KeRnEl32.77E67903
断在这里。
0040D70C 55 PUSH EBP
0040D70D 8BEC MOV EBP,ESP
0040D70F 57 PUSH EDI
0040D710 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
0040D713 8BB8 C4000000 MOV EDI,DWORD PTR DS:[EAX+C4]
0040D719 FF37 PUSH DWORD PTR DS:[EDI]
0040D71B 33FF XOR EDI,EDI
0040D71D 64:8F07 POP DWORD PTR FS:[EDI] 这里很容易成为特征码,下面的pop edi中就是oep,和EXE Stealth2.72,仙剑早期版本一摸一样。
0040D720 8380 C4000000 0>ADD DWORD PTR DS:[EAX+C4],8
0040D727 8BB8 A4000000 MOV EDI,DWORD PTR DS:[EAX+A4]
0040D72D C1C7 07 ROL EDI,7
0040D730 89B8 B8000000 MOV DWORD PTR DS:[EAX+B8],EDI
0040D736 B8 00000000 MOV EAX,0
0040D73B 5F POP EDI 这里是Oep的唯一线索。Oep计算处在SEH处理过程中早就过了,我们等会再分析。我们看到Edi中存放的是4010cc,记事本的Oep,那我们去4010cc下断点吧。
0040D73C C9 LEAVE
0040D73D C3 RETN 通过这里后你将回到系统领空,迷失在代码中,不久程序运行。
直接Ctrl+G去4010cc下断点。
004010CC 55 PUSH EBP 来到这里,我们再这里用Od的Dump插件直接脱壳。
004010CD 8BEC MOV EBP,ESP
004010CF 83EC 44 SUB ESP,44
004010D2 56 PUSH ESI
004010D3 FF15 E4634000 CALL DWORD PTR DS:[4063E4]
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]
004010DD 3C 22 CMP AL,22
004010DF 75 1B JNZ SHORT 004010FC
004010E1 56 PUSH ESI
004010E2 FF15 F4644000 CALL DWORD PTR DS:[4064F4]
004010E8 8BF0 MOV ESI,EAX
004010EA 8A00 MOV AL,BYTE PTR DS:[EAX]
004010EC 84C0 TEST AL,AL
重建输入表时,插件有两个选项。Method2重建输入表很快,脱壳后运行率高。Method1重建输入表慢,脱壳后运行率较低。本程序用Method1重建输入表后程序可直接运行。
如果你提前看过我的仙剑脱壳过程,你是不是觉得它们很像呢?
我们这次详细跟踪一次。
在手动脱壳进阶第四篇EXE Stealth2.72我已经讲的很详细,yoda和EXE Stealth2.72过程几乎一样,这次快一些。Btw:详细跟踪要设置忽略全部异常.
载入程序,隐藏OD。无特别提示,一律F8走。
0040D060 > 60 PUSHAD
0040D061 E8 00000000 CALL NOTEPAD.0040D066 F7过。
0040D066 5D POP EBP
0040D067 81ED F31D4000 SUB EBP,NOTEPAD.00401DF3
0040D06D B9 7B090000 MOV ECX,97B
0040D072 8DBD 3B1E4000 LEA EDI,DWORD PTR SS:[EBP+401E3B]
0040D078 8BF7 MOV ESI,EDI
0040D07A AC LODS BYTE PTR DS:[ESI]
0040D07B F8 CLC
0040D07C F9 STC
0040D07D 34 49 XOR AL,49
0040D07F C0C8 18 ROR AL,18
0040D082 EB 01 JMP SHORT NOTEPAD.0040D085
0040D085 /EB 01 JMP SHORT NOTEPAD.0040D088
0040D088 2C DD SUB AL,0DD
0040D08A 2AC1 SUB AL,CL
0040D08C 04 6F ADD AL,6F
0040D08E F9 STC
0040D08F C0C8 55 ROR AL,55 ; 移动常数超出 1..31 的范围
0040D092 2AC1 SUB AL,CL
0040D094 F9 STC
0040D095 EB 01 JMP SHORT NOTEPAD.0040D098
0040D098 90 NOP
0040D099 2C AF SUB AL,0AF
0040D09B 34 38 XOR AL,38
0040D09D 02C1 ADD AL,CL
0040D09F F8 CLC
0040D0A0 2AC1 SUB AL,CL
0040D0A2 F8 CLC
0040D0A3 2AC1 SUB AL,CL
0040D0A5 2C 69 SUB AL,69
0040D0A7 FEC8 DEC AL
0040D0A9 2AC1 SUB AL,CL
0040D0AB AA STOS BYTE PTR ES:[EDI]
0040D0AC ^ E2 CC LOOPD SHORT NOTEPAD.0040D07A
0040D0AE E1 29 LOOPDE SHORT NOTEPAD.0040D0D9 F4到这里语句变化。
0040D0AE 8B4424 20 MOV EAX,DWORD PTR SS:[ESP+20] ; KeRnEl32.77E67903
0040D0B2 40 INC EAX
0040D0B3 78 0A JS SHORT NOTEPAD.0040D0BF
0040D0B5 C785 78254000 0>MOV DWORD PTR SS:[EBP+402578],1
0040D0BF 8D85 ED1D4000 LEA EAX,DWORD PTR SS:[EBP+401DED]
0040D0C5 B9 2A060000 MOV ECX,62A
0040D0CA E8 41020000 CALL NOTEPAD.0040D310
0040D0CF 8985 74254000 MOV DWORD PTR SS:[EBP+402574],EAX
0040D0D5 8B85 6C254000 MOV EAX,DWORD PTR SS:[EBP+40256C]
0040D0DB 83E0 01 AND EAX,1
0040D0DE 74 40 JE SHORT NOTEPAD.0040D120
0040D120 8B85 64254000 MOV EAX,DWORD PTR SS:[EBP+402564] ; NOTEPAD.00400000
0040D126 0340 3C ADD EAX,DWORD PTR DS:[EAX+3C]
0040D129 05 80000000 ADD EAX,80
0040D12E 8B08 MOV ECX,DWORD PTR DS:[EAX]
0040D130 038D 64254000 ADD ECX,DWORD PTR SS:[EBP+402564]
0040D136 83C1 10 ADD ECX,10
0040D139 8B01 MOV EAX,DWORD PTR DS:[ECX]
0040D13B 0385 64254000 ADD EAX,DWORD PTR SS:[EBP+402564]
0040D141 8B18 MOV EBX,DWORD PTR DS:[EAX]
0040D143 899D F0264000 MOV DWORD PTR SS:[EBP+4026F0],EBX
0040D149 83C0 04 ADD EAX,4
0040D14C 8B18 MOV EBX,DWORD PTR DS:[EAX]
0040D14E 899D F4264000 MOV DWORD PTR SS:[EBP+4026F4],EBX
0040D154 8D85 F8264000 LEA EAX,DWORD PTR SS:[EBP+4026F8]
.......................................................................
0040D1E6 E8 1F000000 CALL NOTEPAD.0040D20A
0040D1EB 8985 90274000 MOV DWORD PTR SS:[EBP+402790],EAX
0040D1F1 8D85 94274000 LEA EAX,DWORD PTR SS:[EBP+402794]
0040D1F7 E8 0E000000 CALL NOTEPAD.0040D20A
0040D1FC 8985 A0274000 MOV DWORD PTR SS:[EBP+4027A0],EAX
0040D202 8D85 A01F4000 LEA EAX,DWORD PTR SS:[EBP+401FA0]
0040D208 50 PUSH EAX
0040D209 C3 RETN 返回。
0040D213 F785 6C254000 1>TEST DWORD PTR SS:[EBP+40256C],10
0040D21D 74 37 JE SHORT NOTEPAD.0040D256 这里,一个大循环出口,没跳转,回车直接去哪里,跑飞再说。
0040D21F 64:FF35 3000000>PUSH DWORD PTR FS:[30]
0040D256 8BBD 64254000 MOV EDI,DWORD PTR SS:[EBP+402564] F4到达这里.
0040D25C 037F 3C ADD EDI,DWORD PTR DS:[EDI+3C]
0040D25F 8BB5 64254000 MOV ESI,DWORD PTR SS:[EBP+402564]
0040D265 8B4F 54 MOV ECX,DWORD PTR DS:[EDI+54]
0040D268 8D85 D2274000 LEA EAX,DWORD PTR SS:[EBP+4027D2]
0040D26E 50 PUSH EAX
0040D26F 6A 04 PUSH 4
0040D271 51 PUSH ECX
0040D272 FFB5 64254000 PUSH DWORD PTR SS:[EBP+402564]
0040D278 FF95 2D274000 CALL DWORD PTR SS:[EBP+40272D]
0040D27E F785 6C254000 0>TEST DWORD PTR SS:[EBP+40256C],8
0040D288 0F84 A7000000 JE NOTEPAD.0040D335 又一个大循环出口,没跳转,回车直接去哪里,跑飞再说。
0040D335 8B85 64254000 MOV EAX,DWORD PTR SS:[EBP+402564] F4到达这里.
0040D33B BB 01000000 MOV EBX,1
0040D340 E8 08000000 CALL NOTEPAD.0040D34D 变形,注意如果你太小心F7过,会绕圈子,F8直接走.
0040D345 8D85 A3214000 LEA EAX,DWORD PTR SS:[EBP+4021A3]
0040D34B 50 PUSH EAX
0040D34C C3 RETN
0040D416 8B9D 64254000 MOV EBX,DWORD PTR SS:[EBP+402564] ; NOTEPAD.00400000 基地址400000
0040D41C 039D 68254000 ADD EBX,DWORD PTR SS:[EBP+402568] 将堆栈中值10cc+400000=4010cc 得出记事本的Oep.
0040D422 C1CB 07 ROR EBX,7 计算出Oep.
0040D425 895C24 10 MOV DWORD PTR SS:[ESP+10],EBX
0040D429 8D9D 99244000 LEA EBX,DWORD PTR SS:[EBP+402499]
0040D42F 895C24 1C MOV DWORD PTR SS:[ESP+1C],EBX
0040D433 8BBD 64254000 MOV EDI,DWORD PTR SS:[EBP+402564]
0040D439 037F 3C ADD EDI,DWORD PTR DS:[EDI+3C]
0040D43C 8B9F C0000000 MOV EBX,DWORD PTR DS:[EDI+C0]
0040D442 83FB 00 CMP EBX,0
0040D445 74 0F JE SHORT NOTEPAD.0040D456
0040D447 039D 64254000 ADD EBX,DWORD PTR SS:[EBP+402564]
......................................................................
换成其它程序加壳,可以用如下三句作为特征码,知道是Oep值。
0040D416 8B9D 64254000 MOV EBX,DWORD PTR SS:[EBP+402564] ; NOTEPAD.00400000 基地址400000
0040D41C 039D 68254000 ADD EBX,DWORD PTR SS:[EBP+402568] 将堆栈中值10cc+400000=4010cc 得出记事本Oep.
0040D422 C1CB 07 ROR EBX,7 计算出Oep.
F8步过0040D422 C1CB 07 ROR EBX,7 计算出Oep这句.
这时我们可以Ctrl+G直接去4010cc下内存访问断点脱壳,你必须设置忽略内存异常,不然遇到Seh异常程序直接退出导致跟踪失败,粗略跟踪已经知道.
OK,在4010CC内存处下 内存访问断点,F9运行,断在OEP处!
004010CC 55 PUSH EBP //在这儿用OllyDump插件直接DUMP
004010CD 8BEC MOV EBP,ESP
004010CF 83EC 44 SUB ESP,44
004010D2 56 PUSH ESI
004010D3 FF15 E4634000 CALL DWORD PTR DS:[4063E4]
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]
004010DD 3C 22 CMP AL,22
004010DF 75 1B JNZ SHORT 004010FC
004010E1 56 PUSH ESI
004010E2 FF15 F4644000 CALL DWORD PTR DS:[4064F4]
004010E8 8BF0 MOV ESI,EAX
004010EA 8A00 MOV AL,BYTE PTR DS:[EAX]
————————————————————————
运行ImportREC,选择这个进程。把OEP改为000010CC,点IT AutoSearch,点“Get Import”,用“追踪层次1”全部修复,FixDump,正常运行!
这个壳和exe steal很象 但我用了 2次断点法 sfx法 不行 还是用原来的方法 esp法 加搜索 ror bx 7
就到oep
我还发现个方法
加密壳找Oep
对于加密壳,我的方法一般是用OD载入,钩掉所有异常(不忽略任何异常,除了忽略在KERNEL32 中的内存访问异常打勾。有时由于异常过多可以适当忽略一些异常),运行,数着用了多少次Shift+F9程序运行,显然最后一次异常后,程序会从壳跳到OEP开始执行,这就是我们寻找OEP的一个关键,如果程序 Shift+F9后直接退出,很明显加密壳检测调试器,最简单的应付方法就是用OD插件隐藏OD。
单步异常是防止我们一步步跟踪程序,即F8,F7,F4等,Int3中断是检测调试器用的,仅在Win9x系统中有效,2000/XP就会出现断点异常,其它的异常主要是干扰调试。这一系列的异常虽然干扰我们调试,但也给我们指明了一条通路,就是Shift+F9略过所有异常,然后找到最后一处异常,再它的恢复异常处下断点,跟踪到脱壳入口点。
确定从所有Seh异常中走出来
我讲下我的步骤把
1 先设置忽略 用od 原来的设置 不变 既 只在 忽律内存异常打沟 其他不动
2 f9运行小跑一段 被中断 SHIFT+F9
来到这
0040D769 0000 ADD BYTE PTR DS:[EAX],AL
0040D76B 0000 ADD BYTE PTR DS:[EAX],AL
0040D76D 0000 ADD BYTE PTR DS:[EAX],AL
0040D76F 0000 ADD BYTE PTR DS:[EAX],AL
这个时候的 堆栈口写这
0013FFBC 0013FFE0 指向下一个 SEH 记录的指针
0013FFC0 0040D70C SE处理程序 *****这就是我们要的内存地址
0013FFC4 7C816D4F 返回到 kernel32.7C816D4F
0013FFC8 7C930738 ntdll.7C930738
0013FFCC FFFFFFFF
讲个个人经验 不是所以机密壳都是按shift+f9 按到程序飞 再重启动 按n-1次 shift+f9
这里 因该是以 seh 处理完为依据的 不是以按多少次shift+f9到飞 为依据 看了我前面2篇进阶的
个人总结 就明白道理了
这个程序也是这样
我再按shift+f9 程序还是没飞 但这个时候 堆栈口前面的数据就没有 处理seh 的地址了
所以这里就是最后一次 处理异常seh 的位置
crtl +g 来到这个内存 0040D70C 按f2 段下来 再来 SHIF+f9
0040D70C 55 PUSH EBP 来到这里 有点象 oep哦 但不是
0040D70D 8BEC MOV EBP,ESP
0040D70F 57 PUSH EDI
0040D710 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
。。。。
0040D730 89B8 B8000000 MOV DWORD PTR DS:[EAX+B8],EDI
0040D736 B8 00000000 MOV EAX,0
0040D73B 5F POP EDI f8到这里就知道ope拉 程序快retn了最后弹出来的 堆栈数据 di 里就是oep拉 这里是 4010cc
0040D73C C9 LEAVE
0040D73D C3 RETN
yoda ‘cypter也是这样处理 属于 seh 很少的壳 一次 seh