-
-
[原创][第十二回] 第15 队 – programfan简单分析
-
发表于:
2007-6-25 15:30
6459
-
[原创][第十二回] 第15 队 – programfan简单分析
来到公司看到programfan只得了30分
看来注册算法是比较简单的
我简单分析下
忽略所有异常 直接用OD插件万能断点即可断到下面
00401CD7 > \8D4B FF LEA ECX,DWORD PTR DS:[EBX-1]
00401CDA . 33F6 XOR ESI,ESI
00401CDC . 33C0 XOR EAX,EAX
00401CDE . 85C9 TEST ECX,ECX
00401CE0 . 7C 0B JL SHORT programf.00401CED
00401CE2 > 0FBE1C02 MOVSX EBX,BYTE PTR DS:[EDX+EAX]
00401CE6 . 03F3 ADD ESI,EBX
00401CE8 . 40 INC EAX ; 用户名的每一位相加=x
00401CE9 . 3BC1 CMP EAX,ECX
00401CEB .^ 7E F5 JLE SHORT programf.00401CE2
00401CED > A1 C4B04200 MOV EAX,DWORD PTR DS:[42B0C4]
00401CF2 . 8B0D C8B04200 MOV ECX,DWORD PTR DS:[42B0C8] ; KERNEL32.DLL
00401CF8 . 8B15 CCB04200 MOV EDX,DWORD PTR DS:[42B0CC]
00401CFE . 8B1D 58D04200 MOV EBX,DWORD PTR DS:[42D058]
00401D04 . 894424 4C MOV DWORD PTR SS:[ESP+4C],EAX
00401D08 . A0 D0B04200 MOV AL,BYTE PTR DS:[42B0D0]
00401D0D . 894C24 50 MOV DWORD PTR SS:[ESP+50],ECX
00401D11 . 55 PUSH EBP
00401D12 . 895424 58 MOV DWORD PTR SS:[ESP+58],EDX
00401D16 . 884424 5C MOV BYTE PTR SS:[ESP+5C],AL
00401D1A . 33C9 XOR ECX,ECX
00401D1C > 0FBE440C 50 MOVSX EAX,BYTE PTR SS:[ESP+ECX+50]
00401D21 . 0FAFC6 IMUL EAX,ESI ; x*K
00401D24 . 25 FFFF0080 AND EAX,8000FFFF
00401D29 . 79 07 JNS SHORT programf.00401D32 ; 不为负则跳
00401D2B . 48 DEC EAX
00401D2C . 0D 0000FFFF OR EAX,FFFF0000
00401D31 . 40 INC EAX
00401D32 > 99 CDQ
00401D33 . BD 1A000000 MOV EBP,1A ; mod 1a
00401D38 . F7FD IDIV EBP
00401D3A . 83C2 19 ADD EDX,19
00401D3D . 81F2 BC000000 XOR EDX,0BC
00401D43 . 03DA ADD EBX,EDX
00401D45 . 41 INC ECX
00401D46 . 83F9 0B CMP ECX,0B ; x和KERNEL32.DLL循环做一堆运算 然后得出一个值为x2
00401D49 .^ 7E D1 JLE SHORT programf.00401D1C
00401D4B . 8B15 50D04200 MOV EDX,DWORD PTR DS:[42D050] ; 取假码
00401D51 . 891D 58D04200 MOV DWORD PTR DS:[42D058],EBX ; x2进到42d058
00401D57 . 5D POP EBP
00401D58 . 8B42 F8 MOV EAX,DWORD PTR DS:[EDX-8]
00401D5B . 83F8 09 CMP EAX,9 ; SN长度小于9就会失败
00401D5E . 7D 10 JGE SHORT programf.00401D70
00401D60 . 6A 00 PUSH 0
00401D62 . FFD7 CALL EDI
00401D64 . 8B1D 58D04200 MOV EBX,DWORD PTR DS:[42D058]
00401D6A . 8B15 50D04200 MOV EDX,DWORD PTR DS:[42D050]
00401D70 > 33C0 XOR EAX,EAX
00401D72 . 33C9 XOR ECX,ECX
00401D74 > 0FBE3402 MOVSX ESI,BYTE PTR DS:[EDX+EAX]
00401D78 . 81F6 BC000000 XOR ESI,0BC
00401D7E . 03CE ADD ECX,ESI ; (sn1 xor bc)+(sn2 xor bc)+……+(sn9 xor bc)=x3
00401D80 . 40 INC EAX
00401D81 . 83F8 09 CMP EAX,9
00401D84 .^ 7C EE JL SHORT programf.00401D74
00401D86 . 3BCB CMP ECX,EBX ; if x2不等于x3则失败
00401D88 . 0F85 8E020000 JNZ programf.0040201C
00401D8E . 68 5CD04200 PUSH programf.0042D05C
而只要经过了JNZ programf.0040201C 就可注册成功。
下面虽然有比较多的CALL 可没有什么跳转 一直的F8即可顺利走到call 0041cc35 就成功了。因此00401D88下面究竟做了什么可不必理会。
那么根据上面分析 注册算法如下:
设用户名每一位相加后等于x
KERNEL32.DLL每一位用 test1 test2……test12来表示
[((x*test1) mod 1a)+19] xor bc=y1
[((x*test2) mod 1a)+19] xor bc=y2
……
[((x*test12) mod 1a)+19] xor bc=y12
y1+y2+y3+……+y12=x2
(sn1 xor bc)+(sn2 xor bc)+……+(sn9 xor bc)=x3
只要x2=x3就可以注册成功。
这里只要逆一下x3就可以了 这个求逆太简单了。就不说了
给出一组吧:
user:kyo327
sn:xxxxxxxxz
其中sn中的字母可以随意调换位置 都可以成功注册。
匆匆写下此文字 不对之处还望指出!!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)