windycandy 发表于 2006-4-23 17:41:42

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

【破解作者】 windycandy
【使用工具】 OD,PEID0.94,LordPE.ImportREC1.6F
【破解平台】 WinXP
【软件名称】 ASProtect SKE V2.2及 V2.3简单加壳的98notepad
【软件下载】 https://www.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:         ; 不允许锁定前缀
004010DD   3C 22                   cmp al,22
004010DF   75 1B                   jnz short NOTEPAD.004010FC
004010E1   56                      push esi
004010E2   FF15 F4644000         call dword ptr ds: ---USER32.CharNextA--API所在段4064000
004010E8   8BF0                  mov esi,eax
004010EA   8A00                  mov al,byte ptr ds:
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:,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:   ; USER32.CharNextA
00401107   8038 20               cmp byte ptr ds:,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:,744647>
00AE7A4D   05 31C040EB             add eax,EB40C031
00AE7A52   0231                  add dh,byte ptr ds:
00AE7A54   C031 DB               sal byte ptr ds:,0DB
00AE7A57   64:8F03               pop dword ptr fs:
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:,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:
00AE8744   8B00                  mov eax,dword ptr ds:
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:            这个CALL是进行IAT处理,
00AD97C3   83C0 02               add eax,2
00AD97C6   03F8                  add edi,eax
00AD97C8   8A1F                  mov bl,byte ptr ds:
00AD97CA   47                      inc edi
00AD97CB   3A5E 34               cmp bl,byte ptr ds:
00AD97CE   ^ 0F85 77FFFFFF         jnz 00AD974B-----------每个DLL的函数是否处理
00AD97D4   8BDF                  mov ebx,edi
00AD97D6   8B03                  mov eax,dword ptr ds:
00AD97D8   85C0                  test eax,eax
00AD97DA   ^ 0F85 0AFFFFFF         jnz 00AD96EA------------比较DLL是否处理完
00AD97E0   8A0424                  mov al,byte ptr ss:
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:
00AD943B   8B5D 08               mov ebx,dword ptr ss:
00AD943E   8DBD FAFEFFFF         lea edi,dword ptr ss:
00AD9444   8BC2                  mov eax,edx
00AD9446   48                      dec eax
00AD9447   83E8 02               sub eax,2
00AD944A   0FB630                  movzx esi,byte ptr ds:
00AD944D   8B45 10               mov eax,dword ptr ss:
00AD9450   83E8 02               sub eax,2
00AD9453   0FB600                  movzx eax,byte ptr ds:
00AD9456   3B43 2C               cmp eax,dword ptr ds:
00AD9459   76 06                   jbe short 00AD9461
00AD945B   8943 2C               mov dword ptr ds:,eax
00AD945E   EB 01                   jmp short 00AD9461
00AD9460   6933 C08A433B         imul esi,dword ptr ds:,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.

004062D8864B9963
004062DC7BEF0054
004062E000000000
004062E477DA2410ADVAPI32.RegQueryValueExA
004062E877DA17D8ADVAPI32.RegCloseKey
004062EC77DB63B1ADVAPI32.RegSetValueExA
004062F077DA23D9ADVAPI32.RegOpenKeyA
004062F477DA28BBADVAPI32.RegCreateKeyA
004062F800000000
004062FC77C4513DGDI32.GetObjectA
0040630077C44B71GDI32.GetDeviceCaps
0040630477C4889DGDI32.CreateFontIndirectA
0040630877C41B98ASCII "U嬱Q僥?
       .
       .
00406DD8B8AFA4EE
00406DDC39CE00EB
00406DE0BA4B2F14
00406DE400940005
00406DE81301C118
00406DEC5430F60A
00406DF000BD4F31
00406DF4DF7DF51E
00406DF84BC76F9B
00406DFC507E2C68
00406E0000000000

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

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

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

00AD8FFA   33C0                  xor eax,eax
00AD8FFC   8945 F0               mov dword ptr ss:,eax--找到这里
00AD8FFF   B8 00070000             mov eax,700
00AD9004   E8 4395FDFF             call 00AB254C----------------------记下这里的地址00AD9004,等下要用到
00AD9009   8945 E4               mov dword ptr ss:,eax
00AD900C   C645 EF 00            mov byte ptr ss:,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:,0E8
01640008   75 12                   jnz short 0164001C
0164000A   8B42 01               mov eax,dword ptr ds:
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:,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:,edx
01640040   75 20                   jnz short 01640062
01640042   8B0D 00016401         mov ecx,dword ptr ds:
01640048   C701 FF150000         mov dword ptr ds:,15FF-----delphi语言写的程序用25FF,其他语言15FF
0164004E   8941 02               mov dword ptr ds:,eax
01640051   61                      popad
01640052   90                      nop
01640053   8B15 00016401         mov edx,dword ptr ds:
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:,al--------------停在这里
00404FD6    .0000                  add byte ptr ds:,al
00404FD8    .0000                  add byte ptr ds:,al

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

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




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

[ 本帖最后由 windycandy 于 2006-4-24 12:34 编辑 ]

machenglin 发表于 2006-4-23 20:52:01

学习+支持。
期待stolen code的成功!:)

canmd 发表于 2006-4-23 22:25:37

1.其中esi的值为6A,53时00AD9468处的跳转成立,但两个数中只有当esi=6A时

才会对IAT进行加密,因此只要将6A改为51就可以避开IAT加密了.这个下面没有提示怎么判断的?
完全照你步骤做的还是出现错误,上面那个也是这样。请帮帮我看看怎么回事?

[ 本帖最后由 canmd 于 2006-4-23 23:12 编辑 ]

飘云 发表于 2006-4-24 06:43:37

原帖由 canmd 于 2006-4-23 22:25 发表
1.其中esi的值为6A,53时00AD9468处的跳转成立,但两个数中只有当esi=6A时

才会对IAT进行加密,因此只要将6A改为51就可以避开IAT加密了.这个下面没有提示怎么判断的?
完全照你步骤做的还是出现错误,上面那个也是 ...


感觉兄弟是在 2003下操作的~

飘云 发表于 2006-4-24 06:45:34

原帖由 windycandy 于 2006-4-23 17:41 发表
【破解作者】 windycandy
【使用工具】 OD,PEID0.94,LordPE.ImportREC1.6F
【破解平台】 Win9x/NT/2000/XP
【软件名称】 菜鸟学习脱壳之ASProtect 2.1x SKE简单加壳的98NOTEPAD(MC++)
【软件下载】 http://bb ...


主要是 stolen code ~~~

这是重点难点.

期待...

wynney 发表于 2006-4-24 08:25:58

提示1660000就知道第2个patch代码没有成功

与狼共舞 发表于 2006-4-24 13:14:57

楼主有没有搞过。ESI值为四个的?
如何改呢?
烦请举个例。。。

而且楼主所说的,重点1,那个值,好像是有两个,我在脚本里,改成其中一个时,就提示另一个异常。

何解?是否是因为ESI值是四个的原因?

[ 本帖最后由 与狼共舞 于 2006-4-26 11:22 编辑 ]

windycandy 发表于 2006-4-24 13:19:20

注意:这里提供的2进制代码,是这个我这个例子的代码,不同的程序需要做相应的修改的

canmd 发表于 2006-4-26 04:55:20

原帖由 飘云 于 2006-4-24 06:43 发表



感觉兄弟是在 2003下操作的~
不是呀,是OEM XP2 PRO,我用脚本就没问题,脱出来的东西是好好的,
可以运行,不知道什么原因。我照着做了不下20次,好郁闷,这个壳的太难了

yzslly 发表于 2006-4-26 09:36:02

学习中,谢谢
页: [1] 2 3
查看完整版本: ASProtect SKE V2.2及 V2.3简单加壳的98notepad[脱文]