goodboy_wkx 发表于 2017-5-1 15:32

hopper 逆向分析 010 editor 授权过程

本帖最后由 goodboy_wkx 于 2017-5-1 23:07 编辑

分析木马也好,分析漏洞也好,分析收费程序的授权机制也好,都像是警察破案。
通过一些蛛丝马迹的线索不停的追踪、调查,然后会不断的有新的线索出现。
但是如果不顺利的话,很可能会发现自己之前的线索断了,这时就得重新寻找线索。
不管怎样,都要把最终的真相找到。我觉得这才是作为逆向分析爱好者的乐趣所在。


1、实验环境
操作系统: mac os x 10.12
调试工具:hopper disassemble v4
程序:010 editor for mac
官网地址:http://www.sweetscape.com/010editor/

2、开始分析
2.1、寻找线索
看一下正常执行时的整个流程,并从中获得线索。
在关于里面找到注册然后弹出注册的信息框,输入用户名和密码,点击 check license,然后提示 “Invalid name or password…….”,如图-1。
现在找到了第一条线索,记为线索1。线索1:stringInvalidNameOrPassword字符串“Invalid name or password…”。


图-1


2.2、分析线索1
打开 hopper disassembler v4,将010editor 拖拽到hopperdisassembler上,如下图:

通过hopper中的字符串查找定位到stringInvalidNameOrPassword出现的位置,如图-2。

图-2

再查看stringInvalidNameOrPassword在哪些地方被引用了。
选中stringInvalidNameOrPassword所在地址,按一下“X”键,显示出该地址的所有引用,如图-3。

图-3

双击图-3中的地址,即可显示出该调用地址处的反汇编代码,如图-4。
接下来就要分析 sub_1002e5f10 这个函数。到这里,我门又有了新的疑点:
1、      stringInalidNameOrPassword这条路是从哪里走过来的?
2、      该函数中有没有正确的路?如果有,哪么正确的路在哪里?
3、      正确的路与stringInalidNameOrPassword的路是在哪里走岔的?
上面的三个疑点都在 sub_1002e5f10 函数中找。

图-4

光标放在1002e69e4 处,然后点击工具栏中的CFG module 显示函数流程图如图-5。
   
图-5

总的来说loc_1002e6900 是一条错误的路(trial+invalidNameOrPassword)。
再找loc_1002e6900 的来源,如图-6。

图-6

再向上找,找 loc_1002e65b8 的来源,如图-7。可以看到是在loc_1002e6363处和正常的授权路分岔了。
关键是 ebx的值,如果ebx == 0xdb 该函数就走授权的路。
现在用伪代码模式查看这块代码,如图-8。这时,我们定位到了三个重要函数 sub_1000c9230 sub_1000c90e0 sub_1002e9e40。
其中sub_1002e9e40函数是用来联网校验授权信息的,这里就不进入该函数分析来。
ebx 的值是 sub_1000c9230 的返回值,所以如果能控制sub_1000c90e0 的返回值就能控制该函数走授权的路了。

图-7

图-8

进入sub_1000c90e0 函数进行分析,如图-9。sub_1000c90e0 的返回值有 0x113, 0xdb, 0x20c, 0xed, 0x71, 0x177, 0xf9,0x2f共8种。
其中0xdb是走的授权路线。在该函数中调用了sub_1000c9230 函数,如果能控制 sub_1000c9230 的返回值为0x2d 就能让sub_1000c90e0返回 0xdb。
其实为了保险起见可以将 sub_1000c90e0 函数中的第三行 rax = 0x113改成rax = 0xdb。这样就能保证 sub_1000c90e0 返回的是 0xdb。

图-9

函数分析sub_1000c9230。
先来查看该函数的所以引用。
00000001000c9106         call       sub_1000c9230 ;在sub_1000c90e0 函数中。
00000001002e62f2         call       sub_1000c9230 ;在sub_1002e5f10 函数中。
没有授权时,在sub_1002e5f10返回的是0xe7,在 sub_1000c90e0中返回的不是 0x2d。
函数sub_1000c9230的返回值有rax= 0x93, 0xe7, 0x2d,0x4e四种,每个返回值都有自己的特殊含义。
其中0x2d就是走授权道路的返回值;0x93 是tial 或者 Invalid name or password。

修改 sub_1000c9230函数使其只返回0x2d,我的修改方式是将
00000001000c9268         mov       r12d, 0x93
00000001000c926e         cmp       dword , 0x0
00000001000c9272         je          loc_1000c9552
修改成
00000001000c9268         mov       r12d, 0x2d
00000001000c926e         cmp       dword , 0x0
00000001000c9272         jmp       loc_1000c9552
00000001000c9277         nop
参照图-7,将sub_1002e5f10 函数中的
00000001002e631c         je      loc_1002e6363
修改成
00000001002e631c         jne      loc_1002e6363;目的是绕过sub_1002e9e40网络验证。
通过线索1,我们找到来正常授权的路,线索1的路也走完了。保存修改。
运行修改后的文件时,提示图-10

图-10


2.3寻找新线索
其实在提示图-10窗口之前有个窗口一闪而退,那个窗口提示的是什么哪?
通过录像的方式录下来然后慢放暂停。其实那个提示框是图-11。
现在我们又找到了新的线索(2条)。
线索2: stringLicensedTo = “Licensed to:”
线索3: stringInvalid license=“Invalid license”。


2.3.1分析线索2
线索2:stringLicensedTo = “Licensed to:”通过字符串查找并锁定到引用函数,分析函数流程如图-12。修改成如图-13。

图-11

图-12

图-13


2.3.2分析线索3
线索3: stringInvalid license=“Invalid license”。通过字符串查找并锁定到引用函数为sub_1002e7620。分析函数 sub_1002e7620 流程如图-14

图-14

简化一下如下:
if (eax > 0xda)//loc_1002e782a
{
         if       (eax > 0x20b)//1002e78b2
         {      
                   if       ( eax != 0x20c)//1002e7b0f
                   {
                            goto 1002e8413;
                   }
                   else
                   {
                            Upgrade Required
                   }
         }
         else
         {
                   if( eax > 0x176)
                   {
                            goto 1002e7b73;//Evaluation
                   }
                   else
                   {
                            if(eax > 0x112)
                            {
                                     if(eax != 0x113)//1002e7da4
                                             invalid license
                                     else
                                             days left
                            }      
                            else
                            {
                                     if(eax == 0xdb)
                                             goto 1002eb295;//OK registered
                                     else
                                             envaluied version
                            }               
                   }   
         }
}
else if(eax != 0x2f)
{
         goto 1002e8413;//Evaluation Version
}
else
{
         Bad Clock Dat;
}
可以修改成
if (eax > 0xda){
goto 1002eb295;//OK registered
}
else
{
goto 1002eb295;//OK registered
}



00000001002e782a         mov       eax, dword                       ; CODE XREF=sub_1002e7620+487, sub_1002e7620+501
00000001002e7831         cmp       eax, 0xda
00000001002e7836         ja      loc_1002e78b2
修改成
loc_1002e782a:
00000001002e782a         mov       eax, dword                       ; CODE XREF=sub_1002e7620+487, sub_1002e7620+501
00000001002e7831         jmp       loc_1002e8295
00000001002e7836         nop
00000001002e7837         nop
   
3、破解后的文件
破解后的文件以上传到52破解上了,地址:http://www.52pojie.cn/thread-604569-1-1.html

aiCc 发表于 2017-5-1 18:05

哇 前排支持楼主!                                                               

smile1110 发表于 2017-5-2 19:26

Hopper Disassembler是苹果系统用的反编译工具把,那你安装的010 editor也是苹果系统版本的吗?哦,仔细看了一下文章,还真是哦

夏雨微凉 发表于 2017-5-1 15:41

厉害厉害厉害

酒醒黄昏 发表于 2017-5-1 18:01

目测要火   前排占位

★邪梦 发表于 2017-5-1 18:18

感谢楼主分享,学习了,

goodboy_wkx 发表于 2017-5-1 18:35

破解,用了一天,整理图片,整理逻辑,还要整理帖子的格式用了半天

校2012 发表于 2017-5-1 20:17

谢谢分享!看看吧可能需要呢

mliguo 发表于 2017-5-1 20:21

感谢楼主分享{:301_993:}

雫Hao洋洋 发表于 2017-5-2 09:02

收藏了。谢谢分享

Three_fish 发表于 2017-5-2 10:54


谢谢分享!
页: [1] 2 3
查看完整版本: hopper 逆向分析 010 editor 授权过程