首页
社区
课程
招聘
[求助]ASProtect 1.23 RC4 - 1.3.08.24 -> Alexey Solodovnikov 脱壳,求大牛
发表于: 2013-11-26 09:28 9069

[求助]ASProtect 1.23 RC4 - 1.3.08.24 -> Alexey Solodovnikov 脱壳,求大牛

2013-11-26 09:28
9069
小弟不才,脱壳非常之水,特此发求助帖,求大神指点。
ASProtect 1.23 RC4 - 1.3.08.24 -> Alexey Solodovnikov 这个壳网上很多教程,通常用的是最后一次异常法直接定位到后面的关键代码。然后,我取消忽略所有异常,patch od,调试,发现很多通常脱壳的方法都不行,shift+f9直接跑飞。后来我一直跟踪啊跟踪,发现最后到一个ZwContinue的地方,定位[[esp+4]+B8],在看雪上另外一篇帖子上说道这是SEH context的eip指针,我跟踪过去,下了一个HE,并没有断下。无奈了

这个壳感觉有反调试,因为在你F2和下HE的结果是完全不一样的,所以基本上我下的很多断点都是硬断,防止程序检测。

具体快速定位ZwContinue是,装载程序后 HE GetCurrentThreadId ,F9 然后ret到程序领空之后,删掉该断点,HE 77590133。

77590133    0AC0            OR AL,AL
77590135    74 0C           JE SHORT ntdll_1.77590143
77590137    5B              POP EBX
77590138    59              POP ECX
77590139    6A 00           PUSH 0
7759013B    51              PUSH ECX
7759013C    E8 AFFD0000     CALL ntdll_1.ZwContinue



但如果在ZwContinue这里直接跑F9,程序就跑起来了。到这里已经无解,讲诉比较简单,求指教问题。

可执行文件是,ef find,我将程序上传 ,link:

http://pan.baidu.com/s/1d43eq
密码:fxc9

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 627
活跃值: (663)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
2
"ASProtect 1.23 RC4"因为太古老,人们已经不玩这个了!
看了一下楼主的目标,efsoftware的"EF Find v5.30",又下载了其最近的版本"EF Find v7.30"(发布日期:2013-09-30,仍然用的这个古典壳),感觉它的注册算法有点意思,简单说说。

"EF Find"是一款搜索软件,用于搜索7-Zip,ACE,ARC,ARJ,BZIP2,CAB,CPIO,GZIP,IMG,ISO (ISO9660),LHA,RAR,RPM,SFX,SQX,TAR,TGZ,ZIP和ZOO压缩文件里的文件、文本和正则表达式。
试用版的限制:
   . 30天试用
   . 只显示第一个匹配文件名;其它文件名以"-------.---"替代
   . NAG窗

先回答楼主的问题。
楼主已经注意到,ASProtect使用"SE Handler"来实现跳转,或者说摆脱新手的单步跟踪(其实也谈不上)。
引发异常处有(以EF Find v5.30为例):
#1:
B841A4   XOR [EAX], EAX
B841A6   JMP SHORT 00B841A9

#2:
B83AC1   XOR [EAX], EAX
B83AC3   JMP SHORT 00B83AC6

...

#25:
B84C22   XOR [EAX], EAX
B84C24   JMP SHORT 00B84C27

#26:
B839EC   XOR [EAX], EAX
B839EE   POP DWORD PTR FS:[0]

请注意这些指令的地址已经不属于程序领空,位于ASProtect的内部DLL内(基址00B70000,其它机器可能不同)。这些地方的EAX已经置0,所以"XOR [EAX], EAX"会触发内存访问异常。
跟踪"SE Handler"最终会来到ntdll.ZwContinue,其PCONTEXT偏移B8处指向异常处理结束后应返回的地址。这个地址总是指向"XOR [EAX], EAX"后的下一条指令。如上面的:B841A6,B83AC3,……,B84C24和B839EE。
楼主失误之处是在这些地址上设置“硬件执行断点”,这是断不下来的!
正确的方法是设置“普通执行断点F2”,就可以断下来了。要注意的是,有时断下来后标志寄存器EFLAG的单步会置位,清零即可。

所以为方便,OD的“异常”标签中应勾选“忽略内存访问异常”,留给目标自己去处理,省去每次SHIFT+F9的麻烦。

如果是为了学习ASProtect,可以这样一步一步跟下去。不过这个目标并没有使用ASProtect提供的注册机制,而是自己实现了一套注册方法,跟壳代码就没有任何意义,应该从OEP后开始。
想了解这个版本ASProtect的注册体系,可参考我在“小白在破解一个注册表重启验证的软件时遇到的问题,求助。”里的回复。

通过跟踪壳代码会找到到达OEP或NEAR OEP(在OEP代码被偷时)的最后一“跳”:
00401000 > 68 01105000         PUSH    00501001         ; Entry point
00401005   E8 01000000         CALL    0040100B
0040100A   C3                  RETN                     ; to 00501001
0040100B   C3                  RETN                     ; to 0040100A

00501001   60                  PUSHAD                   ; in ".fn" section
00501002   E8 03000000         CALL    0050100A
...
00B97295   894424 1C           MOV     [ESP+1C], EAX    ; EAX=004AA2EC
00B97299   61                  POPAD
00B9729A   50                  PUSH    EAX
00B9729B   C3                  RETN                     ; to 004AA2EC

004AA2EC   E8 95E10000         CALL    004B8486         ; OEP / NEAR OEP
004AA2F1   E9 78FEFFFF         JMP     004AA16E

这里注意到PUSHAD/POPAD指令结构,一个使用“ESP定律”很好的提示。不幸的是,“ESP定律”脱壳在这里不起作用,“软硬不吃”。
但可通过几个简单步骤迅速来到OEPNEAR OEP004AA2EC处。要点是ASProtect服“软”不服“硬”,后来将这几个步骤写为脚本以迅速定位OEP,且通用于该ASProtect版本加壳的目标。
因为想弄清楚它的注册算法,并不关心ASProtect本身,所以在OD载入目标后每次都运行这个脚本作为开始,来快速到达需要关注的地址。

也可以采用脱壳的方式,方便“破解”及“汉化”。在恰当的地方、经过适当地处理可得到完美脱壳的目标程序,甚至经ASPack压缩的内部DLL。
“破解”并不容易,涉及很多地方及“暗桩”;另外,作者还使用了自己的代码来进行文件自校验。所以“注册”更简单和安全,同时还适用于它的x64版本。

注册通过与主程序EFFind.exe相同文件夹下的授权文件"EFFIN.LIC"来实现,其内容为:
EF Find distribution license

Copyright (c) 1994-2013, Emil Fickel
All rights reserved.

This copy is licensed to:
Name      : MistHill
Company   : bbs.pediy.com
Serial No.: 182140-24614-90783210
Reg.ID.   : BLC842C95RI;CM48FMBLBM3;814L2M2L3KA5B1653O:8AN3R4:AR61;7F

Warning: This product is licensed to you pursuant to the terms of the
author license agreement included with the original software.
It is protected by copyright law and international treaties.
Unauthorized reproduction or distribution may result in severe civil and
criminal penalties, and will be prosecuted to the maximum extent possible
under the law.

One registered copy of this software may be dedicated to a single
person who uses the software on one or more computers or to a single
workstation used by multiple people.

有效授权为"Reg.ID."字段的字符串内容,是经过某种简单算法的编码。出于众所周知的原因,这里帖出的内容解码后是无法正确注册的。
经编码的"Reg.ID."包括以下字段:
   . 序列号
   . 授权文件的时间戳
   . 授权文件内容的校验和
   . 用户名校验和
   . 序列号校验和
   . 组织/公司名校验和
   . 以上三项字符串的校验和

总的来说,整个体系设计得还算不错,检测方面用到了定时器和多线程等手段,有的检测要在特定情况下才出现。
缺点是各个算法相对比较简单。另外,没有进行硬件锁定,泄露的授权文件适用于其他机器,所以它的黑名单会随版本的更新越来越长。

Keygen需要完成的任务:
1) 找到它的解码代码,并根据解码算法写编码算法。
2) 找到各校验和的算法,填写到相应字段中。

"EF Find 5.30"和"EF Find 7.30"算法完全一致,授权文件"EFFIN.LIC"是通用的。
这个软件本身没有太大意义,Windows已经集成了桌面搜索功能,不知道是否支持压缩文件和正则表达式,感觉把它作为CrackMe或KeygenMe来玩更有意思一些。

上传的附件:
2013-12-2 18:10
0
雪    币: 19
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
看完之后瞬间觉得我的逆向都弱爆了。感谢大牛提供注册思路。
2013-12-5 17:18
0
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
差点错过了misthill的精彩分析。好!
2013-12-5 17:54
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
膜拜misthill
2013-12-5 21:58
0
雪    币: 19
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
哭了,搞了两天了,依然没弄出来正确的注册文件的Reg.ID。求笔记啊,misthill 。
2013-12-6 15:58
0
雪    币: 627
活跃值: (663)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
7
两天的时间不会浪费,曾经一个目标我断断续续地弄了几个月才搞定,这期间学了不少东西。
作为提示,下面给出"EF Find 7.30"的关键位置,抱歉我只有这个版本的笔记。
[FONT="Courier"]004282B3   85ED              TEST    EBP, EBP           ; pointer to EFFIN.LIC content
004282B5   74 11             JE      SHORT 004282C8
004282B7   8B15 C8F25A00     MOV     EDX, [5AF2C8]
004282BD   89AA 8C060000     MOV     [EDX+68C], EBP
004282C3   E8 4888FFFF       CALL    00420B10
...[/FONT]

调用00420B10为"Reg.ID."解码代码及黑名单比对:
[FONT="Courier"]00420B10   56                PUSH    ESI
00420B11   8B35 C8F25A00     MOV     ESI, [5AF2C8]
00420B17   81C6 E8060000     ADD     ESI, 6E8           ; pointer to encoded/decoded Reg.ID.
00420B1D   74 40             JE      SHORT 00420B5F
00420B1F   53                PUSH    EBX
00420B20   33C9              XOR     ECX, ECX
00420B22   57                PUSH    EDI
00420B23   8D79 39           LEA     EDI, [ECX+39]
00420B26   8A0431            MOV     AL, [ECX+ESI]
00420B29   3C 40             CMP     AL, 40
00420B2B   73 16             JNB     SHORT 00420B43
00420B2D   8BD1              MOV     EDX, ECX
00420B2F   81E2 03000080     AND     EDX, 80000003
00420B35   79 05             JNS     SHORT 00420B3C
00420B37   4A                DEC     EDX
00420B38   83CA FC           OR      EDX, FFFFFFFC
00420B3B   42                INC     EDX
00420B3C   2AC2              SUB     AL, DL
00420B3E   880431            MOV     [ECX+ESI], AL
00420B41   EB 14             JMP     SHORT 00420B57
00420B43   0FB6C0            MOVZX   EAX, AL
00420B46   83E8 41           SUB     EAX, 41
00420B49   99                CDQ
00420B4A   BB 0A000000       MOV     EBX, 0A
00420B4F   F7FB              IDIV    EBX
00420B51   80C2 30           ADD     DL, 30
00420B54   881431            MOV     [ECX+ESI], DL
00420B57   41                INC     ECX
00420B58   83EF 01           SUB     EDI, 1
00420B5B   75 C9             JNZ     SHORT 00420B26
00420B5D   5F                POP     EDI
00420B5E   5B                POP     EBX
00420B5F   A1 C8F25A00       MOV     EAX, [5AF2C8]
00420B64   05 12050000       ADD     EAX, 512           ; pointer to Serial No.
00420B69   50                PUSH    EAX
00420B6A   E8 61D6FFFF       CALL    0041E1D0           ; blacklist checking
00420B6F   83C4 04           ADD     ESP, 4             ; ret EAX=00000001 if passed
00420B72   5E                POP     ESI
00420B73   C3                RETN[/FONT]

整个解码代码属于简单的变换,不涉及密码学的内容,Keygen需要根据这段代码逆回去写编码代码。
调用0041E1D0为将当前注册码与两张黑名单比较,示例序列号是我伪造的,当然不在黑名单中。

前帖示例"EFFIN.LIC"里的"Reg.ID."解码前:
BLC842C95RI;CM48FMBLBM3;814L2M2L3KA5B1653O:8AN3R4:AR61;7F
"Reg.ID."解码后:
112541265788222552111218802122013002104234850317490760945

请注意它全为数字,前面说过序列号(Serial No.)应该是包含在里面的。现在这串数字没有与序列号对应的部分,所以这个"Reg.ID."注册失败。

这个位置非常重要!从这里开始监视对这串数字的读取,就可以顺利将你引导到各校验和的验证、注册码的比对的关键地方,从而搞清楚这串数字各字段的具体含义。

如果将整个walkthrough帖出来,游戏就没法玩了!对真正想学习逆向的人也无益处,所以抱歉只能公开这些。
2013-12-9 12:01
0
雪    币: 19
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
好的,十分感谢
因为最近在做一些编程上的东西,所以现在才看到。
2013-12-16 16:11
0
游客
登录 | 注册 方可回帖
返回
//