李沉舟 发表于 2017-4-4 15:23

玄奥八字爆破分析

本帖最后由 镜中神无 于 2017-4-4 15:28 编辑

【软件名称】玄奥八字
【软件官网】http://xazhouyi.com
【编写语言】Borland C++ Builder
【所需工具】Restorator、OllyDbg、WinHex、自写的一个Delphi Debug
【分析说明】没有其他意思,只是学习爱好

本人学艺不精,乃是菜鸟一只,如有错误,还望指正。

不过听一朋友说紫微斗数比四柱命理准,反正我也不确定是不是对的,我个人觉得准不准就看用神。

首先,下载安装,用DeDe扫描发现是Borland C++ Builder写的。

我汗,顿时懵逼了,第一次搞BC++的程序,话说Windows平台上的C/C++编译器不是应该都标配VC了吗?吐槽一个。

BC++和Delphi都用的是VCL框架,我想按钮事件的找法应该是差不多的,老套路了,用Restorator打开,在RCDATA类型资源里面果然发现了编译后的窗体信息。



准确定位到那个窗口是因为Reg(注册)字样的关系,一般命名都是这样的规范,然后在里面在TButton类的实例,发现只有一个Button1,记下OnClick事件名称,是“Button1Click”

打开WinHEX,打开主程序,按Ctrl+F,搜索



注意会一般会搜索到实际结果数目 x 2,因为有些是事件地址结构,有些是资源本身。

还有Delphi的string结构是这样的

字符串长度(DWORD) 字符串

不是Windows默认的以0结尾的字符串,二者谁优谁劣,实难断言。

如果没有搜到准确的,按F3可以继续搜索。



IA-32处理器采用“低对低,高对高”的小端方式,就是说,一个数字,在内存中是高字节储存在高地址,低字节储存在低地址。

记下这个地址458338

然后我们一共会找到3个地址,458338、4586BC、459E54

打开OD,载入程序,在这3个地址上面下断点,然后F9运行程序。





点击确定后,发现程序中断在

00459E54/.55            push ebp

研究一下这块函数

00459F12|.83F8 0F       cmp eax,0xF

00459F15|. /74 0D         je short BaZi.00459F24//这里应该是比较注册码位数,如果等于15就跳走。
00459F17|. |8B45 B0       mov eax,
00459F1A|. |E8 1DA50E00   call BaZi.0054443C
00459F1F|. |E9 6A020000   jmp BaZi.0045A18E
00459F24|> \8B55 B0       mov edx,


我们假设这个注册码位数比较成立,继续往下面看,发现这里有个有意思的东西。


0045A03C|.E8 5FF1FFFF   call BaZi.004591A0
0045A041|.59            pop ecx                                  ;BaZi.00559BCA
0045A042|.84C0          test al,al
0045A044|.0F84 44010000 je BaZi.0045A18E
0045A04A|.FF35 90266D00 push dword ptr ds:
0045A050|.E8 9FF2FFFF   call BaZi.004592F4
0045A055|.59            pop ecx                                  ;BaZi.00559BCA
0045A056|.84C0          test al,al
0045A058|.0F84 30010000 je BaZi.0045A18E
0045A05E|.FF35 90266D00 push dword ptr ds:
0045A064|.E8 F7F3FFFF   call BaZi.00459460
0045A069|.59            pop ecx                                  ;BaZi.00559BCA
0045A06A|.84C0          test al,al
0045A06C|.0F84 1C010000 je BaZi.0045A18E


这些JE都跳向同一个地方,我们去那个地址看看,

0045A18E|> \8B45 B0       mov eax,
0045A191|.66:83B8 38030>cmp word ptr ds:,0x3
0045A199|.75 56         jnz short BaZi.0045A1F1
0045A19B|.6A 10         push 0x10
0045A19D|.68 B7545E00   push BaZi.005E54B7
0045A1A2|.68 8E545E00   push BaZi.005E548E
0045A1A7|.8B45 B0       mov eax,
0045A1AA|.E8 494D1000   call BaZi.0055EEF8
0045A1AF|.50            push eax                                 ; |hOwner = 00DAD158
0045A1B0|.E8 77C51500   call <jmp.&USER32.MessageBoxA>         ; \MessageBoxA
0045A1B5|.8B15 90266D00 mov edx,dword ptr ds:
0045A1BB|.8955 D8       mov ,edx
0045A1BE|.837D D8 00    cmp ,0x0


这里调用了一个MessageBoxA,而注册失败是没有提示的,这也就是我们要找按钮事件的原因。

test指令其实就是and(求与)指令,不过test指令不会保存结果,就像cmp和sub的关系。
与操作是逻辑运算,要求两个参加运算的数都相等(1),否则结果为假(0)【二进制运算】
test al,al 表示,al如果为0,则EFlags中,ZF标志位设为1,否则ZF是0。

因为任何数与自身进行与操作,结果不变。

JE是ZF = 1的时候跳转的,也就是说,这个al如果为0就会跳走。

先在3个JE上面下好断点,输入15位注册码,然后点击确定,程序断下来了。

发现al寄存器是0,根据取反规则可知,注册码正确和不正确是相反的,我们尝试把3个CALL的返回值全部改为1尝试。

修改数据如下:
004591A0      B0 01         mov al,0x1
004591A2      C3            retn


004592F4      B0 01         mov al,0x1
004592F6      C3            retn


00459460      B0 01         mov al,0x1
00459462      C3            retn


然后F9运行,重新输入15位注册码尝试。

确实是注册成功了,但是仍然没有提示啊,看来开头估计出错了。

保存以后打开,发现成功。

然后我就在想,BC++的按钮事件特征码会不会和Delphi一样,找到了我以前写的一个Delphi Debug,下载见,https://www.52hb.com/thread-28648-1-1.html



WTF?我也是现在才知道这个梗……

Shark恒 发表于 2017-4-4 21:22

虽然有点小问题,但不影响大局,讲解很细致,喜欢楼主教程的风格!

lily3521 发表于 2017-4-4 22:09

大鲨鱼都发话了,赞赞。

123-木头人 发表于 2017-4-4 22:27

感谢分享,学习了

小值是个小白 发表于 2017-4-5 11:55

虽然我还是在最最最初级入门阶段,纯白纸什么都不懂.但是看到别人发的教程帖子.总是很激动!

leyou 发表于 2017-4-6 09:14

您好,我想学习一下

hdx253 发表于 2017-4-6 12:13

支持原创~学习

别管我了行 发表于 2022-4-21 02:21

4957465 发表于 2022-4-21 10:15

4957465 发表于 2022-4-21 10:59

页: [1] 2 3
查看完整版本: 玄奥八字爆破分析