【脱壳文件】图标制作工具
【下载地址】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

  • 标 题: 答复
  • 作 者:linex
  • 时 间:2006-04-12 16:15

谢谢大家的鼓励!

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              ???

  • 标 题:答复
  • 作 者:linex
  • 时 间:2006-04-13 07:54

引用: 最初由 xwqgsterry 发布
1:你代码里的
“              CMP EDX,55B000   
    MOV EAX,5641A4
  CMP EAX,564A40”   “
那些55B000 ,5641A4,564A40是从哪里来的~~~

55b000  是代码段结束地址
5641A4  是输入表开始地址
564A40  是输入表结束地址