小明同学 发表于 2014-12-10 08:47:10

第一次分析程序--资源修改工具算法分析

来论坛很久了,一直都在看教程,这是第一次找个简单的软件学习算法分析
对新手来说很累,几乎每行都查找汇编指令说明,才知道什么意思

练习的程序是从网上找的一款资源修改工具(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;
                }

        }

}

小明同学 发表于 2014-12-10 08:49:07

说话源码贴出来,自己看的好兴奋{:soso_e102:}

wangleweb 发表于 2014-12-10 10:17:39

顶下会算法的同学~

montana 发表于 2014-12-10 10:23:34

不错不错。

pentium450 发表于 2014-12-10 17:50:33

赞一个!

sndncel 发表于 2014-12-10 19:07:34

来这里也有好长一段时间了,软件简单的还是会破,不过叫我分析算法,真心没有那个耐心呀。。。。哎!!!!!

小明同学 发表于 2014-12-10 19:26:42

sndncel 发表于 2014-12-10 19:07
来这里也有好长一段时间了,软件简单的还是会破,不过叫我分析算法,真心没有那个耐心呀。。。。哎!!!! ...
多玩几次就快了

梦幻水晶 发表于 2014-12-10 22:49:34

膜拜,感谢楼主无私分享,论坛有你更精彩{:soso_e104:}

hwxm2005 发表于 2014-12-10 23:17:52

很好的贴子,值得学习。谢谢楼主分享。

Dxer 发表于 2014-12-11 10:39:02

{:soso_e121:}谢谢楼主给出算法分析、
页: [1] 2
查看完整版本: 第一次分析程序--资源修改工具算法分析