这壳有脱壳机了,但是我是为了学习. 当然之前肯定有人发过.
不过我再发一次 当是我的笔记吧.
目标是这个
http://bbs.pediy.com/attachment. ... 15&d=1239364186
经过 sessiondiy大虾的指点 我终于都弄明白了.
(我OD调试选项是忽略所有异常)
首先找OEP
这个就不多说了 区段2内存访问断点就行,可以找到OEP为00404356.
到OEP后IAT没修复,随便找了个无效的004180a4先记录下来.
重新载入,
he 00404356 (oep) f9运行.
中断在这 0040e0a3
/*42E07F*/ POP EBP
/*42E080*/ LEA EAX,DWORD PTR SS:[EBP+46]
/*42E083*/ PUSH EAX
/*42E084*/ XOR EAX,EAX
/*42E086*/ PUSH DWORD PTR FS:[EAX]
/*42E089*/ MOV DWORD PTR FS:[EAX],ESP
/*42E08C*/ INT3
/*42E08D*/ NOP
/*42E08E*/ MOV EAX,EAX
/*42E090*/ STC
/*42E091*/ NOP
/*42E092*/ LEA EAX,DWORD PTR DS:[EBX*2+1234]
/*42E099*/ CLC
/*42E09A*/ NOP
/*42E09B*/ SHR EBX,5
/*42E09E*/ CLD
/*42E09F*/ NOP
/*42E0A0*/ ROL EAX,7
/*42E0A3*/ NOP 中断在这.
/*42E0A4*/ NOP
/*42E0A5*/ XOR EBX,EBX
/*42E0A7*/ DIV EBX
/*42E0A9*/ POP DWORD PTR FS:[0]
/*42E0AF*/ ADD ESP,4
/*42E0B2*/ MOV SI,4647
/*42E0B6*/ MOV DI,4A4D
/*42E0BA*/ MOV AL,BYTE PTR SS:[EBP+99]
/*42E0C0*/ JMP CrackME.0042E161
/*42E0C0*/ JMP CrackME.0042E161
/*42E0C5*/ MOV EAX,DWORD PTR SS:[ESP+4]
/*42E0C9*/ MOV ECX,DWORD PTR SS:[ESP+C]
/*42E0CD*/ INC DWORD PTR DS:[ECX+B8]
/*42E0D3*/ MOV EAX,DWORD PTR DS:[EAX]
/*42E0D5*/ CMP EAX,C0000094
/*42E0DA*/ JNZ SHORT CrackME.0042E100
/*42E0DC*/ INC DWORD PTR DS:[ECX+B8]
/*42E0E2*/ XOR EAX,EAX
/*42E0E4*/ AND DWORD PTR DS:[ECX+4],EAX
/*42E0E7*/ AND DWORD PTR DS:[ECX+8],EAX
/*42E0EA*/ AND DWORD PTR DS:[ECX+C],EAX
/*42E0ED*/ AND DWORD PTR DS:[ECX+10],EAX
/*42E0F0*/ AND DWORD PTR DS:[ECX+14],FFFF0FF0
/*42E0F7*/ AND DWORD PTR DS:[ECX+18],0DC00
/*42E0FE*/ JMP SHORT CrackME.0042E160
/*42E100*/ CMP EAX,80000004
/*42E105*/ JE SHORT CrackME.0042E113
/*42E107*/ CMP EAX,80000003
/*42E10C*/ JE SHORT CrackME.0042E120
/*42E10E*/ PUSH 1
/*42E110*/ POP EAX
/*42E111*/ JMP SHORT CrackME.0042E160
/*42E113*/ CALL CrackME.0042E119
/*42E118*/ ADD EBX,DWORD PTR DS:[EAX-2]
/*42E11B*/ ADD BYTE PTR DS:[EBX],CH
/*42E11D*/ SHR BL,40
/*42E120*/ MOV EAX,DWORD PTR DS:[ECX+B4]
/*42E126*/ LEA EAX,DWORD PTR DS:[EAX+24]
/*42E129*/ MOV DWORD PTR DS:[ECX+4],EAX
/*42E12C*/ MOV EAX,DWORD PTR DS:[ECX+B4]
/*42E132*/ LEA EAX,DWORD PTR DS:[EAX+1F]
/*42E135*/ MOV DWORD PTR DS:[ECX+8],EAX
/*42E138*/ MOV EAX,DWORD PTR DS:[ECX+B4]
/*42E13E*/ LEA EAX,DWORD PTR DS:[EAX+1A]
/*42E141*/ MOV DWORD PTR DS:[ECX+C],EAX
/*42E144*/ MOV EAX,DWORD PTR DS:[ECX+B4]
/*42E14A*/ LEA EAX,DWORD PTR DS:[EAX+11]
/*42E14D*/ MOV DWORD PTR DS:[ECX+10],EAX
/*42E150*/ XOR EAX,EAX
/*42E152*/ AND DWORD PTR DS:[ECX+14],FFFF0FF0
/*42E159*/ MOV DWORD PTR DS:[ECX+18],155
/*42E160*/ RET
这段代码真是经典代码
具体意思如下:
若是 INT 3 则 占用 Dr0~Dr3 , 值为 42E090'42E099'42E09E'42E0A3
若是 80000004 则 byte[0042E118] 加 1
若是 除零 , 则清除 Dr0~Dr3
在过了int3异常后,占用 Dr0~Dr3 , 值为 42E090'42E099'42E09E'42E0A3
四个调试寄存器全部被占用,因此之前下的硬件断点都失效了。
除非过了除0异常以后再下硬件断点 才可以。
并且他还保证了byte[0042E118]=4 必须等于4,才能正确解码,那么只有过了这段代码后把byte[0042E118]等于4才可以下硬件断点。
那我就在
42e0a9 恢复seh链的地方.
/*42E0A9*/ POP DWORD PTR FS:[0]
/*42E0AF*/ ADD ESP,4
/*42E0B2*/ MOV SI,4647
42e0a9 处下f2,F9后删除F2,并且把byte[0042E118]=4,这样就过了断点检测了.
现在再dd 004180a4 下内存写入断点 F9执行
这时要边按F9边看数据窗口和地址窗口.
我也记不清按了几次F9
到了这里
/*42F4E5*/ MOV DWORD PTR DS:[EAX],ECX
数据窗口是这样的
ECX=003F0011
DS:[004180A4]=0001D1DE
这时正是加密完填充的时候.
可是我们当然不能让他加密啊
那就看代码,看哪里能跳过这个地方把.
我往上拉着看,见有跳转的 我鼠标就按上去 看看他跳到哪里
最终我找到了这里
/*42F41E*/ JE CrackME.0042F4F3
如果这个跳转每次都实现他就能跳过加密,哈哈
那把他改为jmp不就可以了吗.
好吧 重新来过.
和前面同样的步骤
直到过了 断点检测后 我再he 42f41e f9到了后我把je改为jmp 删除该断点
再he 00404356 (oep)
F9
好了现在可以DUMP了
完了再用ImportREC.OEP填上4356 自动搜索IAT和大小.
最后点获取输入表, 哈哈全是有效的.修复转储文件后 也能正常运行了.
这壳终于被我脱掉了
真不好脱啊.
这个壳让我学习到了 ANTI断点的精彩代码.
再此再次感谢伟大的 sessiondiy.
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课