出去了下,回来发现,原来我刚发帖不久就被爆了,哎,早知道这么容易,我先搞定它再出去就好了~,后悔呀~
不多说了,下面是我的分析:
W32dsm的字符串参考,很快就能定位到关键地方:
004018AE F7EA imul edx
004018B0 8BC2 mov eax, edx
004018B2 C1E8 1F shr eax, 0x1F
004018B5 03D0 add edx, eax
004018B7 8BEA mov ebp, edx
004018B9 3BE9 cmp ebp, ecx
004018BB 74 1F je short 004018DC ; 密码有问题,应该让它调走
004018BD 8D4B 64 lea ecx, dword ptr [ebx+0x64]
004018C0 68 B8604100 push 004160B8 ; 错误提示压栈
004018C5 51 push ecx
004018C6 E8 9C6F0000 call 00408867
004018CB 83C4 08 add esp, 0x8
004018CE 8BCB mov ecx, ebx
004018D0 6A 00 push 0x0
004018D2 E8 C1AD0000 call 0040C698
00401BAF ^\75 DB jnz short 00401B8C
00401BB1 33C0 xor eax, eax
00401BB3 EB 05 jmp short 00401BBA
00401BB5 1BC0 sbb eax, eax
00401BB7 83D8 FF sbb eax, -0x1
00401BBA 85C0 test eax, eax
00401BBC 74 1C je short 00401BDA ; 如果这里跳了,就提示恭喜你
00401BBE 8D43 64 lea eax, dword ptr [ebx+0x64]
00401BC1 68 B8604100 push 004160B8 ; 这里提示密码有问题
00401BC6 50 push eax
00401BC7 E8 9B6C0000 call 00408867
00401BCC 83C4 08 add esp, 0x8
00401BCF 8BCB mov ecx, ebx
00401BD1 6A 00 push 0x0
00401BD3 E8 C0AA0000 call 0040C698
00401BD8 EB 58 jmp short 00401C32
00401BDA 8D4B 64 lea ecx, dword ptr [ebx+0x64] ; 这里提示恭喜你
00401BDD 68 B0604100 push 004160B0
00401BE2 51 push ecx
把上面跳转改成JMP本以为大功告成,结果提示还是密码有问题。再上下看了这个错误提示的地方,发现,有个跳转直接跳转到这个错误地址的地址,如下:
00401AA9 2B7410 FC sub esi, dword ptr [eax+edx-0x4]
00401AAD 83EE 02 sub esi, 0x2
00401AB0 0F88 08010000 js 00401BBE ; 这个跳转跳到密码有问题的地方
...
00401BC1 68 B8604100 push 004160B8 ; 这里提示密码有问题
00401BC6 50 push eax
00401BC7 E8 9B6C0000 call 00408867
00401BCC 83C4 08 add esp, 0x8
00401BCF 8BCB mov ecx, ebx
00401BD1 6A 00 push 0x0
00401BD3 E8 C0AA0000 call 0040C698
00401BD8 EB 58 jmp short 00401C32
00401BDA 8D4B 64 lea ecx, dword ptr [ebx+0x64] ; 这里提示恭喜你
00401BDD 68 B0604100 push 004160B0
看到了吧,我们让他JMP到成功的地方就OK了,把代码改成如下模样:
00401AAD 83EE 02 sub esi, 0x2
00401AB0 E9 25010000 jmp 00401BDA ; 这个跳转跳到密码有问题的地方
00401AB5 90 nop
00401AB6 8D0CB5 00000000 lea ecx, dword ptr [esi*4]
本以为这样就真的可以了。结果一运行,异常了……
但不跟踪,发现问题出在下面这函数中。
00401BF8 52 push edx
00401BF9 E8 EB7C0000 call 004098E9
00401BFE 8B4424 28 mov eax, dword ptr [esp+0x28]
00401C02 50 push eax ; 密码前两位压栈
00401C03 E8 E17C0000 call 004098E9
00401C08 8B8C24 B4000000 mov ecx, dword ptr [esp+0xB4] ; 密码再两位
00401C0F 51 push ecx
00401C10 E8 D47C0000 call 004098E9
00401C15 8B5424 20 mov edx, dword ptr [esp+0x20]
00401C19 52 push edx
00401C1A E8 CA7C0000 call 004098E9 ; 这里异常了
00401C1F 57 push edi
00401C20 E8 C47C0000 call 004098E9
00401C25 8B4424 30 mov eax, dword ptr [esp+0x30]
00401C29 50 push eax
00401C2A E8 BA7C0000 call 004098E9
00401C2F 83C4 18 add esp, 0x18
这些代码调用的都是同一个CALL,结果出问题了,仔细看代码,发现这些函数的堆栈一起平衡的,那我们跳过这些函数调用看看“
00401BDA 8D4B 64 lea ecx, dword ptr [ebx+0x64] ; 这里提示恭喜你
00401BDD 68 B0604100 push 004160B0
00401BE2 51 push ecx
00401BE3 E8 7F6C0000 call 00408867
00401BE8 83C4 08 add esp, 0x8
00401BEB 8BCB mov ecx, ebx
00401BED 6A 00 push 0x0
00401BEF E8 A4AA0000 call 0040C698
00401BF4 EB 3C jmp short 00401C32 ; 这里改成JMP,跳过下面的函数调用,以免程序异常
00401BF6 90 nop
00401BF7 90 nop
再运行,OK,收工了~