首页
社区
课程
招聘
[原创]ASProtect 2.3 SKE Build0319 Beta脱壳手记(无stolen OEP有stolen code)
发表于: 2006-4-27 12:21 15211

[原创]ASProtect 2.3 SKE Build0319 Beta脱壳手记(无stolen OEP有stolen code)

2006-4-27 12:21
15211

【脱壳文件】自己写的一个加载DLL的DD(Delphi写的)
【下载地址】见附件
【加壳方式】ASProtect 2.3 SKE Build 03.19 Beta 除了Protect Original EntryPoint全部选项
【作    者】h_f22
【作者声明】水平很菜 请高手们多指教
【调试环境】WinXPSP2、OllyDBD110、LordPE、ImportREC
【脱壳过程】见下

一、前言
   
    关于Aspr的文章论坛里面已经不少,各位大虾也都基本上把它研究透了。写此文的目的只在于自己学习
和给跟我有相同问题的人一点提示。
   
    Aspr变得越来越强,从没有stolen code到在OEP处偷一点,再到OEP处偷一堆,现在他终于在别处也开始偷了.等一下我们将看到在这个版本的Aspr中出现了一个的stolen code(不是stolen OEP),虽然他只偷了一个函数,也很容易找回来,但是这只是Beta版,正式版的时候又会是什么样呢?也许Aspr要变成超级猛壳了。
   
    加壳用的Aspr2.3时在工具区下载的。程序是自己用Delphi写的一个加载DLL的小工具。
   
二、加壳方式
   
    除了Protect Original EntryPoint(就是stolen OEP)以外的全部选项,虽然没选这个选项,Aspr却在别的地方偷了一点儿。

三、过程
   
    1、找到OEP和IAT
    这个过程很简单。首先用OD加载目标程序,忽略除了INT3以外的全部异常,F9运行,停在第二个异常处,在内存映像中找到程序的代码段,下内存访问断点F2,运行,即停在OEP。

0045AF16      00            db      00
0045AF17      00            db      00
0045AF18      14AD4500      dd      Project1.0045AD14
0045AF1C   .  55            push    ebp             //OEP                ;  Project1.00400000
0045AF1D   .  8BEC          mov     ebp, esp
0045AF1F   .  83C4 F0       add     esp, -10
0045AF22   .  B8 3CAD4500   mov     eax, 0045AD3C
0045AF27   .  E8 E0B1FAFF   call    0040610C
0045AF2C   .  A1 F4C04500   mov     eax, [45C0F4]
0045AF31   .  8B00          mov     eax, [eax]
0045AF33   .  E8 08E3FFFF   call    00459240
0045AF38   .  8B0D D8C14500 mov     ecx, [45C1D8]                   ;  Project1.0045DC04
0045AF3E   .  A1 F4C04500   mov     eax, [45C0F4]
0045AF43   .  8B00          mov     eax, [eax]
0045AF45   .  8B15 B4A84500 mov     edx, [45A8B4]                   ;  Project1.0045A900    
004011FD   .  626A 65       bound   ebp, [edx+65]
00401200   .  63748B C0     arpl    [ebx+ecx*4-40], si
00401204   $  E8 F7ED1501   call    01560000     //Advance Import protection的处理函数
00401209      14            db      14
0040120A      8BC0          mov     eax, eax
0040120C   .- FF25 ACE14500 jmp     [45E1AC]     //45E1AC就是IAT的某个地址了
00401212   .  8BC0          mov     eax, eax
00401214   .- FF25 A8E14500 jmp     [45E1A8]                        ;  ntdll.RtlUnwind
0040121A   .  8BC0          mov     eax, eax
0040121C   $- FF25 A4E14500 jmp     [45E1A4]                        ;  kernel32.UnhandledExceptionFilter
00401222   .  8BC0          mov     eax, eax
00401224   .  E8 D7ED1501   call    01560000
00401229   .  E4 8B         in      al, 8B
0040122B   .  C0FF 25       sar     bh, 25
0040122E   ?  C4E1          les     esp, ecx                        ;  非法使用寄存器
00401230   ?  45            inc     ebp
00401231   ?  008B C0FF259C add     [ebx+9C25FFC0], cl
00401237   ?  E1 45         loopde  short 0040127E
00401239   ?  008B C0E8BFED add     [ebx+EDBFE8C0], cl
0040123F   ?  15 012E8BC0   adc     eax, C08B2E01
0045E0EC  C0 E6 05 00 00 00 00 00 00 00 00 00 00 00 00 00  梨.............
0045E0FC  3A FF 05 00 E4 E6 05 00 00 00 00 00 00 00 00 00  :?.滏.........
0045E10C  00 00 00 00 48 01 06 00 44 E7 05 00 00 00 00 00  ....H.D?.....
0045E11C  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0045E12C  8A 18 93 7C ED 10 92 7C 05 10 92 7C A1 9F 80 7C  ???????
0045E13C  14 9B 80 7C 81 9A 80 7C 5D 99 80 7C BD 99 80 7C  ?|??]?|??
0045E14C  AB 14 81 7C EA 28 C0 8B 94 97 80 7C 7B 97 80 7C  ??????{?|
0045E15C  59 B8 80 7C C7 A0 80 7C AD 9C 80 7C F6 3D B4 E4  Y?|沁????翠
0045E16C  11 03 81 7C 73 F4 93 DC B0 C0 EB 01 4D 11 47 F7  ?s?馨离MG
    
00E3872E    F3:A5           rep     movs dword ptr es:[edi], dword >
00E38730    66:A5           movs    word ptr es:[edi], word ptr [es>
00E38732    5E              pop     esi
00E38733    EB 0A           jmp     short 00E3873F
00E38735    68 C089E300     push    0E389C0                         ; ASCII "85",CR,LF
00E3873A    E8 C5CEFDFF     call    00E15604
00E3873F    A1 78B9E300     mov     eax, [E3B978]
00E38744    8B00            mov     eax, [eax]
00E38746    E8 410FFFFF     call    00E2968C    //F4到这里后F7步进
00E3874B    84C0            test    al, al
00E3874D    75 0A           jnz     short 00E38759
00E3874F    68 C089E300     push    0E389C0                         ; ASCII "85",CR,LF
00E38754    E8 ABCEFDFF     call    00E15604
00E38759    A1 40BAE300     mov     eax, [E3BA40]
00E3875E    8B40 04         mov     eax, [eax+4]
00E38761    50              push    eax
00E38762    56              push    esi
00E38763    E8 3033FEFF     call    00E1BA98
00E2979A   /75 0A           jnz     short 00E297A6
00E2979C   |68 F497E200     push    0E297F4                         ; ASCII "180",CR,LF
00E297A1   |E8 5EBEFEFF     call    00E15604
00E297A6   \834424 08 04    add     dword ptr [esp+8], 4
00E297AB    47              inc     edi
00E297AC    EB 1A           jmp     short 00E297C8
00E297AE    83C7 02         add     edi, 2
00E297B1    8BC7            mov     eax, edi
00E297B3    50              push    eax
00E297B4    55              push    ebp
00E297B5    8D4424 10       lea     eax, [esp+10]
00E297B9    50              push    eax
00E297BA    56              push    esi
00E297BB    E8 6CFCFFFF     call    00E2942C           //F4到这里F7步入
00E297C0    0FB707          movzx   eax, word ptr [edi]
00E297C3    83C0 02         add     eax, 2
00E297C6    03F8            add     edi, eax
00E297C8    8A1F            mov     bl, [edi]
00E297CA    47              inc     edi
00E297CB    3A5E 34         cmp     bl, [esi+34]
00E297CE  ^ 0F85 77FFFFFF   jnz     00E2974B
00E297D4    8BDF            mov     ebx, edi
00E297D6    8B03            mov     eax, [ebx]
00E297D8    85C0            test    eax, eax
00E297DA  ^ 0F85 0AFFFFFF   jnz     00E296EA
00E297E0    8A0424          mov     al, [esp]
00E297E3    83C4 0C         add     esp, 0C
00E297E6    5D              pop     ebp
00E297E7    5F              pop     edi
00E297E8    5E              pop     esi
00E297E9    5B              pop     ebx
00E297EA    C3              retn
00E29447    83E8 02         sub     eax, 2
00E2944A    0FB630          movzx   esi, byte ptr [eax]
00E2944D    8B45 10         mov     eax, [ebp+10]
00E29450    83E8 02         sub     eax, 2
00E29453    0FB600          movzx   eax, byte ptr [eax]
00E29456    3B43 2C         cmp     eax, [ebx+2C]
00E29459    76 06           jbe     short 00E29461
00E2945B    8943 2C         mov     [ebx+2C], eax
00E2945E    EB 01           jmp     short 00E29461
00E29460    6933 C08A433B   imul    esi, [ebx], 3B438AC0
00E29466    3BF0            cmp     esi, eax                 //在这里下硬件断点
00E29468    75 5E           jnz     short 00E294C8           //这里改成jmp 01550000 跳到Patch代码中去
00E2946A    EB 01           jmp     short 00E2946D
00E2946C    C7              ???                                     ; 未知命令
00E2946D    66:8B02         mov     ax, [edx]
00E29470    66:8945 FA      mov     [ebp-6], ax
00E29474    83C2 02         add     edx, 2
00E29477    8955 FC         mov     [ebp-4], edx
01550000  - 0F84 67948DFF   je      00E2946D //第一种
01550006    81FE 82000000   cmp     esi, 82
0155000C    0F84 0C000000   je      0155001E//第三种
01550012    81FE CF000000   cmp     esi, 0CF
01550018    0F85 0A000000   jnz     01550028//不是前三种
0155001E    BE CF000000     mov     esi, 0CF
01550023  - E9 A0948DFF     jmp     00E294C8
01550028    CC              int3    //如果出现不是前三种情况会停在这里
01550029  ^ EB F3           jmp     short 0155001E
0155002B    90              nop
8A 18 93 7C ED 10 92 7C 05 10 92 7C A1 9F 80 7C 14 9B 80 7C 81 9A 80 7C 5D 99 80 7C BD 99 80 7C
AB 14 81 7C 37 97 80 7C 94 97 80 7C 7B 97 80 7C 59 B8 80 7C C7 A0 80 7C AD 9C 80 7C E0 C6 80 7C
11 03 81 7C D3 2F 88 7C 05 A4 80 7C EE 1E 80 7C 28 AC 80 7C 29 B5 80 7C 57 B3 80 7C 7E D4 80 7C
8D 2C 81 7C 66 AA 80 7C 59 35 81 7C D7 EF 80 7C A2 CA 81 7C 9F 0F 81 7C 8A 2B 86 7C 40 7A 95 7C
E1 EA 81 7C A9 2C 81 7C 00 00 00 00 B3 11 D3 77 E8 0F D2 77 EA 04 D5 77 90 0F D2 77 00 00 00 00
83 78 DA 77 1B 76 DA 77 F0 6B DA 77 00 00 00 00 50 48 0F 77 9D C9 11 77 59 4B 0F 77 00 00 00 00
。。。。。。。
00FB0000  E8 00 00 00 00 5B 83 EB 05 8B 93 00 01 00 00 80  ?...[??...?
00FB0010  3A E8 0F 85 94 00 00 00 8B 42 01 03 C2 83 C0 05  :??...???
00FB0020  3B 83 18 01 00 00 0F 85 80 00 00 00 90 90 90 90  ;?..?...??
00FB0030  90 90 90 90 90 90 90 90 60 89 A3 08 01 00 00 FF  ????`?..?
00FB0040  E2 E8 00 00 00 00 5B 83 EB 46 89 83 0C 01 00 00  忤....[?F?...
00FB0050  8B A3 08 01 00 00 61 8B 8B 10 01 00 00 8B 83 0C  ?..a?..?.
00FB0060  01 00 00 39 01 0F 85 0D 00 00 00 66 C7 02 FF 25  ..9?...f??
00FB0070  89 4A 02 E9 34 00 00 00 83 C1 04 3B 8B 14 01 00  ??...?;?.
00FB0080  00 0F 82 DC FF FF FF FF 83 1C 01 00 00 90 90 90  .????..?
00FB0090  90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90  ????????
00FB00A0  90 90 90 90 90 90 90 90 90 90 90 90 42 3B 93 04  ??????B;?
00FB00B0  01 00 00 0F 82 56 FF FF FF EB FE 00 00 00 00 00  ..????....
00FB00C0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00FB00D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00FB00E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00FB00F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00FB0100  00 10 40 00 FC AF 45 00 44 FF 12 00 1E 31 32 76  .@.?E.D?.12v
00FB0110  2C E1 45 00 44 E7 45 00 00 00 56 01 01 00 00 00  ,崤.D缗...V...
    
00FB0000    E8 00000000     call    00FB0005   
00FB0005    5B              pop     ebx
00FB0006    83EB 05         sub     ebx, 5                     //用ebx取得代码所在地址 ebx是变量的基址
00FB0009    8B93 00010000   mov     edx, [ebx+100]             
00FB000F    803A E8         cmp     byte ptr [edx], 0E8
00FB0012    0F85 94000000   jnz     00FB00AC                   //查找call xxxxxxx
00FB0018    8B42 01         mov     eax, [edx+1]
00FB001B    03C2            add     eax, edx
00FB001D    83C0 05         add     eax, 5                     //计算出call去哪里
00FB0020    3B83 18010000   cmp     eax, [ebx+118]             //比较一下是不是去AIP的call
00FB0026    0F85 80000000   jnz     00FB00AC                   //不是就继续找
00FB002C    90              nop                                //是就处理
00FB002D    90              nop
00FB002E    90              nop
00FB002F    90              nop
00FB0030    90              nop
00FB0031    90              nop
00FB0032    90              nop
00FB0033    90              nop
00FB0034    90              nop
00FB0035    90              nop
00FB0036    90              nop
00FB0037    90              nop
00FB0038    60              pushad                                
00FB0039    89A3 08010000   mov     [ebx+108], esp             //保存现场
00FB003F    FFE2            jmp     edx                        //去AIP的call
00FB0041    E8 00000000     call    00FB0046                   //中断返回
00FB0046    5B              pop     ebx
00FB0047    83EB 46         sub     ebx, 46                    //重新取回变量基址
00FB004A    8983 0C010000   mov     [ebx+10C], eax             //保存解码出的API函数地址 这里如果是Aspr2.1的要把eax改成edx
00FB0050    8BA3 08010000   mov     esp, [ebx+108]
00FB0056    61              popad                              //恢复现场
00FB0057    8B8B 10010000   mov     ecx, [ebx+110]             //在IAT中查到该API函数地址所在
00FB005D    8B83 0C010000   mov     eax, [ebx+10C]
00FB0063    3901            cmp     [ecx], eax
00FB0065    0F85 0D000000   jnz     00FB0078                   //是否找到
00FB006B    66:C702 FF25    mov     word ptr [edx], 25FF       //找到就处理 这里要注意 一般Delphi都是jmp [xxxxx]就是 25FF 
00FB0070    894A 02         mov     [edx+2], ecx               //不过也不完全一定,适当的时候要自己改成15FF
00FB0073    E9 34000000     jmp     00FB00AC                   //找到就继续下一个
00FB0078    83C1 04         add     ecx, 4
00FB007B    3B8B 14010000   cmp     ecx, [ebx+114]             //是否IAT结束 
00FB0081  ^ 0F82 DCFFFFFF   jb      00FB0063
00FB0087    FF83 1C010000   inc     dword ptr [ebx+11C]        //结束说明没有找到 未找到API个数记录 变量+1
00FB008D    90              nop
00FB008E    90              nop
00FB008F    90              nop
00FB0090    90              nop
00FB0091    90              nop
00FB0092    90              nop
00FB0093    90              nop
00FB0094    90              nop
00FB0095    90              nop
00FB0096    90              nop
00FB0097    90              nop
00FB0098    90              nop
00FB0099    90              nop
00FB009A    90              nop
00FB009B    90              nop
00FB009C    90              nop
00FB009D    90              nop
00FB009E    90              nop
00FB009F    90              nop
00FB00A0    90              nop
00FB00A1    90              nop
00FB00A2    90              nop
00FB00A3    90              nop
00FB00A4    90              nop
00FB00A5    90              nop
00FB00A6    90              nop
00FB00A7    90              nop
00FB00A8    90              nop
00FB00A9    90              nop
00FB00AA    90              nop
00FB00AB    90              nop
00FB00AC    42              inc     edx
00FB00AD    3B93 04010000   cmp     edx, [ebx+104]
00FB00B3  ^ 0F82 56FFFFFF   jb      00FB000F                          //代码段结束?
00FB00B9  - EB FE           jmp     short 00FB00B9                    //原地等待

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (34)
雪    币: 208
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
头顶撞墙
2006-4-27 12:33
0
雪    币: 219
活跃值: (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
搬个凳子坐前排
好好学习,天天向上。

操,看了N篇文章,终于看懂了一篇,照做能搞定的东东了。

没办法,谁叫咱菜呢。。。

顺便问下楼主,对于ESI 值为四个的东东,一般修复补丁怎么打?
我试了好几个程序,ESI值都是四个的,我挨个试后,发现一般最后一个
是没加密的,但是一改成最后一个,运行几步就OD就退出了。

烦请举个例,先谢过了。。呵呵,我脱的是这个例子,却是按照你的方法来弄的。
http://bbs.pediy.com/showthread.php?s=&threadid=18893
下载地址:
http://www.1securitycenter.com:80/downloads/wso.zip
2006-4-27 12:39
0
雪    币: 203
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
抢个位置慢慢学习
2006-4-27 13:02
0
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
最初由 h_f22 发布关于那段stolen code,其实这段代码可以恢复成和原来一样的,


以前听shoooo说,Delphi库函数被偷,从别的Delphi程序将这个库函数代码复制过来就行。
2006-4-27 13:20
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
继续学习,谢谢!!!!
2006-4-27 13:35
0
雪    币: 50
活跃值: (145)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
7
学不过来啦
2006-4-27 14:30
0
雪    币: 242
活跃值: (163)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
8
aspr太强了!楼主太强了!0day更强!aspr我完全不懂了!
2006-4-27 14:35
0
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
9
近来很多潜水的高手终于浮水了~

支持~不过看不懂~

2006-4-27 15:09
0
雪    币: 97697
活跃值: (200824)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
10
2006-4-27 15:25
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
11
晕.2.3的变化似乎蛮大的
2006-4-28 01:06
0
雪    币: 238
活跃值: (12)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
12
支持,这样浅显的猛壳脱文很少见啊,顶起来分期消化!
2006-4-28 01:17
0
雪    币: 211
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我在最后那段代码照搬复制后,保存时出错,说什么不能读取,但在od中可以运行,不知道怎么回事?
2006-4-28 08:00
0
雪    币: 223
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
壳快教程也快啊
2006-4-28 08:22
0
雪    币: 225
活跃值: (142)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
15
最初由 qdlsy 发布
我在最后那段代码照搬复制后,保存时出错,说什么不能读取,但在od中可以运行,不知道怎么回事?


保存出错?你用什么保存?实在不行用UE或着WINHEX改一下文件也一样.
2006-4-28 09:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
aspr太强了!楼主太强了!
2006-4-28 16:02
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
17
没有源码,那就难分析了。
2006-5-9 02:11
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
顶一下,慢慢学习...
2006-5-9 10:38
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
这个过程很简单。首先用OD加载目标程序,忽略除了INT3以外的全部异常,F9运行,停在第二个异常处,在内存映像中找到程序的代码段,下内存访问断点F2,运行,即停在OEP。

我照做,没办法到OEP啊
到了DE2605 rep     movs dword ptr es:[edi], dword ptr ds:[esi]
2006-5-12 21:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
顶你没商量!!
2006-5-15 11:18
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
写的太好了,很详细,感谢!
2006-5-15 11:23
0
雪    币: 225
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
绝顶好文

唯 技术扎实 文笔流畅 思绪敏锐 绝顶聪名 胸襟宽大 乐於助人 者
才能写出这无价实用的巨高质量好文

谢谢你
2006-7-22 04:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
顶!这种文章真的是精品!!!
2006-8-17 10:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
学习学习,谢楼主分亨!
2006-8-18 10:29
0
雪    币: 235
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
25
晕,完全看不懂,马上潜水学习!!!
2006-8-19 00:41
0
游客
登录 | 注册 方可回帖
返回
//