MD5(Message Digest Algorithm)消息摘要算法对输入的任意长度的消息进行运算,产生一个128位的消息摘要。 MD5的特征是会出现如下 A,B,C,D 这四个常量。
A=01234567h
B=89abcdefh
C=fedcba98h
D=76543210h
而且,在内存中是以低字节在前的形式存储的,即如下格式,可以直接搜索。
01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10
这里用《加密与解密(第4版)》随书文件 MD5KeyGenMe.exe 来分析。

手动分析
在导入表中找到 GetDlgItemTextA 函数定位关键代码,两次 GetDlgItemTextA 函数读取的应该分别是 Name 和 Serial Number :

sub_4012B0 函数我们点进去看看发现了MD5的几个特征常量:

还原一下符号,需要注意的一点是连续调用两次 MD5_Update 相当于把两次的输入拼接后调用一次 MD5_Update 的结果:

写出注册机:
from hashlib import md5
name = b'pediy'
digest = md5(name + b'www.pediy.com').digest()
a2345 = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ'
serial_number = ''
for b in digest:
serial_number += a2345[b % 32]
print(f'Serial Number('{name}')={serial_number[0:4]}-{serial_number[4:8]}-{serial_number[8:12]}-{serial_number[12:16]}')
自动分析

直接使用 findcrypt 插件, Ctrl + Alt + F 可以自动识别。
