第一次分析程序--资源修改工具算法分析
来论坛很久了,一直都在看教程,这是第一次找个简单的软件学习算法分析对新手来说很累,几乎每行都查找汇编指令说明,才知道什么意思
练习的程序是从网上找的一款资源修改工具(eXeScope)
以下为自己的分析.可能会有错误,望谅解
1. 程序注册下,看看有什么提示:"无效的ID或名字"
2. 查找字符串"无效的ID或名字"并下断.运行
3. 向上到段首处下断,重启程序,运行,注册后断下
以下为关键代码:
004C2A6B|.C783 4C020000>mov dword ptr ds:,0x2
004C2A75|.E9 FF000000 jmp eXeScope.004C2B79
004C2A7A|>8D55 FC lea edx,
004C2A7D|.8B83 F8020000 mov eax,dword ptr ds:
004C2A83|.E8 F4F8FAFF call eXeScope.0047237C ;获取用户名
004C2A88|.8B55 FC mov edx,
004C2A8B|.A1 E8FE4C00 mov eax,dword ptr ds:
004C2A90|.E8 4F1FF4FF call eXeScope.004049E4 ;保存用户名
004C2A95|.8D55 F8 lea edx,
004C2A98|.8B83 FC020000 mov eax,dword ptr ds:
004C2A9E|.E8 D9F8FAFF call eXeScope.0047237C ;获取ID
004C2AA3|.8B55 F8 mov edx,
004C2AA6|.A1 4CFE4C00 mov eax,dword ptr ds:
004C2AAB|.E8 341FF4FF call eXeScope.004049E4 ;保存ID
004C2AB0|.8B15 4CFE4C00 mov edx,dword ptr ds:
004C2AB6|.8B12 mov edx,dword ptr ds:
004C2AB8|.A1 54FC4C00 mov eax,dword ptr ds:
004C2ABD|.8B00 mov eax,dword ptr ds:
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:
004C2AD1|.8B00 mov eax,dword ptr ds:
以上代码只是做一些初始化工作.验证在0x004CBF7C函数中
4. 从上面红色标注的call中进去:
004CBF8F|.68 1BC04C00 push eXeScope.004CC01B
004CBF94|.64:FF30 push dword ptr fs:
004CBF97|.64:8920 mov dword ptr fs:,esp
004CBF9A|.33DB xor ebx,ebx
004CBF9C|.8B45 FC mov eax,
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,
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,
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:
00404FAA|.4A dec edx
00404FAB|.78 1B js XeXeScope.00404FC8
00404FAD|.8A06 mov al,byte ptr ds:
00404FAF|.46 inc esi
00404FB0|.29D1 sub ecx,edx
00404FB2|.7E 14 jle XeXeScope.00404FC8
00404FB4|>F2:AE /repne scas byte ptr es: ;在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:,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,
004CBFD1|.8A5402 FF |mov dl,byte ptr ds:
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,
004CBFE8|.0FB640 08 movzx eax,byte ptr ds: ;取ID第9位
004CBFEC|.8B55 FC mov edx,
004CBFEF|.0FB652 09 movzx edx,byte ptr ds: ;取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 + code) % 10 = 4
总结:
1. ID长度必须为10位
2. ID除第一位,其它必须是数字
3. 前5位必须为"A1910"或"A1423"
3. (code + code) % 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;
}
}
}
说话源码贴出来,自己看的好兴奋{:soso_e102:} 顶下会算法的同学~ 不错不错。 赞一个! 来这里也有好长一段时间了,软件简单的还是会破,不过叫我分析算法,真心没有那个耐心呀。。。。哎!!!!! sndncel 发表于 2014-12-10 19:07
来这里也有好长一段时间了,软件简单的还是会破,不过叫我分析算法,真心没有那个耐心呀。。。。哎!!!! ...
多玩几次就快了
膜拜,感谢楼主无私分享,论坛有你更精彩{:soso_e104:} 很好的贴子,值得学习。谢谢楼主分享。 {:soso_e121:}谢谢楼主给出算法分析、
页:
[1]
2