• 标 题:MD5初次尝试 (2千字)
  • 作 者:upfeed1
  • 时 间:2002-8-19 1:12:33
  • 链 接:http://bbs.pediy.com

XXXX快速邮件地址搜索器 by upfeed[FCG]
真的是其貌不扬,内部算法居然是MD5的,正好最近有看过,正好练习一下:
============================================================
VC的程序,用DASM反汇编以后,发现信息报存在\harrow.cur的指针数据的后面,于是用OllyDbg载入:
========================
00410AB8  |. 68 64DE4600    PUSH fastsear.0046DE64                      ; ASCII "\harrowzs.cur"查找文件
........
00410AF2  |. E8 B6410200    CALL fastsear.00434CAD            ; 获得文件大小
00410AF7  |. 8BF0          MOV ESI,EAX
00410B06  |. 81FE FE020000  CMP ESI,2FE                    ; 判断文件后面是否有信息
........
00410B5C  |. 50            PUSH EAX                    ; 读出的注册数据
00410B5D  |. E8 52290200    CALL fastsear.004334B4
注册名和注册码用0a0d来分离
........
00410C47  |. 8B5424 14      MOV EDX,DWORD PTR SS:[ESP+14]        ; 注册名
00410C4B  |. 8B42 F8        MOV EAX,DWORD PTR DS:[EDX-8]
00410C4E  |. 83F8 08        CMP EAX,8
00410C51  |. 0F8C F8000000  JL fastsear.00410D4F            ; 长度大于等于8
........
00410C86  |. 50            PUSH EAX                    ; 注册名
00410C87  |. E8 A4020000    CALL fastsear.00410F30            ; 算注册码

跟踪进去看一看:
0041101B  |. 50            PUSH EAX
0041101C  |. E8 4D290200    CALL fastsear.0043396E            ; 几个字符串的连接,如下所示
---------------------------------------------
| 'zsday-' + 机器码 + '-scy33dds-' + 用户名 |
---------------------------------------------

往下面走就是MD5的计算地方了:
00411070  |. 51            PUSH ECX                    ; 注册名
00411071  |. 52            PUSH EDX                    ; 连接串
00411072  |. E8 F9F2FFFF    CALL fastsear.00410370            ; MD5
----------------------------------------------------------------------
| 这里的MD5算了两次,直接用0补齐64位注册名,一次xor $36,一次xor $5C |
| 每一次都会将连接串也算一次,见下面的说明                          |
----------------------------------------------------------------------
关于摘要的计算有一点说明:
MD5(MD5(default, name xor $36), MCode) ...... (1)            ; 相当于分组求出的结果
MD5(MD5(default, name xor $5C), (1))  ...... (2)            ; 这里利用了上一次的结果
得到的摘要转换成字符串就是下面的样子了:
8f554cbca228294b4c2134538f2360cd

下面的工作就是拼凑注册码:
0041108D  |. 6A 01            PUSH 1
0041108F  |. 8D4C24 2C        LEA ECX,DWORD PTR SS:[ESP+2C]
00411093  |. 6A 1A            PUSH 1A
00411095  |. 51                PUSH ECX
00411096  |. 8D4C24 1C        LEA ECX,DWORD PTR SS:[ESP+1C]
0041109A  |. C68424 E0000000 0>MOV BYTE PTR SS:[ESP+E0],8
004110A2  |. E8 A7F40100      CALL fastsear.0043054E            ; 从1A位开始的1位

所以形式如下了:
(1A,1)(14,4)(0E,1)-(0B,1)(08,4)(1E,1)-(0F,1)(10,4)(15,1)-(1C,1)(00,4)(0F,1)-
(04,1)(1C,4)(12,1)-(0F,1)(04,4)(07,1)-(03,1)(0C,4)(00,1)-(13,1)(18,4)(09,1)
其实我正好把它反过来了!

结果在下面了:
28f231-8294b5-c4cbcb-260cd4-b8f556-44c21b-ca2288-434532

========================
关于MD5的具体实现,要感谢看学老师提供的Crack Tutorial,其中有详细的讲解。