东方青石 发表于 2019-1-29 01:11:12

某自用软件注册算法分析及处理过程及总结

本帖最后由 东方青石 于 2019-1-29 01:14 编辑

起因:因试用目前比较火的脚本下了个编辑器,但有试用期限,软件虽不贵,但因个人并不是经常要用,仅仅因为兴趣,突然想起X一番。
思路:既然是兴趣,优先分析算法,
    1.首先PEID检测,无壳,VC++源码。心里暗喜。
    2.OD加载,运行发现代码会变地址,F8一次代码地址变一次,部分代码显示??,程序一开始开了N多线程,以为有线程抗调试导致。
    3.用x32dbg发现加载正常,字符串搜索后,开始分析过程
    4.关键部分代码:
         
51F04B16 | 6A 03                  | push 3                                       | 可能是功能标志
51F04B18 | 50                     | push eax                                       | 公钥信息指针
51F04B19 | 8D95 78FFFFFF            | lea edx,dword ptr ss:                  | 注册码明文位置
51F04B1F | 8D4D D8                  | lea ecx,dword ptr ss:                  |ss:这个变量指针作为参数
51F04B22 | E8 F9FCFFFF            | call <*******sub_51F04820>         | 调用RSA公钥解密,注册码实际是用私钥加密的
51F04B27 | 83C4 08                  | add esp,8                                    | ,EAX解密地址
51F04B2A | 8D4D A8                  | lea ecx,dword ptr ss:                  | 解密后拿机器码和解密的返回值比较,不对说明出错


51F04B3B | E8 90D10D00            | call <*******.sub_51FE1CD0>         | 读取机器码
51F04B40 | 8378 14 10               | cmp dword ptr ds:,10                   | 前面计算得到的8F
51F04B44 | 8B50 10                  | mov edx,dword ptr ds:                  | 长度80
51F04B47 | 72 02                  | jb *******.51F04B4B                   |
51F04B49 | 8B00                     | mov eax,dword ptr ds:                     | 机器码


       |
51F04B5A | 52                     | push edx                                       | 机器码长度
51F04B5B | 50                     | push eax                                       | 传入机器码
51F04B5C | 0F43CF                   | cmovae ecx,edi                           
51F04B5F | 53                     | push ebx                                       | 机器码长度
51F04B60 | 51                     | push ecx                                       | 这里存了一组数据,用于比对,ECX中的数据为RSA解密数据地址,如果正确应该是在这里直接比对正确
51F04B61 | E8 CAE7F1FF            | call <*******.比较ecx和edx字符串>         | 比较
51F04B66 | 83C4 10                  | add esp,10                                     |
51F04B69 | 84C0                     | test al,al                                     |
51F04B6B | 75 35                  | jne *******.51F04BA2                   | 比对上直接跳,否则要一定步骤后再比较


一开始不知道是RSA加密,只知道那是一个加密过程,因此分析花了2天时间,查到真正的核心部分发现是RSA加密后还不死心以为软件作者可能会因为失误把私钥搞进来,然而分析了所有加密过程都没看到,只知道是用公钥解密,其他加密函数均无调用。
根据RSA特点说明注册码经过公钥解密应该能拿到机器码信息,解密后应该是机器码或者机器码相关处理后的数据,查了比对过程,本程序是机器码直接比较。分析了一下机器码的产生过程,人都看晕了,各种MMX指令
由于无法通过追码逆向分析加密过程,因此考虑爆破处理。
51F04B6B | 75 35 改74 35即可过注册


该程序还有授权时间的检测,程序在启动后会联网检查授权。
如果只改个别过网络授权检查地方,不会报错,但电脑CPU瞬间会爆棚,我I7-8550瞬间增加了50%的占用,电脑风扇急速运行。因此必须把所有授权日期验证点全改完。此处就不上代码了。
心血来潮,作为论坛骨灰级潜水员难得发文一次。因为学习和工作环境基本没搞过了。现在心血来潮搞搞。
因程序怕涉及违反版规,因此部分打*掩盖。


本程序核心代码全靠DLL调用,EXE仅仅是UI设计,做的还是比较好的作品。
OD无法识别部分代码原因:本程序用了CPUID,MMX,还有涉及GPU之类的代码。导致代码地址在OD中不对,再加上动态加载每次地址都有变化,因此OD调试会变地址,我没有试附加运行,不知附加运行会不会。


另本想用PYG DLL劫持,结果发现怎么也HOOK不到正确API,我关于PYG DLL的疑问见传送门:https://www.chinapyg.com/forum.p ... 1&extra=#pid2181968
x32修改不知道怎么弄,只好上IDA,又下了个IDA修改,又搞了2个小时,终于把DLL给修改了,软件并没有加DLL文件的校验,改完就好了。
就这些啦,难得发文一次,有需要的讲究看看把{:biggrin:}

东方青石 发表于 2019-1-29 01:19:54

本帖最后由 东方青石 于 2019-1-29 08:13 编辑

补充一下。这程序实际确实是有几种对比方式的,除了直接对比还有机器码的变化的对比,符合其中一种就型。解密均是RSA公钥解密
页: [1]
查看完整版本: 某自用软件注册算法分析及处理过程及总结