首页
社区
课程
招聘
ASProtect SKE V2.2及 V2.3简单加壳的98notepad[脱文]
发表于: 2006-4-23 17:39 8793

ASProtect SKE V2.2及 V2.3简单加壳的98notepad[脱文]

2006-4-23 17:39
8793

【破解作者】 windycandy
【使用工具】 OD,PEID0.94,LordPE.ImportREC1.6F
【破解平台】 win XP
【软件名称】 ASProtect SKE V2.2及 V2.3简单加壳的98notepad
【软件下载】 http://bbs.chinapyg.com/viewthread.php?tid=4436&extra=page%3D1
【软件简介】 ASProtect SKE V2.2及V2.3 在看雪工具下载区下载的
             对98notepad加壳时我只用了比较简单的resources protection的两个选项,
             没有stolen code
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】

1.声明
本文是学习林海雪原大侠的<aspr2.2 SKE 外壳简单分析 >得到灵感而成,此方法对ASProtect SKE V2.11脱壳也可以.

2.脱壳过程

V2.2和V2.3加壳后,内存异常中断没用了.
开始学着用林海雪原大大的方法吧.OD设置不忽略INT3中断,其余全部忽略
shift+f9两次异常中断后,code段内存断点法再一次shift+F9就到达OEP:

004010CC     55                      push ebp                              ; NOTEPAD.00400000
004010CD     8BEC                    mov ebp,esp
004010CF     83EC 44                 sub esp,44
004010D2     56                      push esi
004010D3     E8 28EFE500             call 01260000-------哈哈,就是这个call到壳里去的,记下1260000
004010D8     E7 8B                   out 8B,eax
004010DA     F0:8A00                 lock mov al,byte ptr ds:[eax]         ; 不允许锁定前缀
004010DD     3C 22                   cmp al,22
004010DF     75 1B                   jnz short NOTEPAD.004010FC
004010E1     56                      push esi
004010E2     FF15 F4644000           call dword ptr ds:[4064F4] ---USER32.CharNextA--API所在段4064000
004010E8     8BF0                    mov esi,eax
004010EA     8A00                    mov al,byte ptr ds:[eax]
004010EC     84C0                    test al,al
004010EE     74 04                   je short NOTEPAD.004010F4
004010F0     3C 22                   cmp al,22
004010F2   ^ 75 ED                   jnz short NOTEPAD.004010E1
004010F4     803E 22                 cmp byte ptr ds:[esi],22
004010F7     75 15                   jnz short NOTEPAD.0040110E
004010F9     46                      inc esi
004010FA     EB 12                   jmp short NOTEPAD.0040110E
004010FC     3C 20                   cmp al,20
004010FE     7E 0E                   jle short NOTEPAD.0040110E
00401100     56                      push esi
00401101     FF15 F4644000           call dword ptr ds:[4064F4]     ; USER32.CharNextA
00401107     8038 20                 cmp byte ptr ds:[eax],20

由于没有stolen code得到两个数据1260000,4064000就可以了

CTRL+F2重新载入,shift+f9 第一次INT3异常中断在

00AE7A43     90                      nop------断在这里
00AE7A44     EB 01                   jmp short 00AE7A47
00AE7A46     6966 81 FE474674        imul esp,dword ptr ds:[esi-7F],744647>
00AE7A4D     05 31C040EB             add eax,EB40C031
00AE7A52     0231                    add dh,byte ptr ds:[ecx]
00AE7A54     C031 DB                 sal byte ptr ds:[ecx],0DB
00AE7A57     64:8F03                 pop dword ptr fs:[ebx]
00AE7A5A     83C4 04                 add esp,4
00AE7A5D     EB 01                   jmp short 00AE7A60
00AE7A5F     E8 5F5E5BC3             call C409D8C3
00AE7A64     51                      push ecx
00AE7A65     52                      push edx
00AE7A66     53                      push ebx

此时,单击右键---查找------所有参考文本串,找到特征码"85"
00AE8416   push 0B36F94                                     ASCII "??
00AE85A6   push 0B384FC                                     ASCII "??
00AE8735   push 0AE89C0                                     ASCII "85"------找到这里
00AE874F   push 0AE89C0                                     ASCII "85"
00AE8911   push 0AE89D0                                     ASCII "55"

双击来到以下代码处:

00AE8730     66:A5                   movs word ptr es:[edi],word ptr ds:[e>
00AE8732     5E                      pop esi
00AE8733     EB 0A                   jmp short 00AE873F
00AE8735     68 C089AE00             push 0AE89C0                          ; ASCII "85"------这里
00AE873A     E8 C5CEFDFF             call 00AC5604
00AE873F     A1 78B9AE00             mov eax,dword ptr ds:[AEB978]
00AE8744     8B00                    mov eax,dword ptr ds:[eax]
00AE8746     E8 410FFFFF             call 00AD968C-----------------------直接F4到这里,(注意F2不能用了)
00AE874B     84C0                    test al,al
00AE874D     75 0A                   jnz short 00AE8759
00AE874F     68 C089AE00             push 0AE89C0                          ; ASCII "85"
00AE8754     E8 ABCEFDFF             call 00AC5604

看看这段代码ASPROTECT V2.11版加壳的的很相似.
可能作者做的检测,不能F2直接下断点了,还好作者没防F4,哈哈,按F4到00AE8746后,F7进入,并向下找到

00AD97B9     50                      push eax
00AD97BA     56                      push esi
00AD97BB     E8 6CFCFFFF             call 00AD942C-----------先在00AD97EA 处下F2断点,再F4到这里,F7进
00AD97C0     0FB707                  movzx eax,word ptr ds:[edi]            这个CALL是进行IAT处理,
00AD97C3     83C0 02                 add eax,2
00AD97C6     03F8                    add edi,eax
00AD97C8     8A1F                    mov bl,byte ptr ds:[edi]
00AD97CA     47                      inc edi
00AD97CB     3A5E 34                 cmp bl,byte ptr ds:[esi+34]
00AD97CE   ^ 0F85 77FFFFFF           jnz 00AD974B-----------每个DLL的函数是否处理
00AD97D4     8BDF                    mov ebx,edi
00AD97D6     8B03                    mov eax,dword ptr ds:[ebx]
00AD97D8     85C0                    test eax,eax
00AD97DA   ^ 0F85 0AFFFFFF           jnz 00AD96EA------------比较DLL是否处理完
00AD97E0     8A0424                  mov al,byte ptr ss:[esp]
00AD97E3     83C4 0C                 add esp,0C
00AD97E6     5D                      pop ebp
00AD97E7     5F                      pop edi
00AD97E8     5E                      pop esi
00AD97E9     5B                      pop ebx
00AD97EA     C3                      retn------------这里先F2下断

这里可以用F2下断了,没有被检测到,进入00AD97BB的call后:

00AD942C     55                      push ebp
00AD942D     8BEC                    mov ebp,esp
00AD942F     81C4 F8FEFFFF           add esp,-108
00AD9435     53                      push ebx
00AD9436     56                      push esi
00AD9437     57                      push edi
00AD9438     8B55 14                 mov edx,dword ptr ss:[ebp+14]
00AD943B     8B5D 08                 mov ebx,dword ptr ss:[ebp+8]
00AD943E     8DBD FAFEFFFF           lea edi,dword ptr ss:[ebp-106]
00AD9444     8BC2                    mov eax,edx
00AD9446     48                      dec eax
00AD9447     83E8 02                 sub eax,2
00AD944A     0FB630                  movzx esi,byte ptr ds:[eax]
00AD944D     8B45 10                 mov eax,dword ptr ss:[ebp+10]
00AD9450     83E8 02                 sub eax,2
00AD9453     0FB600                  movzx eax,byte ptr ds:[eax]
00AD9456     3B43 2C                 cmp eax,dword ptr ds:[ebx+2C]
00AD9459     76 06                   jbe short 00AD9461
00AD945B     8943 2C                 mov dword ptr ds:[ebx+2C],eax
00AD945E     EB 01                   jmp short 00AD9461
00AD9460     6933 C08A433B           imul esi,dword ptr ds:[ebx],3B438AC0
00AD9466     3BF0                    cmp esi,eax-----------在这里下F2断点,F9运行,观察esi的值,并注意数据框IAT
00AD9468     75 5E                   jnz short 00AD94C8---------这里也下断,看不同数值,跳转是否是成功
00AD946A     EB 01                   jmp short 00AD946D

如果看过我的上一篇脱文,这里大家应该都很熟悉了.在00AD9466及00AD9468 下断后,狂按F9吧,就知道esi的数值及那些数值

是进行IAT加密的了,我这里esi有三个值81,6A,53,其中esi的值为6A,53时00AD9468处的跳转成立,但两个数中只有当esi=6A时

才会对IAT进行加密,因此只要将6A改为53就可以避开IAT加密了.
想要的数据已经找到了,CTRL+F2重新载入,并以上步骤重新来到这里,我们来path避开加密.

好,就选00AD9468进行修改,先用OD 插件memory manage申请一个内存空间,为了方便我还是和以前一样用01640000,

把00AD9468 改为:
00AD9468 75F4  - E9 078A3500     JMP 01640000        然后下F2断点,F9运行中断后,F7跟进

把修改代码写进去:
01640000   - 0F84 F37548FF           je 00AD946D------这个是00AD946A 处jmp的地址
01640006     81FE 89000000           cmp esi,53
0164000C   - 0F84 427648FF           je 00AD94C8
01640012     BE 89000000             mov esi,53
01640017   - E9 387648FF             jmp 00AD94C8

写好代码后,F9运行中断在00AD9468,中断后取消断点.再F9运行,中断在00AD97EA处
看看数据窗口,DD 406400上下拉动鼠标,看看现在是不是得到所有的IAT了?起始4062E4,终点406E00.

004062D8  864B9963
004062DC  7BEF0054
004062E0  00000000
004062E4  77DA2410  ADVAPI32.RegQueryValueExA
004062E8  77DA17D8  ADVAPI32.RegCloseKey
004062EC  77DB63B1  ADVAPI32.RegSetValueExA
004062F0  77DA23D9  ADVAPI32.RegOpenKeyA
004062F4  77DA28BB  ADVAPI32.RegCreateKeyA
004062F8  00000000
004062FC  77C4513D  GDI32.GetObjectA
00406300  77C44B71  GDI32.GetDeviceCaps
00406304  77C4889D  GDI32.CreateFontIndirectA
00406308  77C41B98  ASCII "U?Q??
       .
       .
00406DD8  B8AFA4EE
00406DDC  39CE00EB
00406DE0  BA4B2F14
00406DE4  00940005
00406DE8  1301C118
00406DEC  5430F60A
00406DF0  00BD4F31
00406DF4  DF7DF51E
00406DF8  4BC76F9B
00406DFC  507E2C68
00406E00  00000000

取消00AD97EA处的断点,并将1640000处的修改代码及00AD9468   - E9 936BB600  jmp 01640000的修改
全部取消修改.然后shift+F9中断在INT3第二次异常处:

00AE7A43     90                      nop
00AE7A44     EB 01                   jmp short 00AE7A47
00AE7A46     6966 81 FE474674        imul esp,dword ptr ds:[esi-7F],744647>
00AE7A4D     05 31C040EB             add eax,EB40C031
00AE7A52     0231                    add dh,byte ptr ds:[ecx]
00AE7A54     C031 DB                 sal byte ptr ds:[ecx],0DB
00AE7A57     64:8F03                 pop dword ptr fs:[ebx]

此时CTRL+B搜索一下89,45,F0,B8,00,07,00,00,找到

00AD8FFA     33C0                    xor eax,eax
00AD8FFC     8945 F0                 mov dword ptr ss:[ebp-10],eax--找到这里
00AD8FFF     B8 00070000             mov eax,700
00AD9004     E8 4395FDFF             call 00AB254C----------------------记下这里的地址00AD9004,等下要用到
00AD9009     8945 E4                 mov dword ptr ss:[ebp-1C],eax
00AD900C     C645 EF 00              mov byte ptr ss:[ebp-11],0

然后ALT+M在CODE下断,shift+F9到达OEP处.到OEP后,CTRL+G:00AD9004(刚刚记下的地址,如果想知道为什么,请参考

LOVEBOOM,SYSCOM和林海雪源等大大的文章)
到00AD9004后开始path,就用才申请的内存空间01640000,00AD9004句修改为:

00AD9004  - E9 A28E3500     JMP 01640037

然后写下如何代码(抄来的):
01640000     BA 00104000             mov edx,401000----写好代码后在这里新建EIP
01640005     803A E8                 cmp byte ptr ds:[edx],0E8
01640008     75 12                   jnz short 0164001C
0164000A     8B42 01                 mov eax,dword ptr ds:[edx+1]
0164000D     03C2                    add eax,edx
0164000F     83C0 05                 add eax,5
01640012     3D 00001200             cmp eax,1260000----------前面记下的Call 壳数据
01640017     75 03                   jnz short 0164001C
01640019     EB 0C                   jmp short 01640027
0164001B     90                      nop
0164001C     42                      inc edx
0164001D     81FA D04F4000           cmp edx,404FD0  -----还是暂时用404FD0(我还没找到最好的)
01640023   ^ 72 E0                   jb short 01640005
01640025   - EB FE                   jmp short 01640025
01640027     8915 00016401           mov dword ptr ds:[1640100],edx
0164002D     60                      pushad
0164002E     FFE2                    jmp edx
01640030     90                      nop
01640031     90                      nop
01640032     90                      nop
01640033     90                      nop
01640034     90                      nop
01640035     90                      nop
01640036     90                      nop
01640037     60                      pushad
01640038     B8 E4624000             mov eax,4062E4-------IAT开始
0164003D     90                      nop
0164003E     3910                    cmp dword ptr ds:[eax],edx
01640040     75 20                   jnz short 01640062
01640042     8B0D 00016401           mov ecx,dword ptr ds:[1640100]
01640048     C701 FF150000           mov dword ptr ds:[ecx],15FF-----delphi语言写的程序用25FF,其他语言15FF
0164004E     8941 02                 mov dword ptr ds:[ecx+2],eax
01640051     61                      popad
01640052     90                      nop
01640053     8B15 00016401           mov edx,dword ptr ds:[1640100]
01640059     90                      nop
0164005A     90                      nop
0164005B     90                      nop
0164005C   ^ EB BE                   jmp short 0164001C
0164005E     90                      nop
0164005F     90                      nop
01640060     90                      nop
01640061     90                      nop
01640062     83C0 04                 add eax,4
01640065     3D 006E4000             cmp eax,406E00-------IAT结束
0164006A   ^ 7E D2                   jle short 0164003E
0164006C   ^ EB E3                   jmp short 01640051

2进制代码,方便粘贴:

BA 00 10 40 00 80 3A E8 75 12 8B 42 01 03 C2 83 C0 05 3D 00 00 12 00 75 03 EB 0C 90 42 81 FA D0
4F 40 00 72 E0 EB FE 89 15 00 01 64 01 60 FF E2 90 90 90 90 90 90 90 60 B8 E4 62 40 00 90 39 10
75 20 8B 0D 00 01 64 01 C7 01 FF 15 00 00 89 41 02 61 90 8B 15 00 01 64 01 90 90 90 EB BE 90 90
90 90 83 C0 04 3D 00 6E 40 00 7E D2 EB E3

然后F9运行一会,用LordPe纠正大小后dump,用ImportREC 1.6F修复,填上OEP=10CC,点IAT自动搜索,获得输入信息,全部为

有效指针,修复抓取文件。运行脱壳文件,能正常运行.收工.
这里感谢wangcai网友的提醒:
修复后的dumped_虽然能正常运行,但是运行程序后点菜单-----文件----打开,程序出错.修复如下:
OD打开dumped_,F9运行,然后点菜单-----文件----打开,程序停在这里:

00404FA7   \.  C2 0C00               retn 0C
00404FAA    $- FF25 1C654000         jmp dword ptr ds:[<&comdlg32.CommDlgE>;  comdlg32.CommDlgExtendedError
00404FB0       FF15 18654000         call dword ptr ds:[<&comdlg32.GetSave>;  comdlg32.GetSaveFileNameA
00404FB6       FF15 14654000         call dword ptr ds:[<&comdlg32.PageSet>;  comdlg32.PageSetupDlgA
00404FBC    $- FF25 10654000         jmp dword ptr ds:[<&comdlg32.FindText>;  comdlg32.FindTextA
00404FC2       FF15 0C654000         call dword ptr ds:[<&comdlg32.ChooseF>;  comdlg32.ChooseFontA
00404FC8       FF15 08654000         call dword ptr ds:[<&comdlg32.GetOpen>;  comdlg32.GetOpenFileNameA
00404FCE       FF15 20654000         call dword ptr ds:[<&comdlg32.GetFile>;  comdlg32.GetFileTitleA
00404FD4    .  0000                  add byte ptr ds:[eax],al--------------停在这里
00404FD6    .  0000                  add byte ptr ds:[eax],al
00404FD8    .  0000                  add byte ptr ds:[eax],al

对比没有加壳的程序发现从00404FA7到00404FCE都是JMP,而dumped_在修复过程中有的有的JMP被改成了call,将这些call修改

后原来的JMP,程序一切正常.

--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
最初由 windycandy 发布
delphi语言写的程序用25FF,其他语言15FF


感觉不一定吧

最初由 shoooo 发布
00C5B7EC 33C0 xor eax,eax
00C5B7EE 8AC3 mov al,bl
00C5B7F0 0145 10 add dword ptr ss:[ebp+10],eax
00C5B7F3 57 push edi
00C5B7F4 6A 00 push 0
00C5B7F6 8D4D E0 lea ecx,dword ptr ss:[ebp-20]
00C5B7F9 8B45 F4 mov eax,dword ptr ss:[ebp-C]
00C5B7FC 8B40 3C mov eax,dword ptr ds:[eax+3C]
00C5B7FF 8B55 FC mov edx,dword ptr ss:[ebp-4]
00C5B802 E8 6DB9FFFF call 00C57174
00C5B807 8945 FC mov dword ptr ss:[ebp-4],eax
00C5B80A 8B45 E0 mov eax,dword ptr ss:[ebp-20]
00C5B80D 8B00 mov eax,dword ptr ds:[eax]
00C5B80F E8 C0E6FFFF call 00C59ED4
00C5B814 8BD0 mov edx,eax
00C5B816 0255 DF add dl,byte ptr ss:[ebp-21]
00C5B819 8B4D FC mov ecx,dword ptr ss:[ebp-4] //这个点比较好

到了这里 [ebp-4C]是我们需要的导入函数的地址,dl中的值决定了是call(ff15)还是jmp(ff25)
dl中的值不同的程序是随机,找几个call 00EA0000进去出来看一下就知道当前的程序中哪个对应ff15,哪个对应ff25了
2006-4-23 17:58
0
雪    币: 219
活跃值: (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
搬个凳子坐前排
好好学习,天天向上。
2006-4-23 19:27
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
排排坐,吃果果
2006-4-23 19:36
0
雪    币: 219
活跃值: (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哈哈,终于搞定了。

呵呵,楼主的那个代码段跨段有点大了。

用脱壳机脱下来是最完美的,43K.

感觉比2.1简单多了。

             楼上(SHOOOO)马甲,被夹馅饼了吧。
2006-4-23 20:37
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
0164001D     81FA D04F4000           cmp edx,404FD0  -----还是暂时用404FD0(我还没找到最好的)
01640023   ^ 72 E0                   jb short 01640005
01640025   - EB FE                   jmp short 01640025
01640027     8915 00016401           mov dword ptr ds:[1640100],edx
0164002D     60                      pushad
0164002E     FFE2                    jmp edx
01640030     90                      nop

0164001D     81FA D04F4000           cmp edx,404FD0  -----还是暂时用404FD0(我还没找到最好的)
linex 和 machenglin  两位大哥说 Alt+M,看程序区段

404FD0这里是CODE的结束地址  哈哈

2006-4-23 21:16
0
雪    币: 175
活跃值: (2526)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好文,学习。
2006-4-23 21:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
usa
8
学习并支持!
2006-4-24 00:17
0
游客
登录 | 注册 方可回帖
返回
//