第一处 - “注册”
00631EC8 |. BA 02000000 mov edx, 0x2
上面的0x2改为1即可
程序会走到
00631F1F >|> \33C9 xor ecx, ecx
00631F21 |. B2 01 mov dl, 0x1
00631F23 |. A1 20116300 mov eax, dword ptr [0x631120]
00631F28 |. E8 B3AFF8FF call <Vcl::Forms::TCustomForm::TCustomForm(System::Classes::TComponent *)>
这里就是弹出爆破成功的对话框,此时记住这个0x631120这个值,因为这个是success_form3的位置
00631120 >00631178 <BlowMe._cls_frmSuccess_TForm3>
第二处 - “下拉注册”
程序走到这里
00631EE8 |. 33C9 xor ecx, ecx
00631EEA |. B2 01 mov dl, 0x1
00631EEC |. A1 A0136300 mov eax, dword ptr [0x6313A0]
00631EF1 |. E8 EAAFF8FF call <Vcl::Forms::TCustomForm::TCustomForm(System::Classes::TComponent *)>
我们会现调用的代码是一样的,只是传给eax不一样而已,这里的eax的值为
006313A0 >006313F8 <BlowMe._cls_frmFaile_TForm2>
因此我们只要把这里的0x6313A0改成0x631120就行了
第三处 - “菜单-注册”
这里我们发现程序会走到
00631E8C A1 FC3F6400 mov eax, dword ptr [0x643FFC]
00631E91 |. 8B00 mov eax, dword ptr [eax]
00631E93 |. E8 7810F9FF call <Vcl::Forms::TCustomForm::Show(void)>
我们同样观察下0x643FFC这个值,在程序执行到00631E91这里的时候注意看下eax里面是什么
0064A7D0 00000000
0064A7D4 01EFF510 //这个是成功爆破的对话框
0064A7D8 01EFF150 --> 这个值就是正常走的逻辑
0064A7DC 01EFF8D0
0064A7E0 01F12520
我们看下01EFF150里面是什么东西
01EFF150 006313F8 <BlowMe._cls_frmFaile_TForm2>
01EFF154 01F3CE10
01EFF158 01F530EC UNICODE "Form2"
其他的值为:
01EFF510 00631178 <BlowMe._cls_frmSuccess_TForm3>
01EFF514 01F3CE10
01EFF518 01F538AC UNICODE "Form3"
01EFF8D0 00631674 <BlowMe._cls_frmAboat_TForm4>
01EFF8D4 01F3CE10
01EFF8D8 01F53A8C UNICODE "Form4"
01F12520 006318F0 <BlowMe._cls_frmMain_TForm1>
01F12524 01F3CE10
01F12528 01F52FAC UNICODE "Form1"
到这里就很明显了,这个mov eax,[eax]显然是在选择要显示的对话框
我们只要搜下0064A7D4这个全局变量是谁在存放就行了,我们发现是下面这里存放了
00643D58 0064A7D4 BlowMe.0064A7D4
我们想要的值,改就很简单了,直接把0x643FFC替换成0x000643D58就行了