接着看看密码的情况:
db_password_cipher_key = "4Pf79FgC8n";
ciphered_password = (char *)sub_401A88(&g_UserPassword, &db_password_cipher_key);
if ( db_password_cipher_key )
释放内存(db_password_cipher_key);
password_1 = ciphered_password;
password_1 = ciphered_password;
if ( password )
释放内存(password);
password = password_1;
// 省略...
conn_string = 文本相加(
5,
"Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=",
path_mdb_1,
";Jet OLEDB:DataBase Password=",
password,
";Mode=Share Deny Read|Share Deny Write");
加密算法就得看看 sub_401A88
了。
先捕捉一下这个函数的输入输出方便对比:
.版本 2
数据库密码 = sub_401A88 (“AZaz0”, “4Pf79FgC8n”)
检查 (数据库密码 = “514A716A200937E0598”)
然后就是实现:
.版本 2
.支持库 dp1
.子程序 sub_401A88, 文本型
.参数 文本, 文本型
.参数 密钥, 文本型
.局部变量 工作区, 字节集
.局部变量 i, 整数型
.局部变量 密码前缀, 文本型
.局部变量 密钥_MD5, 文本型
.局部变量 密码后缀, 文本型
.局部变量 数据库密码, 文本型
工作区 = 到字节集 (文本)
.计次循环首 (取字节集长度 (工作区), i)
工作区 [i] = 位异或 (工作区 [i], 十六进制 (“10”))
.计次循环尾 ()
密码前缀 = 字节集_字节集到十六进制 (工作区)
密钥_MD5 = 到小写 (取数据摘要 (到字节集 (密钥)))
密码后缀 = 到大写 (取文本中间 (密钥_MD5, 3, 9))
数据库密码 = 密码前缀 + 密码后缀
返回 (数据库密码)
跑一下代码,发现逆向出来的算法是正确的。
mdb 密码破解的话,可以试着爆破(费时间),或者找一个工具。
我随便找了个价值 $30 的号称能不到半秒的时间内破解 mdb 密码的工具。
工具下下来,简单处理下(破解不完美,有时间再看看怎么搞,凑合着用),得到 mdb 密码 442678275A0937E0598
:
根据算法,去掉后面的 9 个字符,然后剩下的每个字符 XOR 0x10 就能得到原始密码。
于是写一个反向获取的函数原始密码的函数:
输出调试文本 (sub_401A88_rev (“442678275A0937E0598”))
.子程序 sub_401A88_rev, 文本型
.参数 输入, 文本型
.局部变量 内容, 字节集
.局部变量 i, 整数型
内容 = 字节集_十六进制到字节集 (取文本左边 (输入, 取文本长度 (输入) - 9))
.计次循环首 (取字节集长度 (内容), i)
内容 [i] = 位异或 (内容 [i], 十六进制 (“10”))
.计次循环尾 ()
返回 (到文本 (内容))
得到答案 T6h7J
。
因为我没装 Office,就不打开看了 整了个 mdb 查看器:
源码/模块 需要易语言 5.95
烟佬下次可以试试用我这个工具处理下可执行文件,主打一个强度不高,但现有针对易语言程序的工具/脚本分析不出东西:
Access Password Recovery 代码看明白了。
序列号有 19 位长度。因为是 VB 写的,所以位数从 1 开始:
位数 123456789A123456789
序号 TAPR-BBBB-BBEP-BBBB
0:14: 固定字符 "TAPR"
0:67: 0 <= x <= 59 ; 分/秒?
0:89: 1 <= x <= 12 ; 月?
A:12: 1 <= x <= 31 ; 日?
A:34: 下述项目中的其中一个,例如 EP 表示企业版
mov [ebp+var_5C], offset aSg ; "SG" Single License
mov [ebp+var_6C], offset aPs ; "PS" Personal License
mov [ebp+var_7C], offset aHm ; "HM" Home Multi-License
mov [ebp+var_8C], offset aTm ; "TM" Team Multi-License
mov [ebp+var_9C], offset aEp ; "EP" Enterprise?
A:67: 0 <= x <= 23 ; 小时?
A:89: 0 <= x <= 59 ; 分/秒?
数字/字符变化表:
'L','0', 'B','1', 'Y','2', 'Q','3', 'H','4',
'E','5',' Z','6', 'T','7', 'R','8', 'W','9'
LBYQHEZTRW
0123456789
一个合法的序列号:TAPR-BBBB-BBEP-BBBB
。注册后会提示输入两次用户名确认。
注册码写出到 %appdata%\TSS\APR\configuration.ini
:
[License]
Key=TAPR-BBBB-BBEP-BBBB
User=LCG // 爱飞的猫