首页
社区
课程
招聘
[旧帖] [分享]菜鸟脱壳入门篇 0.00雪花
发表于: 2009-7-16 13:12 1755

[旧帖] [分享]菜鸟脱壳入门篇 0.00雪花

2009-7-16 13:12
1755
【使用工具】 Ollydbg1.10b,ImportREC1.6F

【破解平台】 Win2000/XP

手动脱壳的主要步骤是:寻找入口点,转储(dump)程序,修复引入函数表(Import Table)

现在的壳分压缩壳,和加密壳。压缩壳目的是使文件大小变小,便于在网上传播。并有一定的保护作用,你无法反汇编加壳程序。加密壳目的是用各种手段保护软件不被脱壳,跟踪,文件大小不是它的目的,有的甚至变大。

判断加密壳压缩壳和普通程序分别很容易,用Ollydbg载入程序。

没加壳软件无任何提示。

加密壳有些Od载入时会提示压缩,基本上F9运行后,OD提示程序异常。

普通加壳Od载入时一般都会发现,提示软件被加壳,是否继续分析。

还有些是脱壳没有脱干净,Od载入时也提示加壳。

更猛的壳用Od载入就异常,如Acprotect。

关于壳的知识不是一两篇文章就能说清,要经过大量的各种壳的脱壳经验,参考文章。

好,我们先从一个基本的Upx壳入手。

查壳工具

Peid0.91,Fileinfo,Language2000,File Scanner等。

查入口工具。

Peid0.91首推,冲击波(9X)系统专用,Asloader,自己的感觉,程序跨段跳跃点。

脱壳工具。

Ollydbg首选,LoadPe,PEditor,ProcDump等,够用了。

修复引入函数表(Import Table)工具。

Imprec,File Scanner,PEditor,LoadPe,ProcDump,Revirgin等,够用了。

以上的工具都有当然最好,至少得有。

Peid0.91,Fileinfo,PEditor,LoadPe,Imprec,Asloader。

附件中壳为Fi测壳为Upx1.01,Peid这里测不出Upx的压缩版本。

手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。

手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。

用OD载入程序后。

Od提示程序加壳,选不继续分析。

0046AC00 > 60 PUSHAD 停在这里,我们先记住UPX壳的加壳入口第一句是PUSHAD
出口暂时不清楚,为的是今后碰到多层壳有准备。
0046AC01 BE 00104400 MOV ESI,ex1.00441000
0046AC06 8DBE 0000FCFF LEA EDI,DWORD PTR DS:[ESI+FFFC0000]
0046AC0C C787 D0940500 D>MOV DWORD PTR DS:[EDI+594D0],10A125D8
0046AC16 57 PUSH EDI
0046AC17 83CD FF OR EBP,FFFFFFFF
0046AC1A EB 0E JMP SHORT ex1.0046AC2A 跳走
0046AC1C 90 NOP
0046AC1D 90 NOP
0046AC1E 90 NOP
0046AC1F 90 NOP
0046AC20 8A06 MOV AL,BYTE PTR DS:[ESI]
0046AC22 46 INC ESI
0046AC23 8807 MOV BYTE PTR DS:[EDI],AL
0046AC25 47 INC EDI
0046AC26 01DB ADD EBX,EBX
0046AC28 75 07 JNZ SHORT ex1.0046AC31
0046AC2A 8B1E MOV EBX,DWORD PTR DS:[ESI] 到这里。
0046AC2C 83EE FC SUB ESI,-4
0046AC2F 11DB ADC EBX,EBX
0046AC31 ^ 72 ED JB SHORT ex1.0046AC20 这里注意,往回跳。脱壳时记住只能让程序往前运行
0046AC33 B8 01000000 MOV EAX,1 在这里点一下,F4运行到这句继续。
0046AC38 01DB ADD EBX,EBX
0046AC3A 75 07 JNZ SHORT ex1.0046AC43 跳
0046AC3C 8B1E MOV EBX,DWORD PTR DS:[ESI]
0046AC3E 83EE FC SUB ESI,-4
0046AC41 11DB ADC EBX,EBX
0046AC43 11C0 ADC EAX,EAX
0046AC45 01DB ADD EBX,EBX
0046AC47 ^ 73 EF JNB SHORT ex1.0046AC38
0046AC49 75 09 JNZ SHORT ex1.0046AC54 跳
0046AC4B 8B1E MOV EBX,DWORD PTR DS:[ESI]
0046AC4D 83EE FC SUB ESI,-4
0046AC50 11DB ADC EBX,EBX
0046AC52 ^ 73 E4 JNB SHORT ex1.0046AC38
0046AC54 31C9 XOR ECX,ECX
0046AC56 83E8 03 SUB EAX,3
0046AC59 72 0D JB SHORT ex1.0046AC68 跳
0046AC5B C1E0 08 SHL EAX,8
0046AC5E 8A06 MOV AL,BYTE PTR DS:[ESI]
0046AC60 46 INC ESI
0046AC61 83F0 FF XOR EAX,FFFFFFFF
0046AC64 74 74 JE SHORT ex1.0046ACDA
0046AC66 89C5 MOV EBP,EAX
0046AC68 01DB ADD EBX,EBX
0046AC6A 75 07 JNZ SHORT ex1.0046AC73 跳
0046AC6C 8B1E MOV EBX,DWORD PTR DS:[ESI]
0046AC6E 83EE FC SUB ESI,-4
0046AC71 11DB ADC EBX,EBX
0046AC73 11C9 ADC ECX,ECX
0046AC75 01DB ADD EBX,EBX
0046AC77 75 07 JNZ SHORT ex1.0046AC80 跳
0046AC79 8B1E MOV EBX,DWORD PTR DS:[ESI]
0046AC7B 83EE FC SUB ESI,-4
0046AC7E 11DB ADC EBX,EBX
0046AC80 11C9 ADC ECX,ECX
0046AC82 75 20 JNZ SHORT ex1.0046ACA4 跳
0046AC84 41 INC ECX
0046AC85 01DB ADD EBX,EBX
0046AC87 75 07 JNZ SHORT ex1.0046AC90
0046AC89 8B1E MOV EBX,DWORD PTR DS:[ESI]
0046AC8B 83EE FC SUB ESI,-4
0046AC8E 11DB ADC EBX,EBX
0046AC90 11C9 ADC ECX,ECX
0046AC92 01DB ADD EBX,EBX
0046AC94 ^ 73 EF JNB SHORT ex1.0046AC85
0046AC96 75 09 JNZ SHORT ex1.0046ACA1
0046AC98 8B1E MOV EBX,DWORD PTR DS:[ESI]
0046AC9A 83EE FC SUB ESI,-4
0046AC9D 11DB ADC EBX,EBX
0046AC9F ^ 73 E4 JNB SHORT ex1.0046AC85
0046ACA1 83C1 02 ADD ECX,2
0046ACA4 81FD 00F3FFFF CMP EBP,-0D00
0046ACAA 83D1 01 ADC ECX,1
0046ACAD 8D142F LEA EDX,DWORD PTR DS:[EDI+EBP]
0046ACB0 83FD FC CMP EBP,-4
0046ACB3 76 0F JBE SHORT ex1.0046ACC4 这一句可以跳出这个循环。
0046ACB5 8A02 MOV AL,BYTE PTR DS:[EDX]
0046ACB7 42 INC EDX
0046ACB8 8807 MOV BYTE PTR DS:[EDI],AL
0046ACBA 47 INC EDI
0046ACBB 49 DEC ECX
0046ACBC ^ 75 F7 JNZ SHORT ex1.0046ACB5 注意,往回跳。
0046ACBE ^ E9 63FFFFFF JMP ex1.0046AC26 这里也往回跳。
0046ACC3 90 NOP
0046ACC4 8B02 MOV EAX,DWORD PTR DS:[EDX] 呵,在这里点一下,F4到这里。
0046ACC6 83C2 04 ADD EDX,4
0046ACC9 8907 MOV DWORD PTR DS:[EDI],EAX
0046ACCB 83C7 04 ADD EDI,4
0046ACCE 83E9 04 SUB ECX,4
0046ACD1 ^ 77 F1 JA SHORT ex1.0046ACC4 往回跳。
0046ACD3 01CF ADD EDI,ECX
0046ACD5 ^ E9 4CFFFFFF JMP ex1.0046AC26 这里也往回跳
0046ACDA 5E POP ESI 呵,在这里点一下,F4到这里。
0046ACDB 89F7 MOV EDI,ESI
0046ACDD B9 C8230000 MOV ECX,23C8
0046ACE2 8A07 MOV AL,BYTE PTR DS:[EDI]
0046ACE4 47 INC EDI
0046ACE5 2C E8 SUB AL,0E8
0046ACE7 3C 01 CMP AL,1
0046ACE9 ^ 77 F7 JA SHORT ex1.0046ACE2 往回跳。
0046ACEB 803F 0D CMP BYTE PTR DS:[EDI],0D在这里点一下,F4到这里。
0046ACEE ^ 75 F2 JNZ SHORT ex1.0046ACE2
0046ACF0 8B07 MOV EAX,DWORD PTR DS:[EDI]
0046ACF2 8A5F 04 MOV BL,BYTE PTR DS:[EDI+4]
0046ACF5 66:C1E8 08 SHR AX,8
0046ACF9 C1C0 10 ROL EAX,10
0046ACFC 86C4 XCHG AH,AL
0046ACFE 29F8 SUB EAX,EDI
0046AD00 80EB E8 SUB BL,0E8
0046AD03 01F0 ADD EAX,ESI
0046AD05 8907 MOV DWORD PTR DS:[EDI],EAX
0046AD07 83C7 05 ADD EDI,5
0046AD0A 89D8 MOV EAX,EBX
0046AD0C ^ E2 D9 LOOPD SHORT ex1.0046ACE7 这是个循环,往回跳。
0046AD0E 8DBE 00700600 LEA EDI,DWORD PTR DS:[ESI+67000]在这里点一下,F4到这里。
0046AD14 8B07 MOV EAX,DWORD PTR DS:[EDI]
0046AD16 09C0 OR EAX,EAX
0046AD18 74 3C JE SHORT ex1.0046AD56
0046AD1A 8B5F 04 MOV EBX,DWORD PTR DS:[EDI+4]
0046AD1D 8D8430 BCA90600 LEA EAX,DWORD PTR DS:[EAX+ESI+6A9BC]
0046AD24 01F3 ADD EBX,ESI
0046AD26 50 PUSH EAX
0046AD27 83C7 08 ADD EDI,8
0046AD2A FF96 5CAA0600 CALL DWORD PTR DS:[ESI+6AA5C]

到这里我们看到信息框中写有

0046AD2A FF96 5CAA0>call dword ptr ds:[esi+6AA5C] KERNEL32.LoadLibraryA

如果我们直接下断点Bp LoadLibraryA,F9运行程序,Ctrl+F9返回到这句不就省很多事,这里大家以后会明白的,脱大量的壳后,我们先有一个概念。

0046AD30 95 XCHG EAX,EBP
0046AD31 8A07 MOV AL,BYTE PTR DS:[EDI]
0046AD33 47 INC EDI
0046AD34 08C0 OR AL,AL
0046AD36 ^ 74 DC JE SHORT ex1.0046AD14
0046AD38 89F9 MOV ECX,EDI
0046AD3A 57 PUSH EDI
0046AD3B 48 DEC EAX
0046AD3C F2:AE REPNE SCAS BYTE PTR ES:[EDI]
0046AD3E 55 PUSH EBP
0046AD3F FF96 60AA0600 CALL DWORD PTR DS:[ESI+6AA60]

到这里我们看到信息框中写有,GetProcAddress这里也是好断点啊。

0046AD3F FF96 60AA0>call dword ptr ds:[esi+6AA60] ; KERNEL32.GetProcAddress

0046AD45 09C0 OR EAX,EAX
0046AD47 74 07 JE SHORT ex1.0046AD50
0046AD49 8903 MOV DWORD PTR DS:[EBX],EAX
0046AD4B 83C3 04 ADD EBX,4
0046AD4E ^ EB E1 JMP SHORT ex1.0046AD31 往回跳。
0046AD50 FF96 64AA0600 CALL DWORD PTR DS:[ESI+6AA64]
0046AD56 61 POPAD 关键点,入口就在附近。 和PUSHAD对应。在这里点一下,F4到这里。
0046AD57 ^ E9 98CBFEFF JMP ex1.004578F4 跳到入口。程序跨段跳跃。
0046AD5C ^ 74 AD JE SHORT ex1.0046AD0B
0046AD5E 46 INC ESI
.................................................

程序加壳段地址一直在0046XXXX突然跳转到0045XXXX段,跨段跳跃时,一般都是在内存中脱壳完毕,准备运行程序,手动脱壳就是要在入口将程序Dump出来。转到入口时一般都有Popad语句和开始的PUSHAD对应。
.................................................

004578F4 55 PUSH EBP 我们再这里用Od的Dump插件直接脱壳。

见截图.

004578F5 8BEC MOV EBP,ESP004578F7 83C4 F4 ADD ESP,-0C
004578FA B8 AC774500 MOV EAX,ex1.004577AC
004578FF E8 2CE6FAFF CALL ex1.00405F30
00457904 A1 40954500 MOV EAX,DWORD PTR DS:[459540]
00457909 8B00 MOV EAX,DWORD PTR DS:[EAX]
0045790B E8 78A1FEFF CALL ex1.00441A88
00457910 8B0D 10964500 MOV ECX,DWORD PTR DS:[459610] ; ex1.0045A820
00457916 A1 40954500 MOV EAX,DWORD PTR DS:[459540]
0045791B 8B00 MOV EAX,DWORD PTR DS:[EAX]
0045791D 8B15 24744500 MOV EDX,DWORD PTR DS:[457424] ; ex1.00457470
00457923 E8 78A1FEFF CALL ex1.00441AA0
00457928 A1 40954500 MOV EAX,DWORD PTR DS:[459540]
0045792D 8B00 MOV EAX,DWORD PTR DS:[EAX]
0045792F E8 ECA1FEFF CALL ex1.00441B20
00457934 E8 8BBEFAFF CALL ex1.004037C4
00457939 8D40 00 LEA EAX,DWORD PTR DS:[EAX]

总结:

Upx壳直接Ctrl+F找Popad,向下一个jmp跳到入口,

命令行下断点 bp GetProcAddress

F9运行,Ctrl+F9返回到程序,向下到Popad处的jmp跳到入口.

在入口处Dump程序.

UPX脱壳断点

bp LoadLibraryA

bp GetProcAddress

UPX加壳入口第一句是PUSHAD

出口关键字

POPAD

一般经过JMP跨段跳跃到入口处.

我们以后每手动脱一个壳就总结一次.

脱壳后发现程序不能运行,这时需要用Imprec修复引入函数表(Import Table)

在Oep处填000578F4,点IT自动搜索,然后点获输入信息,看到输入表全部有效,点修复抓取文件按钮,选择Dump的文件,修复它,正常运行,这里不用备份,Imprec自动帮你做了

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发  自己的
2009-7-16 13:56
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
板凳我也要自己坐
2009-7-16 13:57
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好东西  
别沉了
2009-7-16 16:26
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
5
自己总结的嘛?

如果是,鼓励一下。
2009-7-16 17:07
0
雪    币: 234
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
的确,不过自己也顶得太多了
2009-7-16 19:49
0
雪    币: 1099
活跃值: (100)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好东西!我才开学,以后多多交流哦!
2009-7-17 00:29
0
雪    币: 51
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主辛苦了,学习一下。
我也是个菜鸟。
这两天一直在寻找脱壳高手。
惆怅啊
2009-7-17 02:15
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我这两天 主攻ASPack 2.12 -> Alexey Solodovnikov  在破解一外挂  壳已经脱好了 现在在爆破网络验证信息 和注册  搞定后发给大家分享
2009-7-19 17:01
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
别沉了呀!!!!!!
2009-7-20 20:00
0
雪    币: 358
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
什么挂???我也有兴趣看下
2009-7-20 21:00
0
游客
登录 | 注册 方可回帖
返回
//