【文章标题】: 英汉互译王V2007 算法分析之“联想分析法”
【文章作者】: KuNgBiM
【作者邮箱】: kungbim@163.com
【作者主页】: http://www.crkcn.com
【软件名称】: 英汉互译王V2007
【软件大小】: 743KB
【下载地址】: 自己搜索下载
【加壳方式】: N/A
【保护方式】: 延时NAG + 序列号
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: OD
【操作平台】: 盗版XPsp2
【软件介绍】: 一款快速高效的英汉翻译软件,不仅可以实现英汉互译,还可实现繁简互译。并伴有语音朗读功能。您在平时学习英语的过程中、上网浏览英文站点时、看英文原版书籍时、或是在做翻译工作时。你需要一个工具帮助您,从而使语言不再成为你前进的障碍,体验异彩纷呈的精神文明和文化世界,我们推荐您使用《英汉互译王》。她将是您工作、学习、网上生活的理想小伴侣。娃娃软件,科技开创美丽生活,祝您使用愉快。
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
今天大觉醒来,向往日一样到论坛灌灌水,来到『软件调试论坛』看见一朋友写的《菜鸟破文之英汉互译王V2007注册爆破简单分析》,
发现该程序为明码比较,看来算法也挺简单,于是乎分析之。
不过今天这个算法也不能完全叫算法,只能用“联想分析法”这个词比较准确。为什么叫“联想分析法”呢?下面可以完全描述之。
准备工作就不再详述,通过yumikeyabc朋友分析的虚拟地址来现成的!
来到004B1FF9设断!F9运行,填写注册信息:
机器码:BFED57300014782D24F5
注册码:99999999999999999999
004B1FF9 |. 55 push ebp
004B1FFA |. 68 C2214B00 push 004B21C2
004B1FFF |. 64:FF30 push dword ptr fs:[eax]
004B2002 |. 64:8920 mov dword ptr fs:[eax], esp
004B2005 |. 8D55 F4 lea edx, dword ptr [ebp-C]
004B2008 |. 8B86 00030000 mov eax, dword ptr [esi+300]
004B200E |. E8 8998F9FF call 0044B89C ; 取试炼注册码
004B2013 |. 8B45 F4 mov eax, dword ptr [ebp-C] ; ASCII "99999999999999999999"
004B2016 |. 8D55 F8 lea edx, dword ptr [ebp-8]
004B2019 |. E8 FA64F5FF call 00408518 ; 注册码格式检查
004B201E |. 8B45 F8 mov eax, dword ptr [ebp-8]
004B2021 |. 50 push eax
004B2022 |. 8D55 EC lea edx, dword ptr [ebp-14]
004B2025 |. 8B86 0C030000 mov eax, dword ptr [esi+30C]
004B202B |. E8 6C98F9FF call 0044B89C ; ★取机器码,研究之★
004B2030 |. 8B45 EC mov eax, dword ptr [ebp-14] ; ASCII "BFED57300014782D24F5"
; 第二次加载运行后来到此处,看堆栈,并修改之
004B2033 |. 8D4D F0 lea ecx, dword ptr [ebp-10]
004B2036 |. BA D8214B00 mov edx, 004B21D8 ; t674
004B203B |. E8 88FAFFFF call 004B1AC8 ; 算法CALL,不跟进
004B2040 |. 8B55 F0 mov edx, dword ptr [ebp-10] ; ★得到正确注册码★
; ASCII "0307040574767271717170757679730573750774"
004B2043 |. 58 pop eax ; 试炼码,ASCII "99999999999999999999"
004B2044 |. E8 4B24F5FF call 00404494 ; 经典比较CALL
004B2049 |. 0F85 E2000000 jnz 004B2131 ; 跳则GAME OVER
我们得到的注册码感觉很可疑(机器码中的000所对应的注册码为717171,难道有规律?)
Ctrl+F2重新装载,在取机器码004B2030处设断,运行。中断后查看堆栈,并修改:
===========================================================================
数据窗口中跟随数值:
00E7EE30 42 46 45 44 35 37 33 30 30 30 31 34 37 38 32 44 BFED57300014782D
00E7EE40 32 34 46 35 00 00 E7 00 0C F6 4B 00 0C F6 4B 00 24F5..?.鏊..鏊.
00E7EE50 B4 11 00 00 00 00 00 00 EC 78 42 00 F0 ED E7 00 ?......禅B.痦?
00E7EE60 C8 78 42 00 F0 ED E7 00 00 00 00 00 00 00 00 00 萨B.痦?........
修改为:
00E7EE30 31 32 33 34 35 36 37 38 39 30 41 42 43 44 45 46 1234567890ABCDEF
00E7EE40 47 48 49 4A 00 00 E7 00 0C F6 4B 00 0C F6 4B 00 GHIJ..?.鏊..鏊.
00E7EE50 B4 11 00 00 00 00 00 00 EC 78 42 00 F0 ED E7 00 ?......禅B.痦?
00E7EE60 C8 78 42 00 F0 ED E7 00 00 00 00 00 00 00 00 00 萨B.痦?........
===========================================================================
继续运行!
修改后变为:
004B202B |. E8 6C98F9FF call 0044B89C ; 取机器码
004B2030 |. 8B45 EC mov eax, dword ptr [ebp-14] ; ASCII "1234567890ABCDEFGHIJ"
004B2033 |. 8D4D F0 lea ecx, dword ptr [ebp-10]
004B2036 |. BA D8214B00 mov edx, 004B21D8 ; t674
004B203B |. E8 88FAFFFF call 004B1AC8
004B2040 |. 8B55 F0 mov edx, dword ptr [ebp-10] ; ★得到正确注册码★
; ASCII "707372757477767978710003020504070609080B"
004B2043 |. 58 pop eax
难道“1234567890ABCDEFGHIJ”所对应的注册码值为“707372757477767978710003020504070609080B”
根据推断,随后我整理了一张包含字母及数字有规律的密码表,如下:
0 --> 71
1 --> 70
2 --> 73
3 --> 72
4 --> 75
5 --> 74
6 --> 77
7 --> 76
8 --> 79
9 --> 78
A --> 00
B --> 03
C --> 02
D --> 05
E --> 04
F --> 07
G --> 06
H --> 09
I --> 08
J --> 0B
K --> 0A
L --> 0D
M --> 0C
N --> 0F
O --> 0E
P --> 11
Q --> 10
R --> 13
S --> 12
T --> 15
U --> 14
V --> 17
W --> 16
X --> 19
Y --> 18
Z --> 1B
为了证实这个“联想分析法”得出的算法可行,写一个注册机来验证。
============ 以下程序在盗版XPsp2、VB6.0下编译测试通过 ============
Private Sub Text1_Change()
'Keygen by KuNgBiM
Dim MachineCode As String
Dim n, m, i As Byte
Dim Sn, tmp As String
Dim Char As String
Dim Table As String
'字符串
Char = "0123456789" & "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
'字符串对应密码表
Table = "717073727574777679780003020504070609080B0A0D0C0F0E111013121514171619181B"
'输入机器码
MachineCode = Text1.Text
'计算注册码
If Len(MachineCode) > 20 Then MachineCode = Mid(MachineCode, 1, 20)
n = Len(MachineCode)
For i = 1 To n
tmp = Mid(MachineCode, i, 1)
m = InStr(1, Char, tmp)
Sn = Sn & Mid(Table, 2 * m - 1, 2)
Next
'输出注册码
Text2.Text = Sn
End Sub
============ 以下程序在盗版XPsp2、VC++6.0下编译测试通过 ============
void Ckeygen::OnChangeText1()
{
// TODO: Add your control notification handler code here
// Keygen by KuNgBiM
CString MachineCode;
CComVariant n, m; BYTE i;
CComVariant Sn; CString tmp;
CString Char;
CString Table;
// 字符串
Char = CString("0123456789")+"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// 字符串对应密码表
Table = "717073727574777679780003020504070609080B0A0D0C0F0E111013121514171619181B";
// 输入机器码
MachineCode = Text(m_Text1);
// 计算注册码
if ( MachineCode.GetLength()>20) { MachineCode = MachineCode.Mid(1-1, 20); }
n = MachineCode.GetLength();
for(i=1; i<=n; i++) {
tmp = MachineCode.Mid(i-1, 1);
m = (1+Char.Find(tmp, 1-1));
Sn = Sn+ Table.Mid(2*m-1-1, 2);
}
// 输出注册码
m_Text2.SetWindowText(Sn);
}
============ 以下程序在盗版XPsp2、Delphi 6.0下编译测试通过 ============
procedure Tkeygen.Text1Change(Sender: TObject);
var
MachineCode, tmp, Char, Table : AnsiString;
n, m, Sn : Variant;
i : Char;
begin
// Keygen by KuNgBiM
// 字符串
Char := '0123456789'+'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
// 字符串对应密码表
Table := '717073727574777679780003020504070609080B0A0D0C0F0E111013121514171619181B';
// 输入机器码
MachineCode := Text1.Text;
// 计算注册码
if Length(MachineCode)>20 then begin MachineCode := Copy(MachineCode, 1, 20); end;
n := Length(MachineCode);
for i:=1 to n do begin
tmp := Copy(MachineCode, i, 1);
m := (1+Pos(tmp, PChar(Char)+1));
Sn := Sn+ Copy(Table, 2*m-1, 2);
end;
// 输出注册码
Text2.Text := Sn;
end;
end.
--------------------------------------------------------------------------------
【经验总结】
没什么好总结的,自创的“联想分析法”真好用!呵呵~
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007年02月16日 PM 02:33:00