飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5186|回复: 11

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

[复制链接]
  • TA的每日心情
    慵懒
    2020-10-4 16:41
  • 签到天数: 31 天

    [LV.5]常住居民I

    发表于 2014-12-10 08:47:10 | 显示全部楼层 |阅读模式
      来论坛很久了,一直都在看教程,这是第一次找个简单的软件学习算法分析
      对新手来说很累,几乎每行都查找汇编指令说明,才知道什么意思

      练习的程序是从网上找的一款资源修改工具(eXeScope)
      以下为自己的分析.可能会有错误,望谅解


    1. 程序注册下,看看有什么提示:"无效的ID或名字"
        1.jpg

    2. 查找字符串"无效的ID或名字"并下断.运行
        2.jpg

        3.jpg

    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

    算法源码:
    1. package
    2. {

    3.         import res;

    4.         public class reg
    5.         {

    6.                 public function key()
    7.                 {
    8.                         var str_start:int;
    9.                         var tmp:int;
    10.                         var num:String = "0123456798";
    11.                         // 前5位
    12.                         str_start = (Math.random() * 100) % 2;
    13.                         if (str_start == 0)
    14.                         {
    15.                                 res.id = "A1910";
    16.                         }
    17.                         else
    18.                         {
    19.                                 res.id = "A1423";
    20.                         }
    21.                         // 中3位
    22.                         for (var i:int = 0; i != 3; i++)
    23.                         {

    24.                                 res.id +=  GetNumber();
    25.                         }
    26.                         // 最后2位
    27.                         tmp = GetNumber();
    28.                         res.id +=  tmp;
    29.                         trace("第九位: " + tmp + "-->" + res.id.charCodeAt(res.id.length - 1));

    30.                         for (var j:int = 0; j != 10; j++)
    31.                         {
    32.                                 if (((res.id.charCodeAt(res.id.length - 1) + num.charCodeAt(j)) % 10) == 4)
    33.                                 {
    34.                                         trace("第十位: " + num.charAt(j) + "-->" + num.charCodeAt(j));
    35.                                         res.id +=  num.charAt(j);
    36.                                         break;
    37.                                 }
    38.                         }
    39.                         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)));
    40.                 }

    41.                 private function GetNumber():int
    42.                 {
    43.                         var num:int;

    44.                         num = (Math.random() * 10) - 1;
    45.                         if (num == -1)
    46.                         {
    47.                                 num = (Math.random() * 10) - 1;
    48.                         }
    49.                         if (num == -1)
    50.                         {
    51.                                 num = 0;
    52.                         }
    53.                         return num;
    54.                 }

    55.         }

    56. }
    复制代码


    评分

    参与人数 2威望 +4 飘云币 +12 收起 理由
    [PYG]版务督察 + 12 赞一个!
    sndncel + 4 膜拜会分析算法的人呀。。。。支持一下呀。.

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2020-10-4 16:41
  • 签到天数: 31 天

    [LV.5]常住居民I

     楼主| 发表于 2014-12-10 08:49:07 | 显示全部楼层
    说话源码贴出来,自己看的好兴奋{:soso_e102:}
    PYG19周年生日快乐!
  • TA的每日心情

    2018-2-23 05:19
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2014-12-10 10:17:39 | 显示全部楼层
    顶下会算法的同学~
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2024-4-13 20:08
  • 签到天数: 2046 天

    [LV.Master]伴坛终老

    发表于 2014-12-10 19:07:34 | 显示全部楼层
    来这里也有好长一段时间了,软件简单的还是会破,不过叫我分析算法,真心没有那个耐心呀。。。。哎!!!!!
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2020-10-4 16:41
  • 签到天数: 31 天

    [LV.5]常住居民I

     楼主| 发表于 2014-12-10 19:26:42 | 显示全部楼层
    sndncel 发表于 2014-12-10 19:07
    来这里也有好长一段时间了,软件简单的还是会破,不过叫我分析算法,真心没有那个耐心呀。。。。哎!!!! ...

    多玩几次就快了
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-6-4 23:58
  • 签到天数: 82 天

    [LV.6]常住居民II

    发表于 2014-12-10 22:49:34 | 显示全部楼层
    膜拜,感谢楼主无私分享,论坛有你更精彩{:soso_e104:}
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-7-3 09:02
  • 签到天数: 118 天

    [LV.6]常住居民II

    发表于 2014-12-10 23:17:52 | 显示全部楼层
    很好的贴子,值得学习。谢谢楼主分享。
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2024-3-10 19:49
  • 签到天数: 473 天

    [LV.9]以坛为家II

    发表于 2014-12-11 10:39:02 | 显示全部楼层
    {:soso_e121:}谢谢楼主给出算法分析、
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表