谢谢
programfan,使用itoa,我终于达到我的需求了。
原程序是:
…
…
004012A9 |. E8 FC010000 CALL <JMP.&USER32.ShowWindow> ; \ShowWindow
004012AE EB 09 JMP SHORT CrackHea.004012B9
004012B0 3132 XOR DWORD PTR DS:[EDX],ESI
004012B2 333435 363636>XOR ESI,DWORD PTR DS:[ESI+363636]
004012B9 68 B0124000 PUSH CrackHea.004012B0 ; ASCII "12345666"
004012BE FF35 90314000 PUSH DWORD PTR DS:[403190]
004012C4 |. E8 DB010000 CALL <JMP.&USER32.SetWindowTextA> ; \SetWindowTextA
004012C9 |. EB 08 JMP SHORT CrackHea.004012D3
…
…
我修改成:
…
…
004012A9 . E8 FC010000 CALL <JMP.&USER32.ShowWindow> ; \ShowWindow
004012AE . E9 2D020000 JMP CrackHea.004014E0
004012B3 90 NOP
004012B4 90 NOP
004012B5 90 NOP
004012B6 90 NOP
004012B7 90 NOP
004012B8 90 NOP
004012B9 > FF35 90314000 PUSH DWORD PTR DS:[403190] ; |hWnd = NULL
004012BF . 90 NOP ; |
004012C0 . 90 NOP ; |
004012C1 . 90 NOP ; |
004012C2 . 90 NOP ; |
004012C3 . 90 NOP ; |
004012C4 . E8 DB010000 CALL <JMP.&USER32.SetWindowTextA> ; \SetWindowTextA
004012C9 . EB 08 JMP SHORT CrackHea.004012D3
…
…
004014E0 > \50 PUSH EAX
004014E1 . 53 PUSH EBX
004014E2 . 33C0 XOR EAX,EAX
004014E4 . 33DB XOR EBX,EBX
004014E6 . A1 9C334000 MOV EAX,DWORD PTR DS:[40339C]
004014EB . 35 53757A79 XOR EAX,797A7553
004014F0 . 8D1D C4334000 LEA EBX,DWORD PTR DS:[4033C4]
004014F6 . 6A 0A PUSH 0A ; /radix = A (10.)
004014F8 . 53 PUSH EBX ; |string => CrackHea.004033C4
004014F9 . 50 PUSH EAX ; |value
004014FA . E8 95D4547C CALL ntdll._itoa ; \_itoa
004014FF . 5B POP EBX
00401500 . 5B POP EBX
00401501 . 5B POP EBX
00401502 . 5B POP EBX
00401503 . 58 POP EAX
00401504 . 68 C4334000 PUSH CrackHea.004033C4
00401509 .^ E9 ABFDFFFF JMP CrackHea.004012B9
…
…
这样,就实现了将注册码直接显示到文本框中!
这里:
004014E6 . A1 9C334000 MOV EAX,DWORD PTR DS:[40339C]
将机器生成的机器码,暂且叫机器码,因其与或797A7553后的十进制数即为注册码。
004014EB . 35 53757A79 XOR EAX,797A7553
EAX此时为注册码,只需将其转换成十进制字符串
004014F0 . 8D1D C4334000 LEA EBX,DWORD PTR DS:[4033C4]
建立缓冲区
004014F6 . 6A 0A PUSH 0A ; /radix = A (10.)
004014F8 . 53 PUSH EBX ; |string => CrackHea.004033C4
004014F9 . 50 PUSH EAX ; |value
004014FA . E8 95D4547C CALL ntdll._itoa ; \_itoa
调用itoa函数,将EAX转换成进制为10的字符串,放到EBX处去。
004014FF . 5B POP EBX
00401500 . 5B POP EBX
00401501 . 5B POP EBX
以上为平衡堆栈,我汇编不好,不会用更好的方法,就笨招数OD的堆栈窗口中堆栈的元素个数一直平衡到push ebx为止,我这里有疑问,为什么CALL ntdll._itoa不能平衡堆栈呢?是不是所有的Windows函数(像CALL <JMP.&USER32.SetWindowTextA>)都是这样的呢?
00401502 . 5B POP EBX
00401503 . 58 POP EAX
00401504 . 68 C4334000 PUSH CrackHea.004033C4
OK了!
后面的就和修改前差不多了。
00401504 . 68 C4334000 PUSH CrackHea.004033C4
内容
004012B9 > /FF35 90314000 PUSH DWORD PTR DS:[403190]
句柄
004012C4 . E8 DB010000 CALL <JMP.&USER32.SetWindowTextA> ; \SetWindowTextA
通过programfan的提示后,我开始修改的文件总是出错,但是重新加载后有可运行,但是运行不到最后,我找了半天,才发现是堆栈没有平衡好,导致的错误。
再次谢谢programfan,还有其他回帖的朋友。
上传下结果,显摆一下。
CrackHead0.rar