首页
社区
课程
招聘
[原创]手脱ASProtect第二篇---OEP 抽取
发表于: 2006-4-12 09:14 17370

[原创]手脱ASProtect第二篇---OEP 抽取

2006-4-12 09:14
17370
【脱壳文件】图标制作工具
【下载地址】http://iconutils.com/iconxp/iconxp.zip
【加壳方式】ASProtect 2.2 SKE -> Alexey Solodovnikov
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教
【调试环境】:Win2003、OllyDBD、PEiD、LordPE、ImportREC
【脱壳过程】:一鼓作气,再脱一个带OEP抽取的ASProtect吧。
        一、避开加密,得到完整IAT
       这个程序没有任何异常,F9一下,程序界面全出来了,应该是2.2的版本了吧。那我们换个方法,OD忽略所有异常,bp GetModuleHandleA,过两次后取消断点,Alt+F9返回。
00F9E4AC    85C0            TEST EAX,EAX                             ; kernel32.7C800000
00F9E4AE    75 07           JNZ SHORT 00F9E4B7
00F9E4B0    53              PUSH EBX
00F9E4B1    FF95 F0314400   CALL DWORD PTR SS:[EBP+4431F0]
00F9E4B7    8985 4D294400   MOV DWORD PTR SS:[EBP+44294D],EAX
00F9E4BD    C785 51294400 0>MOV DWORD PTR SS:[EBP+442951],0
00F9E4C7    8B95 D8304400   MOV EDX,DWORD PTR SS:[EBP+4430D8]
向下找到这里:
……
00F9E5C9    C2 0C00         RETN 0C
00F9E5CC    68 00000000     PUSH 0
00F9E5D1    C3              RETN       //在这里F4下来

F7一下到达壳的代码部分(此法来自LOOVBOOM的ASProtect 2.x脱壳系列)
搜索一下83,C4,28,5D,5F,5E,5B,C3 ,有两处,在第二处下断点
00F8887A    8D5424 04       LEA EDX,DWORD PTR SS:[ESP+4]
00F8887E    E8 B1750000     CALL 00F8FE34
00F88883    E8 5C700000     CALL 00F8F8E4
00F88888    8BC3            MOV EAX,EBX
00F8888A    E8 61A3FEFF     CALL 00F72BF0
00F8888F    E8 10F0FFFF     CALL 00F878A4     //这里进去
00F88894    83C4 28         ADD ESP,28
00F88897    5D              POP EBP
00F88898    5F              POP EDI
00F88899    5E              POP ESI
00F8889A    5B              POP EBX
00F8889B    C3              RETN

进入以后按Ctrl+F9,再F7一下,到达OEP
00F60241    55              PUSH EBP      //这里下个硬断点,下次直接就到这里了。
00F60242    BD 262B4800     MOV EBP,482B26
00F60247    BD DE8D4800     MOV EBP,488DDE
00F6024C    8BEC            MOV EBP,ESP
00F6024E    E9 C7010000     JMP 00F6041A
00F60253    81D0 B693A431   ADC EAX,31A493B6
00F60259    FF35 0CB15500   PUSH DWORD PTR DS:[55B10C]
00F6025F    B8 16334900     MOV EAX,493316
00F60264    034424 38       ADD EAX,DWORD PTR SS:[ESP+38]
00F60268    58              POP EAX
00F60269    E9 460B0000     JMP 00F60DB4
00F6026E    C3              RETN

这个程序的输入表被加密了,搜索参考文本串,两个85之间的CALL进去后,找到IAT处理的CALL(详细的请参考我的上一篇)
00F93B84    55              PUSH EBP
00F93B85    8BEC            MOV EBP,ESP
00F93B87    81C4 F8FEFFFF   ADD ESP,-108
00F93B8D    53              PUSH EBX
00F93B8E    56              PUSH ESI
00F93B8F    57              PUSH EDI
00F93B90    8B55 14         MOV EDX,DWORD PTR SS:[EBP+14]
00F93B93    8B5D 08         MOV EBX,DWORD PTR SS:[EBP+8]
00F93B96    8DBD FAFEFFFF   LEA EDI,DWORD PTR SS:[EBP-106]
00F93B9C    8BC2            MOV EAX,EDX
00F93B9E    48              DEC EAX
00F93B9F    83E8 02         SUB EAX,2
00F93BA2    0FB630          MOVZX ESI,BYTE PTR DS:[EAX]
00F93BA5    8B45 10         MOV EAX,DWORD PTR SS:[EBP+10]
00F93BA8    83E8 02         SUB EAX,2
00F93BAB    0FB600          MOVZX EAX,BYTE PTR DS:[EAX]
00F93BAE    3B43 2C         CMP EAX,DWORD PTR DS:[EBX+2C]
00F93BB1    76 06           JBE SHORT 00F93BB9
00F93BB3    8943 2C         MOV DWORD PTR DS:[EBX+2C],EAX
00F93BB6    EB 01           JMP SHORT 00F93BB9
00F93BB8    6933 C08A433B   IMUL ESI,DWORD PTR DS:[EBX],3B438AC0
00F93BBE    3BF0            CMP ESI,EAX
00F93BC0    75 5E           JNZ SHORT 00F93C20                   //这里开始PATCH
00F93BC2    EB 01           JMP SHORT 00F93BC5
00F93BC4    C7              ???                                      
改为:JMP f60000(你申请到的内存地址)


这个程序的ESI值有四种情况,E3,A4,30,E7,其中E7,A4两种情况不加密,E3-->E7 ,30-->A4
继续PATCH:
00F60000  - 0F84 BF3B0300   JE 00F93BC5
00F60006    81FE E7000000   CMP ESI,0E7
00F6000C  - 0F84 0E3C0300   JE 00F93C20
00F60012    81FE E3000000   CMP ESI,0E3
00F60018    74 0A           JE SHORT 00F60024
00F6001A    BE A4000000     MOV ESI,0A4
00F6001F  - E9 FC3B0300     JMP 00F93C20
00F60024    BE E7000000     MOV ESI,0E7
00F60029  ^ EB F4           JMP SHORT 00F6001F
二进制代码:
0F 84 BF 3B 03 00 81 FE E7 00 00 00 0F 84 0E 3C 03 00 81 FE E3 00 00 00 74 0A BE A4 00 00 00 E9
FC 3B 03 00 BE E7 00 00 00 EB F4

取消断点运行,拿到正确的IAT表。

二、修复CALL XXXXXXXX。

到OEP后开始修复吧,搜索一下89,45,F0,B8,00,07,00,00 到达这里:
00F93754    8945 F0         MOV DWORD PTR SS:[EBP-10],EAX
00F93757    B8 00070000     MOV EAX,700
00F9375C    E8 E3EDFDFF     CALL 00F72544   //这里PATCH
PATCH:
00F9375C  - E9 6B8E2200     JMP 011A0043


到11A0000处写上代码

011A0000    0000            ADD BYTE PTR DS:[EAX],AL
011A0002    0000            ADD BYTE PTR DS:[EAX],AL
011A0004    0000            ADD BYTE PTR DS:[EAX],AL
011A0006    0000            ADD BYTE PTR DS:[EAX],AL
011A0008    0000            ADD BYTE PTR DS:[EAX],AL
011A000A    BA 00104000     MOV EDX,iat.<模块入口点>
011A000F    803A E8         CMP BYTE PTR DS:[EDX],0E8
011A0012    75 14           JNZ SHORT 011A0028
011A0014    8B42 01         MOV EAX,DWORD PTR DS:[EDX+1]
011A0017    03C2            ADD EAX,EDX
011A0019    05 05000000     ADD EAX,5
011A001E    3D 00000A01     CMP EAX,10A0000
011A0023    75 03           JNZ SHORT 011A0028
011A0025    EB 0C           JMP SHORT 011A0033
011A0027    90              NOP
011A0028    42              INC EDX
011A0029    81FA 00B05500   CMP EDX,55B000
011A002F  ^ 72 DE           JB SHORT 011A000F
011A0031  - EB FE           JMP SHORT 011A0031
011A0033    8915 00011A01   MOV DWORD PTR DS:[11A0100],EDX
011A0039    60              PUSHAD
011A003A    FFE2            JMP EDX
011A003C    90              NOP
011A003D    90              NOP
011A003E    90              NOP
011A003F    90              NOP
011A0040    90              NOP
011A0041    90              NOP
011A0042    90              NOP
011A0043    90              NOP
011A0044    B8 A4415600     MOV EAX,5641A4
011A0049    90              NOP
011A004A    3910            CMP DWORD PTR DS:[EAX],EDX
011A004C    75 23           JNZ SHORT 011A0071
011A004E    8B0D 00011A01   MOV ECX,DWORD PTR DS:[11A0100]
011A0054    C701 FF250000   MOV DWORD PTR DS:[ECX],25FF
011A005A    8941 02         MOV DWORD PTR DS:[ECX+2],EAX
011A005D    61              POPAD
011A005E    90              NOP
011A005F    8B15 00011A01   MOV EDX,DWORD PTR DS:[11A0100]
011A0065    90              NOP
011A0066    90              NOP
011A0067    90              NOP
011A0068  ^ EB BE           JMP SHORT 011A0028
011A006A    90              NOP
011A006B    90              NOP
011A006C    90              NOP
011A006D    90              NOP
011A006E    90              NOP
011A006F    90              NOP
011A0070    90              NOP
011A0071    83C0 04         ADD EAX,4
011A0074    3D 404A5600     CMP EAX,564A40
011A0079  ^ 7E CF           JLE SHORT 011A004A
011A007B  ^ EB E0           JMP SHORT 011A005D
011A007D    90              NOP

00 00 00 00 00 00 00 00 00 00 BA 00 10 40 00 80 3A E8 75 14 8B 42 01 03 C2 05 05 00 00 00 3D 00
00 0A 01 75 03 EB 0C 90 42 81 FA 00 B0 55 00 72 DE EB FE 89 15 00 01 1A 01 60 FF E2 90 90 90 90
90 90 90 90 B8 A4 41 56 00 90 39 10 75 23 8B 0D 00 01 1A 01 C7 01 FF 25 00 00 89 41 02 61 90 8B
15 00 01 1A 01 90 90 90 EB BE 90 90 90 90 90 90 90 83 C0 04 3D 40 4A 56 00 7E CF EB E0 90



代码还是上一个,修改了几个值就可以啦。
在011A000A新建EIP,F9运行一下,OK。
LODEPE开始DUMP,IMR修复一下。
三、修复OEP抽取
还是用SYSCOM的补区段大法吧
1.且不要关OD,把F40000到1430000的所有区段都保存下来,一共二十多个,都保存下来,再用LODEPE装配进DUMP后的文件中。(高手莫笑啊,这样为了保险,再费事也总比一句一句猜代码省事吧)
2.修正Route Check
用OD载入后跟踪到这里:
00F94C06    8B40 34         MOV EAX,DWORD PTR DS:[EAX+34]
00F94C09    FFD0            CALL EAX
00F94C0B    2945 0C         SUB DWORD PTR SS:[EBP+C],EAX
修改为:
00F94C06    90              NOP
00F94C07    90              NOP
00F94C08    90              NOP
00F94C09    8B4424 58       MOV EAX,DWORD PTR SS:[ESP+58]
00F94C0D    83E8 05         SUB EAX,5
00F94C10    90              NOP

3.修正预先解码用到的API
再运行后还是有错误,发现是有二个API函数错误
00401300  - FF25 F8415600   JMP DWORD PTR DS:[5641F8]
004071A0  - FF25 BC435600   JMP DWORD PTR DS:[5643BC]
经跟踪后发现都是: kernel32.GetProcAddress,修正它。
4.自校验:
再运行后发现已经能出窗口了,但是一点OK就出来十几个注册窗口,再改掉两个JLE为JMP。
最后跨平台测试,OK了.

参考文章:

LOOVBOOM的ASProtect 2.x脱壳系列
syscom的ASProtect delphi+OEP stolen篇
林海雪原的aspr2.2 SKE 外壳简单分析
……

脱壳后文件在我的网络优盘中:
http://pickup.mofile.com/5595561565230235

[课程]Android-CTF解题方法汇总!

收藏
免费 7
支持
分享
最新回复 (44)
雪    币: 242
活跃值: (163)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
2
支持!
2006-4-12 09:21
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
3
不错
继续进步
2006-4-12 09:45
0
雪    币: 319
活跃值: (2404)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
4
支持一下。
2006-4-12 10:20
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个程序的ESI值有四种情况,E3,A4,30,E7,其中E7,A4两种情况不加密,E3-->E7 ,30-->A4

如何跟得这4种情况?
如何得知其中那些是不加密的?
谢谢
2006-4-12 15:36
0
雪    币: 279
活跃值: (145)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
6
谢谢大家的鼓励!

00F93B84    55              PUSH EBP
00F93B85    8BEC            MOV EBP,ESP
00F93B87    81C4 F8FEFFFF   ADD ESP,-108
00F93B8D    53              PUSH EBX
00F93B8E    56              PUSH ESI
00F93B8F    57              PUSH EDI
00F93B90    8B55 14         MOV EDX,DWORD PTR SS:[EBP+14]
00F93B93    8B5D 08         MOV EBX,DWORD PTR SS:[EBP+8]
00F93B96    8DBD FAFEFFFF   LEA EDI,DWORD PTR SS:[EBP-106]
00F93B9C    8BC2            MOV EAX,EDX
00F93B9E    48              DEC EAX
00F93B9F    83E8 02         SUB EAX,2
00F93BA2    0FB630          MOVZX ESI,BYTE PTR DS:[EAX]
00F93BA5    8B45 10         MOV EAX,DWORD PTR SS:[EBP+10]
00F93BA8    83E8 02         SUB EAX,2
00F93BAB    0FB600          MOVZX EAX,BYTE PTR DS:[EAX]
00F93BAE    3B43 2C         CMP EAX,DWORD PTR DS:[EBX+2C]
00F93BB1    76 06           JBE SHORT 00F93BB9
00F93BB3    8943 2C         MOV DWORD PTR DS:[EBX+2C],EAX
00F93BB6    EB 01           JMP SHORT 00F93BB9
00F93BB8    6933 C08A433B   IMUL ESI,DWORD PTR DS:[EBX],3B438AC0
00F93BBE    3BF0            CMP ESI,EAX  //这里下断点,就可以跟踪了,对照着输入表位置看指针名出来了没有就可以知道是否加密了.
00F93BC0    75 5E           JNZ SHORT 00F93C20                  
00F93BC2    EB 01           JMP SHORT 00F93BC5
00F93BC4    C7              ???
2006-4-12 16:15
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
支持一下。
2006-4-12 16:16
0
雪    币: 175
活跃值: (2331)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
支持,这个壳不好脱。
2006-4-12 17:06
0
雪    币: 127
活跃值: (1765)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
支持,这个壳不好脱
2006-4-12 19:01
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习了,我在
搜索一下83,C4,28,5D,5F,5E,5B,C3 ,有两处,在第二处下断点

程序出错
2006-4-12 19:36
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
11
支持一下。
2006-4-12 20:36
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
最初由 pendan2001 发布
支持一下。

哈哈,兄弟从good到支持了啊
2006-4-12 20:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
011A0023    75 03           JNZ SHORT 011A0028
011A0025    EB 0C           JMP SHORT 011A0033
011A0027    90              NOP
011A0028    42              INC EDX
011A0029    81FA 00B05500   CMP EDX,55B000
011A002F  ^ 72 DE           JB SHORT 011A000F
011A0031  - EB FE           JMP SHORT 011A0031
011A0033    8915 00011A01   MOV DWORD PTR DS:[11A0100],EDX
011A0039    60              PUSHAD
011A003A    FFE2            JMP EDX
011A003C    90              NOP
011A003D    90              NOP
011A003E    90              NOP
011A003F    90              NOP
011A0040    90              NOP
011A0041    90              NOP
011A0042    90              NOP
011A0043    90              NOP
011A0044    B8 A4415600     MOV EAX,5641A4
011A0049    90              NOP
011A004A    3910            CMP DWORD PTR DS:[EAX],EDX
011A004C    75 23           JNZ SHORT 011A0071
011A004E    8B0D 00011A01   MOV ECX,DWORD PTR DS:[11A0100]
011A0054    C701 FF250000   MOV DWORD PTR DS:[ECX],25FF
011A005A    8941 02         MOV DWORD PTR DS:[ECX+2],EAX
011A005D    61              POPAD
011A005E    90              NOP
011A005F    8B15 00011A01   MOV EDX,DWORD PTR DS:[11A0100]
011A0065    90              NOP
011A0066    90              NOP
011A0067    90              NOP
011A0068  ^ EB BE           JMP SHORT 011A0028
011A006A    90              NOP
011A006B    90              NOP
011A006C    90              NOP
011A006D    90              NOP
011A006E    90              NOP
011A006F    90              NOP
011A0070    90              NOP
011A0071    83C0 04         ADD EAX,4
011A0074    3D 404A5600     CMP EAX,564A40
011A0079  ^ 7E CF           JLE SHORT 011A004A
011A007B  ^ EB E0           JMP SHORT 011A005D
011A007D    90              NOP

大大我有几点不明白:
1:你代码里的
“              CMP EDX,55B000   
    MOV EAX,5641A4
  CMP EAX,564A40”   “
那些55B000 ,5641A4,564A40是从哪里来的~~~
2:在你的网络优盘中下载的脱壳破解后文件为什么还提示注册?
2006-4-12 22:34
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
支持,收藏
2006-4-12 22:35
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
15
最初由 xwqgsterry 发布
2:在你的网络优盘中下载的脱壳破解后文件为什么还提示注册?
........


只是脱壳
破解自己破去
2006-4-13 00:23
0
雪    币: 229
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
16
文章名字有歧义,猛一看还以为是讲 OEP 如何抽取或如何还原的呢!
2006-4-13 00:31
0
雪    币: 280
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
17
向前辈学习,能不能把偷代码还原的方法再说的详细点,有好多地方的原理都不懂。
2006-4-13 02:18
0
雪    币: 280
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
18
2006-4-13 04:26
0
雪    币: 279
活跃值: (145)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
19
最初由 xwqgsterry 发布
1:你代码里的
“ CMP EDX,55B000
MOV EAX,5641A4
CMP EAX,564A40” “
那些55B000 ,5641A4,564A40是从哪里来的~~~

55b000  是代码段结束地址
5641A4  是输入表开始地址
564A40  是输入表结束地址
2006-4-13 07:54
0
雪    币: 279
活跃值: (145)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
20
最初由 thdzhqg 发布
向前辈学习,能不能把偷代码还原的方法再说的详细点,有好多地方的原理都不懂。


我学破解还没半年呢,还是菜菜,原理偶也不懂,只是依样画葫芦而已.
2006-4-13 07:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
最初由 linex 发布
55b000 是代码段结束地址
5641A4 是输入表开始地址
564A40 是输入表结束地址


哈哈,明白了,谢谢。。
我学了1个礼拜了,什么都不懂,真想放弃了,不过还是努力把~~~
2006-4-13 12:37
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
22
1.且不要关OD,把F40000到1430000的所有区段都保存下来,一共二十多个,都保存下来,再用LODEPE装配进DUMP后的文件中。(高手莫笑啊,这样为了保险,再费事也总比一句一句猜代码省事吧)

请问怎么样确认那些是Stolen Code的区段??
2006-4-23 06:31
0
雪    币: 279
活跃值: (145)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
23
这些区段里很多是API的变形代码,我只是为了省事把所有区段全部DUMP,如果你能跟踪一下会找到那些Stolen Code区段的,我觉得如果你只是要能运行,那你就全DUMP下来,不用分析,如果想完美一些,那就修复一下 Code Stolen.具体做法因人而异.
2006-4-23 08:05
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
24
你的意思是把所有的都dump出来?
2006-4-23 08:15
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
25
因为我看了下你脱壳的文件
新加了好多区段
我就是想搞清楚这些区段是怎么来的?
为什么不dump其他的呢?
2006-4-23 08:16
0
游客
登录 | 注册 方可回帖
返回
//