本帖最后由 GeekCat 于 2016-1-13 23:31 编辑
【文章标题】: 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、关键位置代码如下:
- 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:[ebp-0xC] ; 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:[ebp-0x18] ; 自减1
- 0040A25E |. 8D45 F4 lea eax,dword ptr ss:[ebp-0xC] ; 前面取出来的字符 '8'
- 0040A261 |. BA 02000000 mov edx,0x2
- 0040A266 |. E8 69690D00 call filemole.004E0BD4
- 0040A26B |. 66:C745 DC 08>mov word ptr ss:[ebp-0x24],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:[ebp-0x4] ; 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:[ebx+0x6F6] ; 注册码
- 0040A31F |. FF45 E8 inc dword ptr ss:[ebp-0x18]
- 0040A322 |. 833F 00 cmp dword ptr ds:[edi],0x0 ; (ASCII "8234567890QWERTYUIOP")
- 0040A325 |. 74 07 je short filemole.0040A32E
- 0040A327 |. 8B07 mov eax,dword ptr ds:[edi] ; (ASCII "8234567890QWERTYUIOP")
- 0040A329 |. 8B48 FC mov ecx,dword ptr ds:[eax-0x4] ; 注册码长度
- 0040A32C |. EB 02 jmp short filemole.0040A330
- 0040A32E |> 33C9 xor ecx,ecx
- 0040A330 |> 8D56 02 lea edx,dword ptr ds:[esi+0x2] ; 从第10们开始截取
- 0040A333 |. 8D83 F6060000 lea eax,dword ptr ds:[ebx+0x6F6] ; (ASCII "8234567890QWERTYUIOP")
- 0040A339 |. E8 EA6B0D00 call filemole.004E0F28 ; 从注册码中截取字符 ASCII "0QWERTYUIOP"
- 0040A33E |. 8D55 F0 lea edx,dword ptr ss:[ebp-0x10] ; ASCII "0QWERTYUIOP"
- 0040A341 |. 8D45 F8 lea eax,dword ptr ss:[ebp-0x8] ; 前面 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:[edi],dword ptr ds>; “0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”(表一)
- 0040A675 |. BE 70934F00 mov esi,filemole.004F9370
- 0040A67A |. 8DBD 58FEFFFF lea edi,dword ptr ss:[ebp-0x1A8]
- ————————————————————————略代码N行——————————————————————————————————
- 0040A735 |. C785 10FFFFFF>mov dword ptr ss:[ebp-0xF0],0x1
- 0040A73F |. E9 85000000 jmp filemole.0040A7C9
- 0040A744 |> 66:C785 2CFFF>/mov word ptr ss:[ebp-0xD4],0x8
- 0040A74D |. 8D85 58FEFFFF |lea eax,dword ptr ss:[ebp-0x1A8]
- 0040A753 |. 33F6 |xor esi,esi
- 0040A755 |. 8985 0CFFFFFF |mov dword ptr ss:[ebp-0xF4],eax ; 0012F77C
- 0040A75B |. 8DBD E8FEFFFF |lea edi,dword ptr ss:[ebp-0x118] ; “0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”
- 0040A761 |> 8B9D 10FFFFFF |/mov ebx,dword ptr ss:[ebp-0xF0]
- 0040A767 |. 53 ||push ebx
- 0040A768 |. 8D85 6CFFFFFF ||lea eax,dword ptr ss:[ebp-0x94] ; (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:[ebp-0x94]
- 0040A77D |. E8 9E660D00 ||call filemole.004E0E20
- 0040A782 |. 039D 6CFFFFFF ||add ebx,dword ptr ss:[ebp-0x94]
- 0040A788 |. 4B ||dec ebx
- 0040A789 |. 8A13 ||mov dl,byte ptr ds:[ebx]
- 0040A78B |. 3A17 ||cmp dl,byte ptr ds:[edi] ; 取截取字符串的每一位跟表一的每一位比较,找出截取码每位在表一中的位置
- 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:[ebp-0x90] ; 表2
- 0040A79A |. 03D0 ||add edx,eax
- 0040A79C |. 8D85 68FFFFFF ||lea eax,dword ptr ss:[ebp-0x98]
- 0040A7A2 |. E8 71640D00 ||call filemole.004E0C18 ; 找到在表二中相同位置(截取码各位在表一中位置值)字符串并拼接起来
- 0040A7A7 |. 8B95 0CFFFFFF ||mov edx,dword ptr ss:[ebp-0xF4] ; 堆栈 ss:[0012F830]=0012F784
- 0040A7AD |. 8B0A ||mov ecx,dword ptr ds:[edx] ; ecx=堆栈 ds:[0012F784]=011EF986
- 0040A7AF |. 018D 18FFFFFF ||add dword ptr ss:[ebp-0xE8],ecx ; 找到在表三中相同位置(截取码各位在表一中位置值),把查到的各组累加“0x13024303”
- 0040A7B5 |> 8385 0CFFFFFF>||add dword ptr ss:[ebp-0xF4],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:[ebp-0xF0]
- 0040A7C9 |> 83BD 6CFFFFFF> cmp dword ptr ss:[ebp-0x94],0x0 ; (ASCII "23456789")
- 0040A7D0 |. 74 0B |je short filemole.0040A7DD
- 0040A7D2 |. 8B85 6CFFFFFF |mov eax,dword ptr ss:[ebp-0x94] ; (ASCII "23456789")
- 0040A7D8 |. 8B50 FC |mov edx,dword ptr ds:[eax-0x4] ; 8
- 0040A7DB |. EB 02 |jmp short filemole.0040A7DF
- 0040A7DD |> 33D2 |xor edx,edx
- 0040A7DF |> 3B95 10FFFFFF |cmp edx,dword ptr ss:[ebp-0xF0]
- 0040A7E5 |.^ 0F8D 59FFFFFF \jge filemole.0040A744
- 0040A7EB |. 83BD 68FFFFFF>cmp dword ptr ss:[ebp-0x98],0x0 ; 查表二得 (ASCII "8584332557192332")
- 0040A7F2 |. 74 0B je short filemole.0040A7FF
- 0040A7F4 |. 8B85 68FFFFFF mov eax,dword ptr ss:[ebp-0x98] ; (ASCII "8584332557192332")
- 0040A7FA |. 8B58 FC mov ebx,dword ptr ds:[eax-0x4] ; 查表2得到字符串长度0x10-->16位
- 0040A7FD |. EB 02 jmp short filemole.0040A801
- ————————————————————————略代码N行——————————————————————————————————
- 0040A8A7 |. 8D85 64FFFFFF lea eax,dword ptr ss:[ebp-0x9C]
- 0040A8AD |. 8B95 14FFFFFF mov edx,dword ptr ss:[ebp-0xEC] ; 133C70D9
- 0040A8B3 |. E8 50620D00 call filemole.004E0B08 ; 16转10 133C70D9-->322728153
- 0040A8B8 |. FF85 38FFFFFF inc dword ptr ss:[ebp-0xC8]
- ————————————————————————略代码N行——————————————————————————————————
- 0040A948 |. E8 87620D00 |call filemole.004E0BD4
- 0040A94D |> 83BD 64FFFFFF> cmp dword ptr ss:[ebp-0x9C],0x0 ; (ASCII "322728153")
- 0040A954 |. 74 0B |je short filemole.0040A961
- 0040A956 |. 8B8D 64FFFFFF |mov ecx,dword ptr ss:[ebp-0x9C] ; (ASCII "322728153")
- 0040A95C |. 8B41 FC |mov eax,dword ptr ds:[ecx-0x4]
- ————————————————————————略代码N行——————————————————————————————————
- 0040A9E0 |. 8BD3 |mov edx,ebx
- 0040A9E2 |. 8D85 64FFFFFF |lea eax,dword ptr ss:[ebp-0x9C] ; (ASCII "322728153")
- 0040A9E8 |. B9 02000000 |mov ecx,0x2
- 0040A9ED |. E8 36650D00 |call filemole.004E0F28 ; 截取 一次两位
- 0040A9F2 |. 8D85 50FFFFFF |lea eax,dword ptr ss:[ebp-0xB0] ; “32”
- 0040A9F8 |. E8 0F660D00 |call filemole.004E100C ; 10转16 32-->20
- 0040A9FD |. 8BF0 |mov esi,eax
- 0040A9FF |. FF8D 38FFFFFF |dec dword ptr ss:[ebp-0xC8] ; 减1
- 0040AA05 |. 8D85 50FFFFFF |lea eax,dword ptr ss:[ebp-0xB0] ; “32”
- 0040AA0B |. BA 02000000 |mov edx,0x2
- 0040AA10 |. E8 BF610D00 |call filemole.004E0BD4
- 0040AA15 |. 66:C785 2CFFF>|mov word ptr ss:[ebp-0xD4],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:[ebp-0xD4],0x74
- 0040AA30 |. 8A9435 E8FEFF>|mov dl,byte ptr ss:[ebp+esi-0x118] ; 在表一中查,以前面截取两位数为位置的字符
- 0040AA37 |. 8D85 4CFFFFFF |lea eax,dword ptr ss:[ebp-0xB4]
- 0040AA3D |. E8 32600D00 |call filemole.004E0A74
- 0040AA42 |. 8BD0 |mov edx,eax
- 0040AA44 |. FF85 38FFFFFF |inc dword ptr ss:[ebp-0xC8]
- 0040AA4A |. 33C0 |xor eax,eax
- 0040AA4C |. 8985 48FFFFFF |mov dword ptr ss:[ebp-0xB8],eax
- 0040AA52 |. 8D8D 48FFFFFF |lea ecx,dword ptr ss:[ebp-0xB8]
- 0040AA58 |. FF85 38FFFFFF |inc dword ptr ss:[ebp-0xC8]
- 0040AA5E |. 8B7D 08 |mov edi,dword ptr ss:[ebp+0x8] ; 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:[ebp-0xB8]
- ————————————————————————略代码N行——————————————————————————————————
- 0040AAC4 |. FF85 38FFFFFF |inc dword ptr ss:[ebp-0xC8]
- 0040AACA |. 8D85 64FFFFFF |lea eax,dword ptr ss:[ebp-0x9C] ; “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:[ebp-0xBC] ; 每次截取两位数的第一位数
- 0040AAE2 |. 33C0 |xor eax,eax
- 0040AAE4 |. 8985 40FFFFFF |mov dword ptr ss:[ebp-0xC0],eax
- 0040AAEA |. 8D8D 40FFFFFF |lea ecx,dword ptr ss:[ebp-0xC0]
- 0040AAF0 |. FF85 38FFFFFF |inc dword ptr ss:[ebp-0xC8]
- 0040AAF6 |. 8B75 08 |mov esi,dword ptr ss:[ebp+0x8] ; 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:[ebp-0xC0] ; 截取两位中的第一位吗
- 0040AB0C |. 8BC6 |mov eax,esi
- ————————————————————————略代码N行——————————————————————————————————
- 0040AB4E |.^ 0F8C 6EFEFFFF \jl filemole.0040A9C2
- 0040AB54 |. 8B45 08 mov eax,dword ptr ss:[ebp+0x8] ; 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:[ebp-0x9C] ; (ASCII "322728153")
- 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,转载请注明作者及论坛并保存文章的完整! 来自群组: 我们都爱月姐姐 |