【破解作者】 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,程序一切正常.
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!