ruyi7952 发表于 2007-8-23 23:48:57

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

【破文标题】外挂海万能模块 内附注册功能 破解可行性分析
【破文作者】王猛
【作者邮箱】[email protected]
【作者主页】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:, 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:, 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:, EAX
00403CE7      6A 01            PUSH    1
00403CE9      8D45 F8          LEA   EAX, DWORD PTR SS:
00403CEC      50               PUSH    EAX
00403CED      6A 01            PUSH    1
00403CEF      B8 30314000      MOV   EAX, 403130                         ; 读取加密字符串 334455
00403CF4      8945 F4          MOV   DWORD PTR SS:, EAX
00403CF7      8D45 F4          LEA   EAX, DWORD PTR SS:
00403CFA      50               PUSH    EAX
00403CFB      C745 EC 00000000 MOV   DWORD PTR SS:, 0
00403D02      C745 F0 00000000 MOV   DWORD PTR SS:, 0
00403D09      6A 00            PUSH    0
00403D0B      FF75 F0          PUSH    DWORD PTR SS:
00403D0E      FF75 EC          PUSH    DWORD PTR SS:
00403D11      6A 01            PUSH    1
00403D13      8D45 FC          LEA   EAX, DWORD PTR SS:
00403D16      50               PUSH    EAX
00403D17      E8 C0010000      CALL    00403EDC                            ; F7进去 注册码计算



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


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

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

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


附录一:解决“问题一”

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

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

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

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

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

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

tbs1956 发表于 2007-8-24 06:48:40

谢谢楼主的帖子,学习一下.

rchedu 发表于 2007-8-24 09:40:00

学习中谢谢分享!!!!

zxwbj 发表于 2007-9-9 17:34:43

160904033 发表于 2007-9-21 23:36:48

学习了../:018

天涯之海 发表于 2007-9-22 22:02:36

学习一下./:011

aassaa 发表于 2007-9-23 15:53:41

易语言得看看/:good /:good

cyh2k7 发表于 2007-9-24 03:08:08

简单明了
好文
学习一下/:014

kostlzp 发表于 2007-9-24 07:47:50

好东西,好好学习一下

ziyun 发表于 2007-9-26 19:49:19

易语言得看看
页: [1] 2 3
查看完整版本: 外挂海万能模块 内附注册功能 破解可行性分析