GeekCat 发表于 2016-1-13 23:25:06

AT File Mole v.2.2.3 算法分析

本帖最后由 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【下载地址】: http://www.crsky.com/soft/3003.html【破解声明】: 破解在于交流思路和过程,结果并不重要,请不要用于非法用途;
【软件介绍】:从 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位为一组)
004F93702C 27 A4 02 DD D4 92 03 86 F9 1E 01 AD FA 7E 02
004F9380FB 6F CE 02 99 B8 18 03 C7 D1 08 03 3D A9 43 01
004F9390B6 BF 40 03 82 EB EF 01 DC 3F 9E 03 DD BF BC 03
004F93A021 0B C6 03 CC FB A6 04 C2 07 9B 00 B2 65 32 01
004F93B042 40 A6 04 C1 48 0F 02 52 B4 EF 00 8D 1E FC 01
004F93C086 A8 A7 00 54 6A 40 01 52 33 D9 00 4D A8 41 04
004F93D0C5 16 AC 02 4D 02 DE 00 62 72 28 02 FB D3 DA 01
004F93E000 F9 63 03 66 3C 87 05 54 6A F9 00 54 9D 2A 01
004F93F0DA 85 A7 04 F0 FB B6 02 18 FA 38 01 B7 50 1A 05
--------------------------------------------------------------------------------------------------------------------------------
1、字符串、万能断点、F12、API快速找定位到关键点;
2、关键位置代码如下:



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



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



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



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




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

---------------------------------------------------------------------------------------------------------------------------算法总结: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,转载请注明作者及论坛并保存文章的完整!我们都爱月姐姐

wxq 发表于 2016-1-14 08:44:19

不错,学习学习了

Dxer 发表于 2016-1-14 09:07:32

我是来支持的。谢谢GC分享好的算法

千千万是福朋友 发表于 2016-1-14 09:33:58

哈哈,膜拜楼主,算法分析非常精彩

daoben 发表于 2016-1-15 00:26:10

好高深啊,,门外汉,看不懂啊
页: [1]
查看完整版本: AT File Mole v.2.2.3 算法分析