飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2651|回复: 1

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

[复制链接]
  • TA的每日心情
    开心
    2024-1-6 12:21
  • 签到天数: 90 天

    [LV.6]常住居民II

    发表于 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:[ebp-88]                  | 注册码明文位置
    51F04B1F | 8D4D D8                  | lea ecx,dword ptr ss:[ebp-28]                  |  ss:[ebp-0x28]这个变量指针作为参数
    51F04B22 | E8 F9FCFFFF              | call <*******sub_51F04820>           | 调用RSA公钥解密,注册码实际是用私钥加密的
    51F04B27 | 83C4 08                  | add esp,8                                      | ,EAX解密地址
    51F04B2A | 8D4D A8                  | lea ecx,dword ptr ss:[ebp-58]                  | 解密后拿机器码和解密的返回值比较,不对说明出错


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


           |
    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文件的校验,改完就好了。
    就这些啦,难得发文一次,有需要的讲究看看把

    评分

    参与人数 2威望 +6 飘云币 +8 收起 理由
    tree_fly + 4 + 6 PYG有你更精彩!
    动物凶猛 + 2 + 2 感谢发布原创作品,PYG有你更精彩!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-1-6 12:21
  • 签到天数: 90 天

    [LV.6]常住居民II

     楼主| 发表于 2019-1-29 01:19:54 | 显示全部楼层
    本帖最后由 东方青石 于 2019-1-29 08:13 编辑

    补充一下。这程序实际确实是有几种对比方式的,除了直接对比还有机器码的变化的对比,符合其中一种就型。解密均是RSA公钥解密
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表