飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 6580|回复: 4

[原创] AT File Mole v.2.2.3 算法分析

[复制链接]
  • TA的每日心情
    开心
    2019-3-25 14:18
  • 签到天数: 881 天

    [LV.10]以坛为家III

    发表于 2016-1-13 23:25:06 | 显示全部楼层 |阅读模式
    本帖最后由 GeekCat 于 2016-1-13 23:31 编辑

    【文章标题】: AT File Mole v.2.2.3 算法分析
    【作者邮箱】: [email protected]
    【作者主页】:
    【软件名称】: AT File Mole v.2.2.3
    【软件大小】: 806 KB (826,232 字节)
    【加壳方式】: 无壳
    【保护方式】: 注册码
    【编写语言】: Borland C++ 1999
    【使用工具】: OD、PEID
    【操作平台】: XP SP3
    破解声明】: 破解在于交流思路和过程,结果并不重要,请不要用于非法用途;
    【软件介绍】:  从 EXE、DLL、OCX 文件中提取所有图像和游标, 且保存成ICO, CUR, BMP, JPG, GIF 格式或直接拷贝到剪贴簿,是一种间单的 ANI, CUR, ICO ,WAV文件编辑器
    --------------------------------------------------------------------------------------------------------------------------------
    三个表:
    表一:0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

    表二:24 99 85 84 33 25 57 19 23 32 21 14 11 43 27 35 44 42 80 56 72 64 87 74 39 92 41 15 69 90 98 55 53 30 10 97

    表三:(4个8位为一组)
    004F9370  2C 27 A4 02 DD D4 92 03 86 F9 1E 01 AD FA 7E 02  
    004F9380  FB 6F CE 02 99 B8 18 03 C7 D1 08 03 3D A9 43 01  
    004F9390  B6 BF 40 03 82 EB EF 01 DC 3F 9E 03 DD BF BC 03  
    004F93A0  21 0B C6 03 CC FB A6 04 C2 07 9B 00 B2 65 32 01  
    004F93B0  42 40 A6 04 C1 48 0F 02 52 B4 EF 00 8D 1E FC 01  
    004F93C0  86 A8 A7 00 54 6A 40 01 52 33 D9 00 4D A8 41 04  
    004F93D0  C5 16 AC 02 4D 02 DE 00 62 72 28 02 FB D3 DA 01  
    004F93E0  00 F9 63 03 66 3C 87 05 54 6A F9 00 54 9D 2A 01  
    004F93F0  DA 85 A7 04 F0 FB B6 02 18 FA 38 01 B7 50 1A 05

    --------------------------------------------------------------------------------------------------------------------------------

    1、字符串、万能断点、F12、API快速找定位到关键点;
    2、关键位置代码如下:




    1. 0041D013  |.  53            push ebx
    2. 0041D014  |.  E8 F7D1FEFF   call filemole.0040A210                   ;  算法CALL
    3. 0041D019  |.  59            pop ecx
    4. 0041D01A  |.  84C0          test al,al
    5. 0041D01C  |.  75 52         jnz short filemole.0041D070              ;  关键跳转 要求跳转
    6. 0041D01E  |.  6A 00         push 0x0
    7. 0041D020  |.  BA E0AC4F00   mov edx,filemole.004FACE0                ;  Your registration code is wrong. Restart the program and repeat the registration once again
    复制代码




    3、F7进算法CALL 代码如下:




    1. 0040A245  |.  BA 01000000   mov edx,0x1
    2. 0040A24A  |.  E8 D96C0D00   call filemole.004E0F28                   ;  取注册码第1位
    3. 0040A24F  |.  8D45 F4       lea eax,dword ptr ss:[ebp-0xC]           ;  UNICODE "8"
    4. 0040A252  |.  33D2          xor edx,edx
    5. 0040A254  |.  E8 036E0D00   call filemole.004E105C                   ;  字符转数字 如果是字母转换失败结果为‘0’
    6. 0040A259  |.  8BF0          mov esi,eax
    7. 0040A25B  |.  FF4D E8       dec dword ptr ss:[ebp-0x18]              ;  自减1
    8. 0040A25E  |.  8D45 F4       lea eax,dword ptr ss:[ebp-0xC]           ;  前面取出来的字符 '8'
    9. 0040A261  |.  BA 02000000   mov edx,0x2
    10. 0040A266  |.  E8 69690D00   call filemole.004E0BD4
    11. 0040A26B  |.  66:C745 DC 08>mov word ptr ss:[ebp-0x24],0x8
    12. 0040A271  |.  83FE 04       cmp esi,0x4                              ;  注册码第一位要大于等于4  综合上面字符转换处和一位为4~9范围
    13. 0040A274  |.  7D 11         jge short filemole.0040A287              ;  要求跳转
    14. ————————————————————————略代码N行——————————————————————————————————
    15. 0040A2EA  |.  8D4D FC       lea ecx,dword ptr ss:[ebp-0x4]           ;  ASCII "23456789"
    16. 0040A2ED  |.  51            push ecx
    17. 0040A2EE  |.  53            push ebx
    18. 0040A2EF  |.  E8 98000000   call filemole.0040A38C                   ;  算法CALL -2
    19. ————————————————————————略代码N行——————————————————————————————————
    20. 0040A319  |.  8DBB F6060000 lea edi,dword ptr ds:[ebx+0x6F6]         ;  注册码
    21. 0040A31F  |.  FF45 E8       inc dword ptr ss:[ebp-0x18]
    22. 0040A322  |.  833F 00       cmp dword ptr ds:[edi],0x0               ;  (ASCII "8234567890QWERTYUIOP")
    23. 0040A325  |.  74 07         je short filemole.0040A32E
    24. 0040A327  |.  8B07          mov eax,dword ptr ds:[edi]               ;  (ASCII "8234567890QWERTYUIOP")
    25. 0040A329  |.  8B48 FC       mov ecx,dword ptr ds:[eax-0x4]           ;  注册码长度
    26. 0040A32C  |.  EB 02         jmp short filemole.0040A330
    27. 0040A32E  |>  33C9          xor ecx,ecx
    28. 0040A330  |>  8D56 02       lea edx,dword ptr ds:[esi+0x2]           ;  从第10们开始截取
    29. 0040A333  |.  8D83 F6060000 lea eax,dword ptr ds:[ebx+0x6F6]         ;  (ASCII "8234567890QWERTYUIOP")
    30. 0040A339  |.  E8 EA6B0D00   call filemole.004E0F28                   ;  从注册码中截取字符 ASCII "0QWERTYUIOP"
    31. 0040A33E  |.  8D55 F0       lea edx,dword ptr ss:[ebp-0x10]          ;  ASCII "0QWERTYUIOP"
    32. 0040A341  |.  8D45 F8       lea eax,dword ptr ss:[ebp-0x8]           ;  前面 0040A2EF处CALL出来EAX的值“WRSF”
    33. 0040A344  |.  E8 6F690D00   call filemole.004E0CB8                   ;  比较 CALL 要求 "0QWERTYUIOP"等于“WRSF”
    34. 0040A349  |.  50            push eax
    复制代码




    4、F7进算法CALL -2 代码如下:





    1. 0040A38C  /$  55            push ebp
    2. ——————————————————————略代码N行(表二)————————————————————————————
    3. 0040A66E  |.  B9 09000000   mov ecx,0x9
    4. 0040A673  |.  F3:A5         rep movs dword ptr es:[edi],dword ptr ds>;  “0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”(表一)
    5. 0040A675  |.  BE 70934F00   mov esi,filemole.004F9370
    6. 0040A67A  |.  8DBD 58FEFFFF lea edi,dword ptr ss:[ebp-0x1A8]
    7. ————————————————————————略代码N行——————————————————————————————————
    8. 0040A735  |.  C785 10FFFFFF>mov dword ptr ss:[ebp-0xF0],0x1
    9. 0040A73F  |.  E9 85000000   jmp filemole.0040A7C9
    10. 0040A744  |>  66:C785 2CFFF>/mov word ptr ss:[ebp-0xD4],0x8
    11. 0040A74D  |.  8D85 58FEFFFF |lea eax,dword ptr ss:[ebp-0x1A8]
    12. 0040A753  |.  33F6          |xor esi,esi
    13. 0040A755  |.  8985 0CFFFFFF |mov dword ptr ss:[ebp-0xF4],eax                    ;  0012F77C
    14. 0040A75B  |.  8DBD E8FEFFFF |lea edi,dword ptr ss:[ebp-0x118]                   ;  “0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”
    15. 0040A761  |>  8B9D 10FFFFFF |/mov ebx,dword ptr ss:[ebp-0xF0]
    16. 0040A767  |.  53            ||push ebx
    17. 0040A768  |.  8D85 6CFFFFFF ||lea eax,dword ptr ss:[ebp-0x94]                   ;  (ASCII "23456789")
    18. 0040A76E  |.  50            ||push eax
    19. 0040A76F  |.  E8 AC610D00   ||call filemole.004E0920
    20. 0040A774  |.  83C4 08       ||add esp,0x8
    21. 0040A777  |.  8D85 6CFFFFFF ||lea eax,dword ptr ss:[ebp-0x94]
    22. 0040A77D  |.  E8 9E660D00   ||call filemole.004E0E20
    23. 0040A782  |.  039D 6CFFFFFF ||add ebx,dword ptr ss:[ebp-0x94]
    24. 0040A788  |.  4B            ||dec ebx
    25. 0040A789  |.  8A13          ||mov dl,byte ptr ds:[ebx]
    26. 0040A78B  |.  3A17          ||cmp dl,byte ptr ds:[edi]                          ;  取截取字符串的每一位跟表一的每一位比较,找出截取码每位在表一中的位置
    27. 0040A78D  |.  75 26         ||jnz short filemole.0040A7B5
    28. 0040A78F  |.  8BD6          ||mov edx,esi                                       ;  esi为注册码字符在表中的位置
    29. 0040A791  |.  C1E2 02       ||shl edx,0x2                                       ;  左移2位
    30. 0040A794  |.  8D85 70FFFFFF ||lea eax,dword ptr ss:[ebp-0x90]                   ;  表2
    31. 0040A79A  |.  03D0          ||add edx,eax
    32. 0040A79C  |.  8D85 68FFFFFF ||lea eax,dword ptr ss:[ebp-0x98]
    33. 0040A7A2  |.  E8 71640D00   ||call filemole.004E0C18                            ;  找到在表二中相同位置(截取码各位在表一中位置值)字符串并拼接起来
    34. 0040A7A7  |.  8B95 0CFFFFFF ||mov edx,dword ptr ss:[ebp-0xF4]                   ;  堆栈 ss:[0012F830]=0012F784
    35. 0040A7AD  |.  8B0A          ||mov ecx,dword ptr ds:[edx]                        ;  ecx=堆栈 ds:[0012F784]=011EF986
    36. 0040A7AF  |.  018D 18FFFFFF ||add dword ptr ss:[ebp-0xE8],ecx                   ;  找到在表三中相同位置(截取码各位在表一中位置值),把查到的各组累加“0x13024303”
    37. 0040A7B5  |>  8385 0CFFFFFF>||add dword ptr ss:[ebp-0xF4],0x4
    38. 0040A7BC  |.  46            ||inc esi
    39. 0040A7BD  |.  47            ||inc edi
    40. 0040A7BE  |.  83FE 24       ||cmp esi,0x24
    41. 0040A7C1  |.^ 7C 9E         |\jl short filemole.0040A761
    42. 0040A7C3  |.  FF85 10FFFFFF |inc dword ptr ss:[ebp-0xF0]
    43. 0040A7C9  |>  83BD 6CFFFFFF> cmp dword ptr ss:[ebp-0x94],0x0                    ;  (ASCII "23456789")
    44. 0040A7D0  |.  74 0B         |je short filemole.0040A7DD
    45. 0040A7D2  |.  8B85 6CFFFFFF |mov eax,dword ptr ss:[ebp-0x94]                    ;  (ASCII "23456789")
    46. 0040A7D8  |.  8B50 FC       |mov edx,dword ptr ds:[eax-0x4]                     ;  8
    47. 0040A7DB  |.  EB 02         |jmp short filemole.0040A7DF
    48. 0040A7DD  |>  33D2          |xor edx,edx
    49. 0040A7DF  |>  3B95 10FFFFFF |cmp edx,dword ptr ss:[ebp-0xF0]
    50. 0040A7E5  |.^ 0F8D 59FFFFFF \jge filemole.0040A744
    51. 0040A7EB  |.  83BD 68FFFFFF>cmp dword ptr ss:[ebp-0x98],0x0                     ;  查表二得 (ASCII "8584332557192332")
    52. 0040A7F2  |.  74 0B         je short filemole.0040A7FF
    53. 0040A7F4  |.  8B85 68FFFFFF mov eax,dword ptr ss:[ebp-0x98]                     ;  (ASCII "8584332557192332")
    54. 0040A7FA  |.  8B58 FC       mov ebx,dword ptr ds:[eax-0x4]                      ;  查表2得到字符串长度0x10-->16位
    55. 0040A7FD  |.  EB 02         jmp short filemole.0040A801
    56. ————————————————————————略代码N行——————————————————————————————————
    57. 0040A8A7  |.  8D85 64FFFFFF lea eax,dword ptr ss:[ebp-0x9C]
    58. 0040A8AD  |.  8B95 14FFFFFF mov edx,dword ptr ss:[ebp-0xEC]                     ;  133C70D9
    59. 0040A8B3  |.  E8 50620D00   call filemole.004E0B08                              ;  16转10  133C70D9-->322728153
    60. 0040A8B8  |.  FF85 38FFFFFF inc dword ptr ss:[ebp-0xC8]
    61. ————————————————————————略代码N行——————————————————————————————————
    62. 0040A948  |.  E8 87620D00   |call filemole.004E0BD4
    63. 0040A94D  |>  83BD 64FFFFFF> cmp dword ptr ss:[ebp-0x9C],0x0                    ;  (ASCII "322728153")
    64. 0040A954  |.  74 0B         |je short filemole.0040A961
    65. 0040A956  |.  8B8D 64FFFFFF |mov ecx,dword ptr ss:[ebp-0x9C]                    ;  (ASCII "322728153")
    66. 0040A95C  |.  8B41 FC       |mov eax,dword ptr ds:[ecx-0x4]
    67. ————————————————————————略代码N行——————————————————————————————————
    68. 0040A9E0  |.  8BD3          |mov edx,ebx
    69. 0040A9E2  |.  8D85 64FFFFFF |lea eax,dword ptr ss:[ebp-0x9C]                    ;  (ASCII "322728153")
    70. 0040A9E8  |.  B9 02000000   |mov ecx,0x2
    71. 0040A9ED  |.  E8 36650D00   |call filemole.004E0F28                             ;  截取 一次两位
    72. 0040A9F2  |.  8D85 50FFFFFF |lea eax,dword ptr ss:[ebp-0xB0]                    ;  “32”
    73. 0040A9F8  |.  E8 0F660D00   |call filemole.004E100C                             ;  10转16 32-->20
    74. 0040A9FD  |.  8BF0          |mov esi,eax
    75. 0040A9FF  |.  FF8D 38FFFFFF |dec dword ptr ss:[ebp-0xC8]                        ;  减1
    76. 0040AA05  |.  8D85 50FFFFFF |lea eax,dword ptr ss:[ebp-0xB0]                    ;  “32”
    77. 0040AA0B  |.  BA 02000000   |mov edx,0x2
    78. 0040AA10  |.  E8 BF610D00   |call filemole.004E0BD4
    79. 0040AA15  |.  66:C785 2CFFF>|mov word ptr ss:[ebp-0xD4],0x5C
    80. 0040AA1E  |.  83FE 24       |cmp esi,0x24                                       ;  转16后跟x24比较 如果每次截取的两位数大于等于36--->0x24就跳转
    81. 0040AA21  |.  0F8D 85000000 |jge filemole.0040AAAC
    82. 0040AA27  |.  66:C785 2CFFF>|mov word ptr ss:[ebp-0xD4],0x74
    83. 0040AA30  |.  8A9435 E8FEFF>|mov dl,byte ptr ss:[ebp+esi-0x118]                 ;  在表一中查,以前面截取两位数为位置的字符
    84. 0040AA37  |.  8D85 4CFFFFFF |lea eax,dword ptr ss:[ebp-0xB4]
    85. 0040AA3D  |.  E8 32600D00   |call filemole.004E0A74
    86. 0040AA42  |.  8BD0          |mov edx,eax
    87. 0040AA44  |.  FF85 38FFFFFF |inc dword ptr ss:[ebp-0xC8]
    88. 0040AA4A  |.  33C0          |xor eax,eax
    89. 0040AA4C  |.  8985 48FFFFFF |mov dword ptr ss:[ebp-0xB8],eax
    90. 0040AA52  |.  8D8D 48FFFFFF |lea ecx,dword ptr ss:[ebp-0xB8]
    91. 0040AA58  |.  FF85 38FFFFFF |inc dword ptr ss:[ebp-0xC8]
    92. 0040AA5E  |.  8B7D 08       |mov edi,dword ptr ss:[ebp+0x8]                     ;  ebp+0x8 的值
    93. 0040AA61  |.  81C7 38050000 |add edi,0x538
    94. 0040AA67  |.  8BC7          |mov eax,edi
    95. 0040AA69  |.  E8 BE610D00   |call filemole.004E0C2C                             ;  把前从表1是查出来的字符进行拼接“WRSF”
    96. 0040AA6E  |.  8D95 48FFFFFF |lea edx,dword ptr ss:[ebp-0xB8]
    97. ————————————————————————略代码N行——————————————————————————————————
    98. 0040AAC4  |.  FF85 38FFFFFF |inc dword ptr ss:[ebp-0xC8]
    99. 0040AACA  |.  8D85 64FFFFFF |lea eax,dword ptr ss:[ebp-0x9C]                    ;  “457648958”(为了读这下面的代码在上面直接修改9位数,每两位都会大于0x24)
    100. 0040AAD0  |.  B9 01000000   |mov ecx,0x1
    101. 0040AAD5  |.  8BD3          |mov edx,ebx
    102. 0040AAD7  |.  E8 4C640D00   |call filemole.004E0F28                             ;  截取字符
    103. 0040AADC  |.  8D95 44FFFFFF |lea edx,dword ptr ss:[ebp-0xBC]                    ;  每次截取两位数的第一位数
    104. 0040AAE2  |.  33C0          |xor eax,eax
    105. 0040AAE4  |.  8985 40FFFFFF |mov dword ptr ss:[ebp-0xC0],eax
    106. 0040AAEA  |.  8D8D 40FFFFFF |lea ecx,dword ptr ss:[ebp-0xC0]
    107. 0040AAF0  |.  FF85 38FFFFFF |inc dword ptr ss:[ebp-0xC8]
    108. 0040AAF6  |.  8B75 08       |mov esi,dword ptr ss:[ebp+0x8]                     ;  ebp+0x8 的值
    109. 0040AAF9  |.  81C6 38050000 |add esi,0x538
    110. 0040AAFF  |.  8BC6          |mov eax,esi
    111. 0040AB01  |.  E8 26610D00   |call filemole.004E0C2C                             ;  在表一中查,以前面每次截取两位数中第一位数为位置的字符(观察表一:查得的数其实就是两位数的第一位)
    112. 0040AB06  |.  8D95 40FFFFFF |lea edx,dword ptr ss:[ebp-0xC0]                    ;  截取两位中的第一位吗
    113. 0040AB0C  |.  8BC6          |mov eax,esi
    114. ————————————————————————略代码N行——————————————————————————————————
    115. 0040AB4E  |.^ 0F8C 6EFEFFFF \jl filemole.0040A9C2
    116. 0040AB54  |.  8B45 08       mov eax,dword ptr ss:[ebp+0x8]                      ;  ebp+0x8 的值
    117. 0040AB57  |.  BA 02000000   mov edx,0x2
    118. 0040AB5C  |.  05 38050000   add eax,0x538
    119. 0040AB61  |.  50            push eax                                            ;  注意eax值 最后就是这个00B12E90-->‘WRSF’(4749)
    120. 0040AB62  |.  8D85 64FFFFFF lea eax,dword ptr ss:[ebp-0x9C]                     ;  (ASCII "322728153")
    121. 0040AB68  |.  FF8D 38FFFFFF dec dword ptr ss:[ebp-0xC8]
    复制代码


    ---------------------------------------------------------------------------------------------------------------------------
    算法总结:
    1、注册码第一位必须为数字且4~9(设为A),后面其它位的必须为数字或字母(要不在表一中查不到),根据注册码的第1位数值是多少来决定第从第2位起有多少个字符可以自定义(必须为数字或字母)(设为B),最后再加4位注册码(通过之前全部字符计算出来);
    2、从注册码第2位开始取,取第1位数值长度的字符串,分别取这个字符中的第一位字符到到表一中去查询找到位所在位置,然后到表二中去把各对应位置的字符拼接成一个多位数字字符串(设为C),再到表三中去查询对应位置组数据并把各组数据累加(设为D);
    3、截取数字字符串A的后一半,把截取得到的数字字符串10进制转16进制后除以注册码第1加上7的和最后得到商(设为C);
    4、C+D的和16进制转10进制得数字字符串,每次截取这处数字字符串两位,如果截取的两数小于36就到表一中找出数值位置的字符,如果截取的两数大于等于36,就取这个两位数第一位到表一中找出数值位置的字符(其实就是他本身,通过表一的特点可得出),一共只截取四组两位数,最后把通过查询表一得到的4个字符拼接起来(设为E);
    5、注册码拼接:A+B+E

    一组可用注册码:
    8CHINAPYG32G9(必须带PYG啊)
    ---------------------------------------------------------------------------------------------------------------------------
    【版权声明】:
    本文原创于GeekCat/P.Y.G,转载请注明作者及论坛并保存文章的完整!
    来自群组: 我们都爱月姐姐

    评分

    参与人数 4威望 +32 飘云币 +48 收起 理由
    expasy + 4 感谢发布原创作品!
    tree_fly + 20 必须带PYG啊
    gagmeng + 8 + 8 G版算法大牛啊,顶!
    pentium450 + 20 + 20 大赞!楼主的算法功力了得!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    前天 10:56
  • 签到天数: 1696 天

    [LV.Master]伴坛终老

    发表于 2016-1-14 08:44:19 | 显示全部楼层
    不错,学习学习了
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2024-3-10 19:49
  • 签到天数: 473 天

    [LV.9]以坛为家II

    发表于 2016-1-14 09:07:32 | 显示全部楼层
    我是来支持的。谢谢GC分享好的算法
    PYG19周年生日快乐!
  • TA的每日心情

    2022-5-20 13:32
  • 签到天数: 235 天

    [LV.7]常住居民III

    发表于 2016-1-14 09:33:58 | 显示全部楼层
    哈哈,膜拜楼主,算法分析非常精彩
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    前天 19:05
  • 签到天数: 2018 天

    [LV.Master]伴坛终老

    发表于 2016-1-15 00:26:10 | 显示全部楼层
    好高深啊,,门外汉,看不懂啊
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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