玄奥八字爆破分析
本帖最后由 镜中神无 于 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?我也是现在才知道这个梗……
虽然有点小问题,但不影响大局,讲解很细致,喜欢楼主教程的风格! 大鲨鱼都发话了,赞赞。 感谢分享,学习了 虽然我还是在最最最初级入门阶段,纯白纸什么都不懂.但是看到别人发的教程帖子.总是很激动! 您好,我想学习一下 支持原创~学习