- UID
- 78821
注册时间2014-10-31
阅读权限10
最后登录1970-1-1
周游历练
TA的每日心情 | 慵懒 2020-10-4 16:41 |
---|
签到天数: 31 天 [LV.5]常住居民I
|
来论坛很久了,一直都在看教程,这是第一次找个简单的软件学习算法分析
对新手来说很累,几乎每行都查找汇编指令说明,才知道什么意思
练习的程序是从网上找的一款资源修改工具(eXeScope)
以下为自己的分析.可能会有错误,望谅解
1. 程序注册下,看看有什么提示:"无效的ID或名字"
2. 查找字符串"无效的ID或名字"并下断.运行
3. 向上到段首处下断,重启程序,运行,注册后断下
以下为关键代码:
004C2A6B |. C783 4C020000>mov dword ptr ds:[ebx+0x24C],0x2
004C2A75 |. E9 FF000000 jmp eXeScope.004C2B79
004C2A7A |> 8D55 FC lea edx,[local.1]
004C2A7D |. 8B83 F8020000 mov eax,dword ptr ds:[ebx+0x2F8]
004C2A83 |. E8 F4F8FAFF call eXeScope.0047237C ; 获取用户名
004C2A88 |. 8B55 FC mov edx,[local.1]
004C2A8B |. A1 E8FE4C00 mov eax,dword ptr ds:[0x4CFEE8]
004C2A90 |. E8 4F1FF4FF call eXeScope.004049E4 ; 保存用户名
004C2A95 |. 8D55 F8 lea edx,[local.2]
004C2A98 |. 8B83 FC020000 mov eax,dword ptr ds:[ebx+0x2FC]
004C2A9E |. E8 D9F8FAFF call eXeScope.0047237C ; 获取ID
004C2AA3 |. 8B55 F8 mov edx,[local.2]
004C2AA6 |. A1 4CFE4C00 mov eax,dword ptr ds:[0x4CFE4C]
004C2AAB |. E8 341FF4FF call eXeScope.004049E4 ; 保存ID
004C2AB0 |. 8B15 4CFE4C00 mov edx,dword ptr ds:[0x4CFE4C]
004C2AB6 |. 8B12 mov edx,dword ptr ds:[edx]
004C2AB8 |. A1 54FC4C00 mov eax,dword ptr ds:[0x4CFC54]
004C2ABD |. 8B00 mov eax,dword ptr ds:[eax]
004C2ABF |. E8 B8940000 call eXeScope.004CBF7C ; F7进去
004C2AC4 |. 84C0 test al,al
004C2AC6 |. 0F84 8D000000 je eXeScope.004C2B59
004C2ACC |. A1 E8FE4C00 mov eax,dword ptr ds:[0x4CFEE8]
004C2AD1 |. 8B00 mov eax,dword ptr ds:[eax]
以上代码只是做一些初始化工作.验证在0x004CBF7C函数中
4. 从上面红色标注的call中进去:
004CBF8F |. 68 1BC04C00 push eXeScope.004CC01B
004CBF94 |. 64:FF30 push dword ptr fs:[eax]
004CBF97 |. 64:8920 mov dword ptr fs:[eax],esp
004CBF9A |. 33DB xor ebx,ebx
004CBF9C |. 8B45 FC mov eax,[local.1]
004CBF9F |. E8 AC8CF3FF call eXeScope.00404C50 ; 获取ID长度
004CBFA4 |. 83F8 0A cmp eax,0xA
004CBFA7 |. 75 5C jnz XeXeScope.004CC005 ; 与0xA比较
004CBFA9 |. 8B55 FC mov edx,[local.1]
004CBFAC |. B8 30C04C00 mov eax,eXeScope.004CC030 ; ASCII "A1910"
004CBFB1 |. E8 DE8FF3FF call eXeScope.00404F94 ; F7进入
004CBFB6 |. 48 dec eax
004CBFB7 |. 74 10 je XeXeScope.004CBFC9
004CBFB9 |. 8B55 FC mov edx,[local.1]
004CBFBC |. B8 40C04C00 mov eax,eXeScope.004CC040 ; ASCII "A1423"
004CBFC1 |. E8 CE8FF3FF call eXeScope.00404F94
004CBFC6 |. 48 dec eax
004CBFC7 |. 75 3C jnz XeXeScope.004CC005
长度要等于10位,否则注册失败
5. 从第4步中红色标注的call中进去:
00404FA7 |. 8B56 FC mov edx,dword ptr ds:[esi-0x4]
00404FAA |. 4A dec edx
00404FAB |. 78 1B js XeXeScope.00404FC8
00404FAD |. 8A06 mov al,byte ptr ds:[esi]
00404FAF |. 46 inc esi
00404FB0 |. 29D1 sub ecx,edx
00404FB2 |. 7E 14 jle XeXeScope.00404FC8
00404FB4 |> F2:AE /repne scas byte ptr es:[edi] ; 在ID中的查找'A'的位置
00404FB6 |. 75 10 |jnz XeXeScope.00404FC8
00404FB8 |. 89CB |mov ebx,ecx
00404FBA |. 56 |push esi
00404FBB |. 57 |push edi
00404FBC |. 89D1 |mov ecx,edx
00404FBE |. F3:A6 |repe cmps byte ptr es:[edi],byte ptr ds>; 查看字符串中是否有"1910"或"1423"
00404FC0 |. 5F |pop edi
00404FC1 |. 5E |pop esi
00404FC2 |. 74 0C |je XeXeScope.00404FD0
00404FC4 |. 89D9 |mov ecx,ebx
00404FC6 |.^ EB EC \jmp XeXeScope.00404FB4
00404FC8 |> 5A pop edx
ID中要有字符串"A1910"或"A1423",而且必须在首位(笔记中忘了记录"在首位"的代码)
6. 继续F8走,返回到第4步的代码下方:
004CBFC9 |> \B8 02000000 mov eax,0x2
004CBFCE |> 8B55 FC /mov edx,[local.1]
004CBFD1 |. 8A5402 FF |mov dl,byte ptr ds:[edx+eax-0x1]
004CBFD5 |. 80FA 30 |cmp dl,0x30
004CBFD8 |. 72 2B |jb XeXeScope.004CC005
004CBFDA |. 80FA 39 |cmp dl,0x39
004CBFDD |. 77 26 |ja XeXeScope.004CC005
004CBFDF |. 40 |inc eax
004CBFE0 |. 83F8 0B |cmp eax,0xB
004CBFE3 |.^ 75 E9 \jnz XeXeScope.004CBFCE ; ID从第二位开始只能是数字
004CBFE5 |. 8B45 FC mov eax,[local.1]
004CBFE8 |. 0FB640 08 movzx eax,byte ptr ds:[eax+0x8] ; 取ID第9位
004CBFEC |. 8B55 FC mov edx,[local.1]
004CBFEF |. 0FB652 09 movzx edx,byte ptr ds:[edx+0x9] ; 取ID最后一位
004CBFF3 |. 03C2 add eax,edx ; 相加
004CBFF5 |. B9 0A000000 mov ecx,0xA
004CBFFA |. 33D2 xor edx,edx
004CBFFC |. F7F1 div ecx ; 再除0xA
004CBFFE |. 83FA 04 cmp edx,0x4 ; 余数与4比较
004CC001 |. 75 02 jnz XeXeScope.004CC005
004CC003 |. B3 01 mov bl,0x1 ; 注册码是否正确标志
004CC005 |> 33C0 xor eax,eax
(1). ID除第一位,其它必须是数字
(2). (code[8] + code[9]) % 10 = 4
总结:
1. ID长度必须为10位
2. ID除第一位,其它必须是数字
3. 前5位必须为"A1910"或"A1423"
3. (code[8] + code[9]) % 10 = 4
4. 注册码与用户名无关
编程不太会,这里贴出一组key与算法源码:
key: A191012335
算法源码:
- package
- {
- import res;
- public class reg
- {
- public function key()
- {
- var str_start:int;
- var tmp:int;
- var num:String = "0123456798";
- // 前5位
- str_start = (Math.random() * 100) % 2;
- if (str_start == 0)
- {
- res.id = "A1910";
- }
- else
- {
- res.id = "A1423";
- }
- // 中3位
- for (var i:int = 0; i != 3; i++)
- {
- res.id += GetNumber();
- }
- // 最后2位
- tmp = GetNumber();
- res.id += tmp;
- trace("第九位: " + tmp + "-->" + res.id.charCodeAt(res.id.length - 1));
- for (var j:int = 0; j != 10; j++)
- {
- if (((res.id.charCodeAt(res.id.length - 1) + num.charCodeAt(j)) % 10) == 4)
- {
- trace("第十位: " + num.charAt(j) + "-->" + num.charCodeAt(j));
- res.id += num.charAt(j);
- break;
- }
- }
- trace("结果: " + res.id.charCodeAt(res.id.length - 2) + " + " + res.id.charCodeAt(res.id.length - 1) + " = " + (res.id.charCodeAt(res.id.length - 2) + res.id.charCodeAt(res.id.length - 1)));
- }
- private function GetNumber():int
- {
- var num:int;
- num = (Math.random() * 10) - 1;
- if (num == -1)
- {
- num = (Math.random() * 10) - 1;
- }
- if (num == -1)
- {
- num = 0;
- }
- return num;
- }
- }
- }
复制代码
|
评分
-
查看全部评分
|