飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 19571|回复: 22

[原创] 外挂海万能模块 内附注册功能 破解可行性分析

[复制链接]
  • TA的每日心情
    开心
    2019-2-21 12:33
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    发表于 2007-8-23 23:48:57 | 显示全部楼层 |阅读模式
    【破文标题】外挂海万能模块 内附注册功能 破解可行性分析
    【破文作者】王猛
    【作者邮箱】12985462@QQ.com
    【作者主页】www.81mil.cn
    【破解工具】OllyDBG v1.10
    【破解平台】Windows XP Pro SP2
    【软件名称】外挂海万能模块
    【软件大小】
    【原版下载】
    【保护方式】
    【软件简介】
    一款可以制作外挂的但是又不仅仅只能用来制作外挂的易语言永久免费模块

    【破解声明】逆向研究仅供分析
    ------------------------------------------------------------------------
    【破解过程】
    我们在易语言中可以很容易的看出到该模块的信息,这是一款于外挂作坊同类但是功能要繁杂很多的永久免费模块。今
    天,我就分析一下该模块的内附的“注册码验证”函数如何破解!

    模块信息:
            模块名称:外挂海万能模块
            作者:小烦*烦者不凡
            版本:1.5

            永久免费模块-让易语言全民化
            打造超强功能,成就模块经典!

    首先,我们写一个简单的例程检验来检验一下该模块的强度。见附带的 注册测试.e。请注意,在该例程中用以验证的核
    心算法是:注册码验证 (编辑框2.内容, , “334455”, 编辑框1.内容)。 使用 易语言 v4.5 PYG破解版 编译后在
    OllyDBG中载入。

    我们在用户名中输入“王猛”,并点击“验证”按钮开始。CrackME将弹出错误对话框,告诉我们密码错误。在OD中按
    F12接着按ALT+F9,点击错误提示框的“确定”按钮。程序停在了:

    100691A6      5F               POP     EDI                                 ; 0015F859

    这句上边5行代码是一个完整的 MessageBoxA 调用,这些代码处于易语言核心支持库中。这个MessageBoxA 调用产生了
    我们刚才看到的错误提示对话框。我们接着按Ctrl+F9 3次,返回到了主程序领空。现在停于:

    00403DCD      C3               RETN

    这里便是E语言真实的流程,解密易语言经常性下断后要在库里转一转才能找到实际的易语言流程。我们在这里向上找代
    码触发错误的流程。

    00403D94      68 04000080      PUSH    80000004
    00403D99      6A 00            PUSH    0
    00403D9B      68 53314000      PUSH    403153
    00403DA0      68 01030080      PUSH    80000301
    00403DA5      6A 00            PUSH    0
    00403DA7      68 00000000      PUSH    0
    00403DAC      68 04000080      PUSH    80000004
    00403DB1      6A 00            PUSH    0
    00403DB3      68 5C314000      PUSH    40315C
    00403DB8      68 03000000      PUSH    3
    00403DBD      BB 00030000      MOV     EBX, 300
    00403DC2      E8 5F520000      CALL    00409026                            ; 这里调用库函数:信息框();
    00403DC7      83C4 28          ADD     ESP, 28                             ; 来显示出错信息。
    00403DCA      8BE5             MOV     ESP, EBP
    00403DCC      5D               POP     EBP
    00403DCD      C3               RETN

    既然我们已经知道了错误提示是 00403D94 弹出来的,向上顺藤摸瓜找到谁调用了 00403D94 就是了。没走几步,我们
    便可以发现 00403D53 跳向了注册失败提示。

    00403D46      53               PUSH    EBX
    00403D47      E8 E0520000      CALL    0040902C                     
    00403D4C      83C4 04          ADD     ESP, 4                             
    00403D4F      837D E8 01       CMP     DWORD PTR SS:[EBP 18], 1
    00403D53      0F85 3B000000    JNZ     00403D94                            ; 跳向注册失败提示。

    在 00403D53 上边有一个CMP比较指令,还是一句CALL 0040902C,这段代码就是关键代码,0040902C便是重要的注册验
    证CALL。我们接着再向上找。在 00403CEF 我们看到了这样的代码:

    00403CEF      B8 30314000      MOV     EAX, 403130                         ; ASCII "334455"


    334455 是我刚才设置的加密字串,郁闷吧!知道了加密字串根据这个模块的函数手册,直接做注册机都可以了。我们把
    这里当作问题一!我们接着向上在 00403CB5 下断点,输入用户名密码开始调试。

    00403CB5      6A FF            PUSH    -1
    00403CB7      6A 08            PUSH    8
    00403CB9      68 6B040116      PUSH    1601046B
    00403CBE      68 01000152      PUSH    52010001
    00403CC3      E8 70530000      CALL    00409038                            ; 读取注册码
    00403CC8      83C4 10          ADD     ESP, 10
    00403CCB      8945 FC          MOV     DWORD PTR SS:[EBP 4], EAX
    00403CCE      6A FF            PUSH    -1
    00403CD0      6A 08            PUSH    8
    00403CD2      68 6A040116      PUSH    1601046A
    00403CD7      68 01000152      PUSH    52010001
    00403CDC      E8 57530000      CALL    00409038                            ; 读取用户名
    00403CE1      83C4 10          ADD     ESP, 10
    00403CE4      8945 F8          MOV     DWORD PTR SS:[EBP 8], EAX
    00403CE7      6A 01            PUSH    1
    00403CE9      8D45 F8          LEA     EAX, DWORD PTR SS:[EBP 8]
    00403CEC      50               PUSH    EAX
    00403CED      6A 01            PUSH    1
    00403CEF      B8 30314000      MOV     EAX, 403130                         ; 读取加密字符串 334455
    00403CF4      8945 F4          MOV     DWORD PTR SS:[EBP C], EAX
    00403CF7      8D45 F4          LEA     EAX, DWORD PTR SS:[EBP C]
    00403CFA      50               PUSH    EAX
    00403CFB      C745 EC 00000000 MOV     DWORD PTR SS:[EBP 14], 0
    00403D02      C745 F0 00000000 MOV     DWORD PTR SS:[EBP 10], 0
    00403D09      6A 00            PUSH    0
    00403D0B      FF75 F0          PUSH    DWORD PTR SS:[EBP 10]
    00403D0E      FF75 EC          PUSH    DWORD PTR SS:[EBP 14]
    00403D11      6A 01            PUSH    1
    00403D13      8D45 FC          LEA     EAX, DWORD PTR SS:[EBP 4]
    00403D16      50               PUSH    EAX
    00403D17      E8 C0010000      CALL    00403EDC                            ; F7进去 注册码计算



    一步一步跟踪,到了0040407A这步大家注意看看EAX寄存器:


    0040406B      6A 01            PUSH    1
    0040406D      FF75 24          PUSH    DWORD PTR SS:[EBP+24]
    00404070      6A 01            PUSH    1
    00404072      FF75 1C          PUSH    DWORD PTR SS:[EBP+1C]
    00404075      E8 7F050000      CALL    004045F9                            ; 真实注册码
    0040407A      8945 F4          MOV     DWORD PTR SS:[EBP C], EAX           ; 真码进入EAX

    晃荡,我摔到了。这个模块带的注册码验证功能是个明码验证!!!!我们把这个当作问题二。大家可以再试试不输入
    注册码的情况下会怎么样?更严重,在主流程中就可以看到明码的注册码。

    现在我们发现三个问题,希望作者有空闲的时候可以将注册模块这部分加强加强,避免以上我们发现的三个问题。完毕


    附录一:解决“问题一”

    问题一提到的加密字符串显示的问题可以通过一个代码编写技巧来解决。首先声明一个文本型变量,例如 混淆,接着在
    函数中使用下面的写法:(见 隐藏加密字符串.e)

    注册码验证 (编辑框2.内容, , 混淆, 编辑框1.内容)

    再反汇编后得到的代码变成了下面的样子,这样就达到了在OD中隐藏加密字符串的目的!

    00406291      6A 01            PUSH    1
    00406293      68 4C219A00      PUSH    9A214C
    00406298      C745 F0 00000000 MOV     DWORD PTR SS:[EBP 10], 0
    0040629F      C745 F4 00000000 MOV     DWORD PTR SS:[EBP C], 0
    004062A6      6A 00            PUSH    0
    004062A8      FF75 F4          PUSH    DWORD PTR SS:[EBP C]
    004062AB      FF75 F0          PUSH    DWORD PTR SS:[EBP 10]
    004062AE      6A 01            PUSH    1
    004062B0      8D45 FC          LEA     EAX, DWORD PTR SS:[EBP 4]

    ------------------------------------------------------------------------
    【破解总结】
    现在我们对外挂海万能模块 软件注册 部分有了一个大体的概念,了解了该模块的缺点和避免缺点的方法。该模块提供的
    软件注册功能在现阶段并不实用,因为我们可以通过逆向的手法拿到加密字符串,再用这个模块便写出软件注册机。

    ------------------------------------------------------------------------
    【版权声明】
    本文章由 王猛/河南省军区教导大队 原创撰写,未经许可允许转载、但禁止修改。

    评分

    参与人数 1威望 +8 收起 理由
    tigerisme + 8 鼓励

    查看全部评分

    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-8-24 06:48:40 | 显示全部楼层
    谢谢楼主的帖子,学习一下.
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-12-14 09:28
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2007-8-24 09:40:00 | 显示全部楼层
    学习中谢谢分享!!!!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-9-9 17:34:43 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    前天 16:31
  • 签到天数: 2316 天

    [LV.Master]伴坛终老

    发表于 2007-9-21 23:36:48 | 显示全部楼层
    学习了../:018
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-9-22 22:02:36 | 显示全部楼层
    学习一下./:011
    PYG19周年生日快乐!
  • TA的每日心情

    2016-10-21 18:14
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2007-9-23 15:53:41 | 显示全部楼层
    易语言得看看/:good /:good
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-9-24 03:08:08 | 显示全部楼层
    简单明了
    好文
    学习一下/:014
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-9-24 07:47:50 | 显示全部楼层
    好东西,好好学习一下
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2021-1-31 12:26
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2007-9-26 19:49:19 | 显示全部楼层
    易语言得看看
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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