|
本帖最后由 镜中神无 于 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,[local.20]
00459F1A |. |E8 1DA50E00 call BaZi.0054443C
00459F1F |. |E9 6A020000 jmp BaZi.0045A18E
00459F24 |> \8B55 B0 mov edx,[local.20]
我们假设这个注册码位数比较成立,继续往下面看,发现这里有个有意思的东西。
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:[0x6D2690]
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:[0x6D2690]
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,[local.20]
0045A191 |. 66:83B8 38030>cmp word ptr ds:[eax+0x338],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,[local.20]
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:[0x6D2690]
0045A1BB |. 8955 D8 mov [local.10],edx
0045A1BE |. 837D D8 00 cmp [local.10],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?我也是现在才知道这个梗……
|
评分
-
参与人数 20 | 威望 +1 |
HB +38 |
THX +8 |
收起
理由
|
猫妖的故事
| |
+ 1 |
|
|
消逝的过去
| |
+ 2 |
|
|
xiaoxixpj
| |
|
+ 1 |
[吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩! |
sjtkxy
| |
+ 1 |
+ 1 |
|
EMT
| |
+ 1 |
+ 1 |
|
一路走来不容易
| |
|
+ 1 |
|
冷亦飞
| |
+ 1 |
|
|
kway
| |
+ 1 |
|
|
我是好人
| |
+ 1 |
|
[吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守! |
zm315857235
| |
|
+ 1 |
[吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少! |
lies
| |
+ 1 |
|
|
叶落花开
| |
+ 2 |
|
|
DDK4282
| |
+ 1 |
+ 1 |
[快捷评语] - 评分=感谢您的作品! |
L灬淡定丶
| |
+ 1 |
|
[快捷评语] - 2017,让我们17学破解! |
小柒
| |
+ 1 |
+ 1 |
[快捷评语] - 分享精神,是最值得尊敬的! |
lily3521
| |
+ 1 |
|
[快捷评语] - 分享精神,是最值得尊敬的! |
Shark恒
| + 1 |
+ 20 |
+ 1 |
虽然有点小问题,但不影响大局,讲解很细致,喜欢楼主教程的风格! |
因素
| |
+ 1 |
|
[快捷评语] - 分享精神,是最值得尊敬的! |
雨语
| |
+ 1 |
|
[快捷评语] - 吃水不忘打井人,给个评分懂感恩! |
开始学习ing
| |
+ 1 |
|
[快捷评语] - 评分=感恩!简单却充满爱!感谢您的作品! |
查看全部评分
|