找回密码
 注册
搜索
热搜: 回贴

手动脱掉Asprotect的壳,(给初学者的)(9千字),Asprotect,脱壳技术

2010-1-30 18:23| 发布者: admin| 查看: 87| 评论: 0|原作者: 冰淇淋


手动脱掉Asprotect的壳,(给初学者的)(9千字),Asprotect,脱壳技术
2008年06月23日 星期一 下午 06:39
已经好久没有写东西了,呵呵,人懒没办法啊,不过我现在在学脱asprotect得壳,研究了几天,

对付些简单得已经没问题了,所以这里写篇文章给初学脱asprotect这冬冬得cracker.

感谢zombieys,blowfish,小球对我的帮助!

目标软件是个叫做icon catcher 3得软件,是抓图标用的



用trw载入软件,然后load,来到了这里:

0167:00401000 6801604D00 PUSH DWORD 004D6001

0167:00401005 E801000000 CALL 0040100B

0167:0004100A C3 RET

上面的那个call是可以用f10带过去的,再按一次f10就来到了上面的ret,然后返回到了下面这个地方:

0167:004D6001 60 PUSHA

0167:004D6002 E803000000 CALL 004D600A

0167:004D6007 E9EB045D45 JMP 45AA64F7

上面的这个call 004d600a是一定要进入的,因为大客们说过这个call相当于是jmp,瞧,call 004d600a

这个地址(004d600a)是不是离此指令的地址(004d6002)很近呢?以后看到这样的地址都要用f8进入,建

议以后跟踪的时候用f8键.

以后跟踪要主意的地方就是,看到程序向上跳的时候,就在跳转指令的下面一行按f9设置断点,返回f5继

续运行,这样一般都能跳过循环

0167:004D60C4 BEE70FD372 MOV ESI,72D30FE7

0167:004D60C9 5E POP ESI

0167:004D60CA 81C32903B24D ADD EBX,4DB20329

0167:004D60D0 80D6DF ADC DH,DF

0167:004D60D3 8919 MOV [ECX],EBX

0167:004D60D5 80CA71 OR DL,71

0167:004D60D8 83E901 SUB ECX,BYTE 01

0167:004D60DB 49 DEC ECX

0167:004D60DC 49 DEC ECX

0167:004D60DD 49 DEC ECX

0167:004D60DE 81E801000000 SUB EAX,01

0167:004D60E4 0F859EFFFFFF JNZ NEAR 004D6088 (JUMP)这个会向"上"跳

0167:004D60EA 68EBFDE75C PUSH DWORD 5CE7FDEB

那个jnz near 004d6008会向上面跳转,所以这时你就应该在他的下面一行,也就是push dword 5ce7fdeb

这里设置一个断点,然后按f5,之后程序就会被中断到这里了.



但是还有下面这种情况要主意!

0167:004D6242 58 POP EAX

0167:004D6243 81EA4EBACE4B SUB EDX,4BCEBA4E

0167:004D6249 0FBFF6 MOVSX ESI,SI

0167:004D624C 81C24ABACE4B ADD EDX,4BCEBA4A

0167:004D6252 8BF7 MOV ESI,EDI

0167:004D6254 81FAACF9FFFF CMP EDX,FFFFF9AC

0167:004D625A 0F8516000000 JNZ NEAR 004D6276 (JUMP)

0167:004D6260 6880C8D167 PUSH DWORD 67D1C880

0167:004D6265 6681C7755D ADD DI,5D75

0167:004D626A 5E POP ESI

0167:004D626B E921000000 JMP 004D6291

0167:004D6270 D6 SALC

虽然jnz near 004d6276是向"下"跳转的,但是当你跳到那里的时候你会发现那里又会有个jmp xxxxx

而且跳转的方向是向上面的,然后你就又会回到上面那段代码,所以这时候你应该在jmp 004d6291那行

设置一个断点,然后f5让程序运行,此时程序又会被中断了:)而且你跳过了那讨厌的循环了,后面像这样

的情况还非常多,一定要注意!

0167:004D6604 8B31 MOV ESI,[ECX]

0167:004D6606 03F2 ADD ESI,EDX

0167:004D6608 E82F000000 CALL 004D663C

0167:004D660D BFA75125B7 MOV EDI,B72551A7

0167:004D6612 3BC7 CMP EAX,EDI

0167:004D6614 7405 JZ 004D661B //瞧这个,刚开始的时候这里是不跳的

0167:004D6616 83C104 ADD ECX,BYTE 04

0167:004D6619 EBE9 JMP SHORT 004D6604 //又是个循环!

0167:004D661B XXXX XXXXXXXXXXXXXXXXXXXXXX //所以在这里设置断点,

后面几乎每个call都要用f8进入,但是如果碰到下面这样的call,你就可以放心大胆的用f10带过去了!

0167:004D64CB FF9560020000 CALL NEAR [EBP 0260] //f10带过!

0167:004D64D1 898575010000 MOV [EBP 0175],EAX

0167:004D64D7 8B9D6C020000 MOV EBX,[EBP 026C]

如果你已经跟踪到上面这段代码的话,就可以按f12直接结束这段代码,然后返回到这里:

0167:00C77001 60 PUSHA

0167:00C77002 E840060000 CALL 00C77647

0167:00C77007 EB44 JMP SHORT 00C7704D



这时你也可以再按一次f12,然后到了这里:

0167:00C77388 8BB575294400 MOV ESI,[EBP 00442975]

0167:00C7738E 33DB XOR EBX,EBX

0167:00C77390 0BC9 OR ECX,ECX

0167:00C77392 741C JZ 00C773B0

0167:00C77394 781A JS 00C773B0

0167:00C77396 AC LODSB

0167:00C77397 3CE8 CMP AL,E8

0167:00C77399 7408 JZ 00C773A3

0167:00C7739B 3CE9 CMP AL,E9

0167:00C7739D 7404 JZ 00C773A3

0167:00C7739F 43 INC EBX

0167:00C773A0 49 DEC ECX

0167:00C773A1 EBED JMP SHORT 00C77390

上面这段代码好像在哪里见过?对了,aspack有相同的一段代码,原来这里就是程序解压缩自身的地方,

相信应该难不到你吧:)如果你很懒,那么就直接f12跳过这里吧!可能要等上几秒中哦~然后就来到了一

个asprotect壳的一个标志性的地方:

0167:00C71044 55 PUSH EBP

0167:00C71045 8BEC MOV EBP,ESP

0167:00C71047 83C4F4 ADD ESP,BYTE -0C

0167:00C7104A E8E120FFFF CALL 00C63130

0167:00C7104F 0F85F72DFFFF JNZ NEAR 00C63E4C

0167:00C71055 E8AE32FFFF CALL 00C64308

0167:00C7105A E8697AFFFF CALL 00C68AC8

0167:00C7105F E8F883FFFF CALL 00C6945C

0167:00C71064 E827AFFFFF CALL 00C6BF90

0167:00C71069 E8DE2DFFFF CALL 00C63E4C

0167:00C7106E 8BE5 MOV ESP,EBP

0167:00C71070 5D POP EBP

0167:00C71071 C20C00 RET 0C

其实要想快速定位到这个地方,还是有捷径的:)这样:

设置一个断点getversionexa,然后运行程序,这时程序会被中断,但是前面两次中断全是在系统中,第三次

中断时就是在程序内部了,这时要用f10慢慢走,几个ret返回后你就到了0167:00C7106E MOV ESP,EBP

这样你就直接在00c71069那一行设置断点吧,是不是很方便?嘿嘿~~~记住最后一个call一定要用f8进入!

进去后一直按f10直到一个ret返回,那时你会看见有很多连续的call,大概是七八个吧.(不知为啥,俺用trw

不能抓取这段代码?)进入最后一个!就到了这儿,

0167:00C6FB80 B8BC39C700 MOV EAX,00C739BC

0167:00C6FB85 BA0A000000 MOV EDX,0A

0167:00C6FB8A E889C7FFFF CALL 00C6C318

0167:00C6FB8F E82CFEFFFF CALL 00C6F9C0

0167:00C6FB94 C3 RET

还是进入最后一个call,一直按f10,直到再次出现两个连续的call,像这样:

0167:00C6FB0D BA04000000 MOV EDX,04

0167:00C6FB12 E859C9FFFF CALL 00C6C470

0167:00C6FB17 E815000000 CALL 00C6FB31

同样还是要进入最后一个call(很有规律是吧:)0167:00C6FB60 FF75FC PUSH DWORD [EBP-04]

0167:00C6FB63 FF75F8 PUSH DWORD [EBP-08]

0167:00C6FB66 8B45F4 MOV EAX,[EBP-0C]

0167:00C6FB69 833800 CMP DWORD [EAX],BYTE 00

0167:00C6FB6C 7402 JZ 00C6FB70

0167:00C6FB6E FF30 PUSH DWORD [EAX]

0167:00C6FB70 FF75F0 PUSH DWORD [EBP-10]

0167:00C6FB73 FF65EC JMP NEAR [EBP-14] //^_^大客们都说看到这个就快到oep了!

0167:00C6FB76 5F POP EDI

但是,如果你想手动跟踪到oep的话还是挺麻烦的,其实用softice加icedump好像就可以直接定位到oep了,不过

俺没试过,呵呵,俺都是跟踪到oep的.因为只有这样才能熟习壳的状况,否则哪天icedump不灵了,就傻了?所以

还是跟我来吧!

0167:00C8321E 5B POP EBX

0167:00C8321F 58 POP EAX

0167:00C83220 0561098106 ADD EAX,06810961

0167:00C83225 5C POP ESP

0167:00C83226 03C3 ADD EAX,EBX

0167:00C83228 8944241C MOV [ESP 1C],EAX

0167:00C8322C 61 POPA //入口点地址

0167:00C8322D FFE0 JMP EAX //跳到程序入口点(OEP)



我这里的入口点是4a0ac4,一定要记住哦,这时在4a0ac4这一行,下命令pedump c:\icdump.exe

然后下命令suspend,运行Imprec1.4,在Attach to an Active Process这个下拉菜单中选择ic.exe

在oep中输入0a0ac4(4a0ac4-400000),点iat autosearch,最后点get imports,然后再autotrace,

然后show invalid,这时发现有五个函数没有被修复,就是zombieys大哥常说的那五个,

1 000A51CC ? 0000 00C6C94C

2 000A52E8 ? 0000 00C6C954

3 000A5324 ? 0000 00C6C914

4 000A536C ? 0000 00C6C944

5 000A5374 ? 0000 00C6C960

这时ctrl n输入u 00c6c94c(因为此时你的ic处于挂起状态,所以可以直接看,否则你得先进入程序凌空!),这时看到的内容如下,

0167:00C6C94C A14036C700 MOV EAX,[00C73640]//**注意这个!

0167:00C6C951 C3 RET

此时用ctrl pageup向上翻几页可以看到如下代码:



0167:00C6C7BA 8BC0 MOV EAX,EAX

0167:00C6C7BC 6A00 PUSH BYTE 00

0167:00C6C7BE E8897CFFFF CALL `KERNEL32!GetModuleHandleA`

0167:00C6C7C3 A34C36C700 MOV [00C7364C],EAX

0167:00C6C7C8 E8977CFFFF CALL `KERNEL32!GetVersion`

0167:00C6C7CD A34436C700 MOV [00C73644],EAX

0167:00C6C7D2 68AC35C700 PUSH DWORD 00C735AC

0167:00C6C7D7 E8907CFFFF CALL `KERNEL32!GetVersionExA`

0167:00C6C7DC E83B7CFFFF CALL `KERNEL32!GetCurrentProcess`

0167:00C6C7E1 A34836C700 MOV [00C73648],EAX

0167:00C6C7E6 E8397CFFFF CALL `KERNEL32!GetCurrentProcessId`

0167:00C6C7EB A35036C700 MOV [00C73650],EAX

0167:00C6C7F0 E81F7CFFFF CALL `KERNEL32!GetCommandLineA`

0167:00C6C7F5 A34036C700 MOV [00C73640],EAX //**呵呵,和上面一样得哟~~

0167:00C6C7FA C3 RET

这些是asprotect壳运行时调用程序将要使用得函数然后将其保存在内存中,这样就使得imprec

不能正确识别这些函数了.

所以呢,第一个未知函数应该是getcommandlinea,

blowfish大哥说第二个应该是lockresource

第三个是getversion

第四个是GetCurrentProcessId

第五个是freeresource(我也不知道为什么?)

最后将这些一一对应得填入imprec中选择fixdump,即可,程序可以运行了,脱壳完毕!

虽然脱壳已经完成,但是我仍然没有能力破解它,听zombieys哥说,这样的程序都是用

注册码来给自身解密的,也就是smc,所以破解起来很难,唉~~也许此次脱壳唯一得到

的就是你可以反汇编它了:(


最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 19:29 , Processed in 0.324458 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部