:00401228 688E214000 push 0040218E
:0040122D E84C010000 call 0040137E ;算用户名的CALL(1)
:00401232 50 push eax ;保存演算后用户名
:00401233 687E214000 push 0040217E ;取输入的密码
:00401238 E89B010000 call 004013D8 ;算密码的CALL(4)
:0040123D 83C404 add esp, 00000004
:00401240 58 pop eax
:00401241 3BC3 cmp eax, ebx
:00401243 7407 je 0040124C
:00401245 E818010000 call 00401362 ;错误的CALL
;--------以下是取用户名并运算的CALL(1)----------------
:0040137E 8B742404 mov esi, dword ptr [esp+04] ;取出用户名
:00401382 56 push esi
:00401383 8A06 mov al, byte ptr [esi] ;取用户名的第一个字节
:00401385 84C0 test al, al
:00401387 7413 je 0040139C
:00401389 3C41 cmp al, 41 ;判断是否是大写字母
:0040138B 721F jb 004013AC
:0040138D 3C5A cmp al, 5A ;判断是否是大写字母
:0040138F 7303 jnb 00401394
:00401391 46 inc esi
:00401392 EBEF jmp 00401383
:00401394 E839000000 call 004013D2 ;大写转换的CALL
:00401399 46 inc esi ;取用户名下一个字节
:0040139A EBE7 jmp 00401383 ;循环
:0040139C 5E pop esi
:0040139D E820000000 call 004013C2 ;跳到(3)去
:004013A2 81F778560000 xor edi, 00005678
:004013A8 8BC7 mov eax, edi
:004013AA EB15 jmp 004013C1
:004013AC 5E pop esi
:004013AD 6A30 push 00000030
:004013AF 6860214000 push 00402160
:004013B4 6869214000 push 00402169
:004013B9 FF7508 push [ebp+08]
:004013BC E879000000 Call 0040143A
:004013C1 C3 ret
;----------------(3)-----------------
:004013C2 33FF xor edi, edi
:004013C4 33DB xor ebx, ebx
:004013C6 8A1E mov bl, byte ptr [esi]
:004013C8 84DB test bl, bl
:004013CA 7405 je 004013D1
:004013CC 03FB add edi, ebx
:004013CE 46 inc esi
:004013CF EBF5 jmp 004013C6
:004013D1 C3 ret
;------------算密码(4)-----------------
:004013D8 33C0 xor eax, eax
:004013DA 33FF xor edi, edi
:004013DC 33DB xor ebx, ebx
:004013DE 8B742404 mov esi, dword ptr [esp+04]
:004013E2 B00A mov al, 0A
:004013E4 8A1E mov bl, byte ptr [esi]
:004013E6 84DB test bl, bl
:004013E8 740B je 004013F5
:004013EA 80EB30 sub bl, 30
:004013ED 0FAFF8 imul edi, eax
:004013F0 03FB add edi, ebx
:004013F2 46 inc esi
:004013F3 EBED jmp 004013E2
:004013F5 81F734120000 xor edi, 00001234
:004013FB 8BDF mov ebx, edi
:004013FD C3 ret
算法思路是这样的,程序先取用户名,判断是否为大写若不是则转换成大写,然后经过运算得出一个值X,然后在计算输入的密码,经过换算得出Y,最后比较X和Y,若相等则成功,不等则失败,关键的问题是现在两个换算的算法我的知道,但是我逆不回去,比如,输入的用户名是'w'其实这个时候正确的密码的转换值已经可以通过用户名计算出来了,但是我没有办法算出正确的密码值
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)