Saturday, April 25, 2009

[搬移]Srun 3000 加密函数key的分析记录

原文在: http://www.bitunion.org/redirect.php?goto=findpost&ptid=10141437&pid=8567446
外网用 cnc.bitunion.org 或 kiss.bitunion.org
直接拿过来,改动一下格式而已

00404411   > \8B2D BC834000 MOV EBP,DWORD PTR DS:[<&MSVCRT.time>]    ;  msvcrt.time
00404417 . 8D5424 28 LEA EDX,DWORD PTR SS:[ESP+28]
0040441B . 52 PUSH EDX ; /timer
0040441C . FFD5 CALL EBP ; \time

0040441E . 8B4C24 2C MOV ECX,DWORD PTR SS:[ESP+2C]
00404422 . 8B56 60 MOV EDX,DWORD PTR DS:[ESI+60]
00404425 . 33C0 XOR EAX,EAX
00404427 . 2BCA SUB ECX,EDX

00404429 . 894424 34 MOV DWORD PTR SS:[ESP+34],EAX
0040442D . 894424 38 MOV DWORD PTR SS:[ESP+38],EAX
00404431 . 894424 3C MOV DWORD PTR SS:[ESP+3C],EAX
00404435 . 66:894424 40 MOV WORD PTR SS:[ESP+40],AX
0040443A . B8 89888888 MOV EAX,88888889
0040443F . F7E1 MUL ECX
00404441 . C1EA 05 SHR EDX,5
00404444 . 52 PUSH EDX ; /<%u> = 13B873A (20678458.)
00404445 . 8D5424 38 LEA EDX,DWORD PTR SS:[ESP+38] ; |
00404449 . 68 F8B34000 PUSH srun3000.0040B3F8 ; |%u
0040444E . 52 PUSH EDX ; |s
0040444F . FF15 E0834000 CALL DWORD PTR DS:[<&MSVCRT.sprintf>] ; \sprintf



到 0040441C 这行,是实现对 time()函数的调用
返回的值在 EAX存放的是 timestamp,如 49F30B07 十进制表示的 1240664839
EDX的数据是清空了的
ECX的数据是堆栈中这个时间戳的地址,调试的时候,返回的是 00cdfa00,在堆栈段里,

00CDFA00   49F30B07


后边的算法
0040441E . 8B4C24 2C MOV ECX,DWORD PTR SS:[ESP+2C]
这行是把刚才那个堆栈里那个数据复制到ecx里
于是这个操作之后,eax和ecx都是刚才time()返回的timestamp了

DWORD PTR DS:[ESI+60] 是一个 FFFF57b4的数
下边清空 eax
然后 sub ecx, edx
结果 ecx的数据成了 49F3B353
只有后4位进行了减法运算

00404429   .  894424 34     MOV DWORD PTR SS:[ESP+34],EAX
0040442D . 894424 38 MOV DWORD PTR SS:[ESP+38],EAX
00404431 . 894424 3C MOV DWORD PTR SS:[ESP+3C],EAX
00404435 . 66:894424 40 MOV WORD PTR SS:[ESP+40],AX


清空了14字节的堆栈数据
因为之前xor eax, eax清空了eax

然后
0040443A   .  B8 89888888   MOV EAX,88888889
0040443F . F7E1 MUL ECX
00404441 . C1EA 05 SHR EDX,5


一个复制,一个乘法,一个乘法结果高位右移

再最后就把这个数字 sprintf成一个字符串 %u

我就无语了

完全不懂

然后

改动代码,生成的时间串:

 <?php 
$key = strval((time() + 43084)/60);
echo $key;


这个 43084 是刚才那个诡异减法的结果和原始数据的差,其实也就是
0x49F3B353 - 0x49F30B07

于是,这个key就对了

不懂为啥

两边比对了下,OD里的结果和php的输出一样

很好

No comments:

Post a Comment