吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11011|回复: 3
收起左侧

[原创] 一个软件算法分析+注册机有源码

  [复制链接]
1364847132 发表于 2015-8-13 15:32
本帖最后由 1364847132 于 2015-8-13 22:29 编辑

一个自己2年前的帖子:http://www.52pojie.cn/thread-211591-1-1.html
当时的是内存注册机,今天分析算法自己写注册机。说得很细,大牛直接掠过.
废话不多说直接进正题。


知道了是注册表重启验证那就直接下段BP RegOpenKeyA,F9运行
第一次停下来是在这里,保存的是试用的时间
1.png
再按一次F9,这个就是保存注册码
2.png
运行出来在这里
3.png
F8向下,走到这里
下面计算的是计算注册码时的机器码(因为显示出来的机器码与计算注册码时的机器码不同)
[Asm] 纯文本查看 复制代码
00401ACE   .  8D8C24 B40000>lea ecx,dword ptr ss:[esp+0xB4]
00401AD5   .  8D9424 9C0000>lea edx,dword ptr ss:[esp+0x9C]
00401ADC   .  8D8424 340100>lea eax,dword ptr ss:[esp+0x134]
00401AE3   .  68 80000000   push 0x80                                ; /pFileSystemNameSize = 00000080
00401AE8   .  51            push ecx                                 ; |pFileSystemNameBuffer = 003C3AB8
00401AE9   .  6A 00         push 0x0                                 ; |pFileSystemFlags = NULL
00401AEB   .  6A 00         push 0x0                                 ; |pMaxFilenameLength = NULL
00401AED   .  52            push edx                                 ; |pVolumeSerialNumber = 003C3AB9
00401AEE   .  68 80000000   push 0x80                                ; |MaxVolumeNameSize = 80 (128.)
00401AF3   .  50            push eax                                 ; |VolumeNameBuffer = 00000009
00401AF4   .  68 3C904000   push 泡泡猫瞄.0040903C                       ; |RootPathName = "c:\"
00401AF9   .  FF15 3C704000 call dword ptr ds:[<&KERNEL32.GetVolumeI>; \GetVolumeInformationA
00401AFF   .  8D4C24 74     lea ecx,dword ptr ss:[esp+0x74]
00401B03   .  E8 703F0000   call <jmp.&MFC42.#??0CString@@QAE@XZ_540>
00401B08   .  8B8C24 9C0000>mov ecx,dword ptr ss:[esp+0x9C]
00401B0F   .  8D5424 74     lea edx,dword ptr ss:[esp+0x74]
00401B13   .  51            push ecx
00401B14   .  68 38904000   push 泡泡猫瞄.00409038                       ;  ASCII "%d"
00401B19   .  52            push edx
00401B1A   .  C68424 C80100>mov byte ptr ss:[esp+0x1C8],0x5
00401B22   .  E8 273F0000   call <jmp.&MFC42.#?Format@CString@@QAAXP>;  转换成有符号10进制
00401B27   .  83C4 0C       add esp,0xC

00401B22把ecx转换成有符号10进制的字符串;根据00401B08,ecx又来自[esp+0x9C]
因为00401AD5和00401AED,[esp+0x9C]的值就是C盘的磁盘驱动器卷标序列号(可以用VOL C:查看)

所以这段的意思就是取C盘的磁盘驱动卷标序列号,并转换成有符号10进制的字符串(例如:-64789575)
[Asm] 纯文本查看 复制代码
00401B33   .  6A 06         push 0x6
00401B35   .  8D4424 1C     lea eax,dword ptr ss:[esp+0x1C]
00401B39   .  6A 01         push 0x1
00401B3B   .  50            push eax
00401B3C   .  8D8C24 800000>lea ecx,dword ptr ss:[esp+0x80]
00401B43   .  C68424 C80100>mov byte ptr ss:[esp+0x1C8],0x6
00401B4B   .  E8 F83E0000   call <jmp.&MFC42.#?Mid@CString@@QBE?AV1@HH@Z_4278>
00401B50   .  8BF8          mov edi,eax
00401B52   .  6A 06         push 0x6
00401B54   .  8D4C24 20     lea ecx,dword ptr ss:[esp+0x20]
00401B58   .  6A 01         push 0x1
00401B5A   .  51            push ecx
00401B5B   .  8D8C24 800000>lea ecx,dword ptr ss:[esp+0x80]
00401B62   .  C68424 C80100>mov byte ptr ss:[esp+0x1C8],0x7
00401B6A   .  E8 D93E0000   call <jmp.&MFC42.#?Mid@CString@@QBE?AV1@HH@Z_4278>
00401B6F   .  57            push edi
00401B70   .  8D5424 14     lea edx,dword ptr ss:[esp+0x14]
00401B74   .  B3 08         mov bl,0x8
00401B76   .  50            push eax
00401B77   .  52            push edx
00401B78   .  889C24 C80100>mov byte ptr ss:[esp+0x1C8],bl
00401B7F   .  E8 BE3E0000   call <jmp.&MFC42.#??H@YG?AVCString@@ABV0@0@Z_922>

00401B39-00401B4B和00401B52-00401B6A意思是一样的
就是刚才的字符串从第2(因为默认是0是第一个,所以push 0x1就是第二)个开始向后取6位.
00401B7F把两次取出来的连接在一起。(例如:647895647895)
[Asm] 纯文本查看 复制代码
00401BE6   .  B1 45         mov cl,0x45
00401BE8   .  8BE8          mov ebp,eax
00401BEA   .  BB 42000000   mov ebx,0x42
00401BEF   .  884C24 2F     mov byte ptr ss:[esp+0x2F],cl
。。。。。。。。。。。。。。。。。。。。。。。。
00401CD5   .  C64424 57 30  mov byte ptr ss:[esp+0x57],0x30
00401CDA   .  884424 58     mov byte ptr ss:[esp+0x58],al
00401CDE   .  C64424 59 39  mov byte ptr ss:[esp+0x59],0x39
00401CE3   .  E8 903D0000   call <jmp.&MFC42.#??0CString@@QAE@XZ_540>
00401CE8   .  8D4C24 14     lea ecx,dword ptr ss:[esp+0x14]
00401CEC   .  C68424 BC0100>mov byte ptr ss:[esp+0x1BC],0xA
00401CF4   .  E8 7F3D0000   call <jmp.&MFC42.#??0CString@@QAE@XZ_540>
00401CF9   .  C68424 BC0100>mov byte ptr ss:[esp+0x1BC],0xB
00401D01   .  33FF          xor edi,edi
00401D03   >  8A042F        mov al,byte ptr ds:[edi+ebp]
00401D06   .  3C 30         cmp al,0x30
00401D08   .  7C 3B         jl short 泡泡猫瞄.00401D45
00401D0A   .  3C 39         cmp al,0x39
00401D0C   .  7F 37         jg short 泡泡猫瞄.00401D45
00401D0E   .  0FBEC0        movsx eax,al
00401D11   .  83E8 30       sub eax,0x30
00401D14   .  8D9424 8C0000>lea edx,dword ptr ss:[esp+0x8C]
00401D1B   .  8D0447        lea eax,dword ptr ds:[edi+eax*2]
00401D1E   .  0FBE4C04 28   movsx ecx,byte ptr ss:[esp+eax+0x28]
00401D23   .  51            push ecx
00401D24   .  68 34904000   push 泡泡猫瞄.00409034                                  ;  ASCII "%c"
00401D29   .  52            push edx
00401D2A   .  E8 1F3D0000   call <jmp.&MFC42.#?Format@CString@@QAAXPBDZZ_2818>
00401D2F   .  83C4 0C       add esp,0xC
00401D32   .  8D8424 8C0000>lea eax,dword ptr ss:[esp+0x8C]
00401D39   .  8D4C24 14     lea ecx,dword ptr ss:[esp+0x14]
00401D3D   .  50            push eax
00401D3E   .  E8 E73C0000   call <jmp.&MFC42.#??YCString@@QAEABV0@ABV0@@Z_939>
00401D43   .  EB 0A         jmp short 泡泡猫瞄.00401D4F
00401D45   >  53            push ebx                                            ;  advapi32.77DA7A08
00401D46   .  8D4C24 18     lea ecx,dword ptr ss:[esp+0x18]
00401D4A   .  E8 D53C0000   call <jmp.&MFC42.#??YCString@@QAEABV0@D@Z_940>
00401D4F   >  83FF 03       cmp edi,0x3
00401D52   .  75 04         jnz short 泡泡猫瞄.00401D58
00401D54   .  6A 44         push 0x44
00401D56   .  EB 07         jmp short 泡泡猫瞄.00401D5F
00401D58   >  83FF 07       cmp edi,0x7
00401D5B   .  75 0B         jnz short 泡泡猫瞄.00401D68
00401D5D   .  6A 43         push 0x43
00401D5F   >  8D4C24 18     lea ecx,dword ptr ss:[esp+0x18]
00401D63   .  E8 BC3C0000   call <jmp.&MFC42.#??YCString@@QAEABV0@D@Z_940>
00401D68   >  47            inc edi
00401D69   .  83FF 0C       cmp edi,0xC
00401D6C   .^ 7C 95         jl short 泡泡猫瞄.00401D03                              ;  edi<12就跳

一大堆赋值,中间就省略了一下。
00401D03-00401D6C是一个循环,每次循环edi(edi初值为0)自加1,若edi<12循环继续
ebp指向的是刚才连接好的字符串的首地址(例如:ebp指"6",ebp+0x1指"4",ebp+0x2指"7")
00401D03:每次循环向后取一个字符(以下用字符代替)
00401D06-00401D0C:如果字符<0x30 或 字符>0x39 把0x42添加进机器码(此处指计算注册码时的机器码)内 否则
把[esp+0x28+2*(字符-0x30)+edi](就是刚才那一大堆的赋值)的值添加进机器码,
00401D4A-00401D63:如果edi=3 把0x44添加进机器码,如果edi=7 把0x43添加进机器码。
循环完成之后机器码就是计算注册码所需的机器码了(例如:14FFDE151CE02B)
[Asm] 纯文本查看 复制代码
00401DDB   .  6A 04         push 0x4
00401DDD   .  8D4C24 14     lea ecx,dword ptr ss:[esp+0x14]
00401DE1   .  6A 00         push 0x0
00401DE3   .  51            push ecx
00401DE4   .  8D4C24 20     lea ecx,dword ptr ss:[esp+0x20]
00401DE8   .  E8 5B3C0000   call <jmp.&MFC42.#?Mid@CString@@QBE?AV1@HH@Z_4278>
00401DED   .  50            push eax
00401DEE   .  8D4C24 7C     lea ecx,dword ptr ss:[esp+0x7C]
00401DF2   .  C68424 C00100>mov byte ptr ss:[esp+0x1C0],0x11
00401DFA   .  E8 3D3C0000   call <jmp.&MFC42.#??4CString@@QAEABV0@ABV0@@Z_858>
00401DFF   .  8D4C24 10     lea ecx,dword ptr ss:[esp+0x10]
00401E03   .  C68424 BC0100>mov byte ptr ss:[esp+0x1BC],0x10
00401E0B   .  E8 5C3C0000   call <jmp.&MFC42.#??1CString@@QAE@XZ_800>
00401E10   .  6A 04         push 0x4
00401E12   .  8D5424 14     lea edx,dword ptr ss:[esp+0x14]
00401E16   .  6A 05         push 0x5
00401E18   .  52            push edx
00401E19   .  8D4C24 20     lea ecx,dword ptr ss:[esp+0x20]
00401E1D   .  E8 263C0000   call <jmp.&MFC42.#?Mid@CString@@QBE?AV1@HH@Z_4278>
00401E22   .  50            push eax
00401E23   .  8D8C24 880000>lea ecx,dword ptr ss:[esp+0x88]
00401E2A   .  C68424 C00100>mov byte ptr ss:[esp+0x1C0],0x12
00401E32   .  E8 053C0000   call <jmp.&MFC42.#??4CString@@QAEABV0@ABV0@@Z_858>
00401E37   .  8D4C24 10     lea ecx,dword ptr ss:[esp+0x10]
00401E3B   .  C68424 BC0100>mov byte ptr ss:[esp+0x1BC],0x10
00401E43   .  E8 243C0000   call <jmp.&MFC42.#??1CString@@QAE@XZ_800>
00401E48   .  6A 04         push 0x4
00401E4A   .  8D4424 14     lea eax,dword ptr ss:[esp+0x14]
00401E4E   .  6A 0A         push 0xA
00401E50   .  50            push eax
00401E51   .  8D4C24 20     lea ecx,dword ptr ss:[esp+0x20]
00401E55   .  E8 EE3B0000   call <jmp.&MFC42.#?Mid@CString@@QBE?AV1@HH@Z_4278>
00401E5A   .  50            push eax
00401E5B   .  8D8C24 840000>lea ecx,dword ptr ss:[esp+0x84]
00401E62   .  C68424 C00100>mov byte ptr ss:[esp+0x1C0],0x13
00401E6A   .  E8 CD3B0000   call <jmp.&MFC42.#??4CString@@QAEABV0@ABV0@@Z_858>
00401E6F   .  8D4C24 10     lea ecx,dword ptr ss:[esp+0x10]
00401E73   .  C68424 BC0100>mov byte ptr ss:[esp+0x1BC],0x10

在这之前有个call转换成小写,我就没有贴出来了。
00401DDB-00401DE8取刚才机器码从第1个向后取4位(例如:14ff)
00401E10-00401E1D取刚才机器码从第6个向后取4位(例如:e151)
00401E48-00401E55取刚才机器码从第11个向后取4位(例如:e02b)
[Asm] 纯文本查看 复制代码
00401EC9   .  B1 63         mov cl,0x63
00401ECB   .  B3 73         mov bl,0x73
00401ECD   .  B2 75         mov dl,0x75
00401ECF   .  B0 71         mov al,0x71
00401ED1   .  C64424 28 61  mov byte ptr ss:[esp+0x28],0x61
00401ED6   .  884C24 29     mov byte ptr ss:[esp+0x29],cl
。。。。。。。。。。。。。。。。。。。。。。。
00401FF6   .  C64424 66 64  mov byte ptr ss:[esp+0x66],0x64
00401FFB   .  884C24 67     mov byte ptr ss:[esp+0x67],cl
00401FFF   .  33FF          xor edi,edi
00402001   >  8A042F        mov al,byte ptr ds:[edi+ebp]
00402004   .  3C 61         cmp al,0x61
00402006   .  7C 0C         jl short 泡泡猫瞄.00402014
00402008   .  3C 66         cmp al,0x66
0040200A   .  7F 08         jg short 泡泡猫瞄.00402014
0040200C   .  0FBEC0        movsx eax,al
0040200F   .  83E8 57       sub eax,0x57
00402012   .  EB 06         jmp short 泡泡猫瞄.0040201A
00402014   >  0FBEC0        movsx eax,al
00402017   .  83E8 30       sub eax,0x30
0040201A   >  8D0C87        lea ecx,dword ptr ds:[edi+eax*4]
0040201D   .  8D4424 20     lea eax,dword ptr ss:[esp+0x20]
00402021   .  0FBE540C 28   movsx edx,byte ptr ss:[esp+ecx+0x28]
00402026   .  52            push edx
00402027   .  68 34904000   push 泡泡猫瞄.00409034                                  ;  ASCII "%c"
0040202C   .  50            push eax
0040202D   .  E8 1C3A0000   call <jmp.&MFC42.#?Format@CString@@QAAXPBDZZ_2818>
00402032   .  83C4 0C       add esp,0xC
00402035   .  8D4C24 20     lea ecx,dword ptr ss:[esp+0x20]
00402039   .  51            push ecx
0040203A   .  8D4C24 6C     lea ecx,dword ptr ss:[esp+0x6C]
0040203E   .  E8 E7390000   call <jmp.&MFC42.#??YCString@@QAEABV0@ABV0@@Z_939>
00402043   .  47            inc edi
00402044   .  83FF 04       cmp edi,0x4
00402047   .^ 7C B8         jl short 泡泡猫瞄.00402001

又是一大堆赋值,然后是不是看到了和刚才很相似的循环,下面还有2个一模一样的循环。这里就是在计算注册码了。
既然与刚刚那个循环类似就简单说下
这里ebp指向的是(14ff)这个地方
00401D03:每次循环向后取一个字符(与刚刚相同)
00402004-0040200A:如果字符<0x61 或 字符>0x66 把[esp+4*(字符-0x30)+edi+0x28]添加进注册码 否则
[esp+4*(字符-0x57)+edi+0x28]添加进注册码,
循环完之后注册码的前4位就算完了,后面的8位和这里的算法一样。
下面是显示的机器码的算法
在计算完了机器码(计算注册码的机器码)后,下断。
1.png
F9之后,停在系统领域.一直F8返回到程序。
找到段首00404DD0。
2.png
这里和上面的一模一样,
取C盘的磁盘驱动卷标序列号,并转换成有符号10进制的字符串(例如:-64789575)
[Asm] 纯文本查看 复制代码
00404E55   .  6A 04         push 0x4
00404E57   .  8D5424 68     lea edx,dword ptr ss:[esp+0x68]
00404E5B   .  6A 02         push 0x2
00404E5D   .  52            push edx
00404E5E   .  8D4C24 20     lea ecx,dword ptr ss:[esp+0x20]
00404E62   .  C68424 8C0100>mov byte ptr ss:[esp+0x18C],0x1
00404E6A   .  E8 D90B0000   call <jmp.&MFC42.#?Mid@CString@@QBE?AV1@>
00404E6F   .  8BF0          mov esi,eax
00404E71   .  6A 04         push 0x4
00404E73   .  8D4424 60     lea eax,dword ptr ss:[esp+0x60]
00404E77   .  6A 01         push 0x1
00404E79   .  50            push eax
00404E7A   .  8D4C24 20     lea ecx,dword ptr ss:[esp+0x20]
00404E7E   .  C68424 8C0100>mov byte ptr ss:[esp+0x18C],0x2
00404E86   .  E8 BD0B0000   call <jmp.&MFC42.#?Mid@CString@@QBE?AV1@>
00404E8B   .  8BF8          mov edi,eax
00404E8D   .  6A 06         push 0x6
00404E8F   .  8D4C24 78     lea ecx,dword ptr ss:[esp+0x78]
00404E93   .  6A 01         push 0x1
00404E95   .  51            push ecx
00404E96   .  8D4C24 20     lea ecx,dword ptr ss:[esp+0x20]
00404E9A   .  C68424 8C0100>mov byte ptr ss:[esp+0x18C],0x3
00404EA2   .  E8 A10B0000   call <jmp.&MFC42.#?Mid@CString@@QBE?AV1@>
00404EA7   .  8BD8          mov ebx,eax
00404EA9   .  6A 06         push 0x6
00404EAB   .  8D5424 6C     lea edx,dword ptr ss:[esp+0x6C]
00404EAF   .  6A 01         push 0x1
00404EB1   .  52            push edx
00404EB2   .  8D4C24 20     lea ecx,dword ptr ss:[esp+0x20]
00404EB6   .  C68424 8C0100>mov byte ptr ss:[esp+0x18C],0x4
00404EBE   .  E8 850B0000   call <jmp.&MFC42.#?Mid@CString@@QBE?AV1@>

00404E55-00404E6A:从第3位开始向后取4位(例如:4789)
00404E71-00404E86:从第2位开始向后取4位(例如:6478)
00404E8D-00404EA2:从第2位开始向后取6位(例如:647895)
00404EA9-00404EBE:从第2位开始向后取6位(例如:647895)

之后下面的代码就是把这些从后向前连接起来(例如:64789564789564784789)
然后的算法就和上面算机器码(注册码的那个)一模一样
ebp指向刚才连接的串,循环次数改为20次。显示出来的机器码就算完了。
最后把附件贴出来 泡泡猫 注册机源码.7z (303.05 KB, 下载次数: 74) 易语言有源码的。


免费评分

参与人数 3威望 +2 热心值 +3 收起 理由
雷霆 + 1 热心回复!
du8912121 + 1 谢谢@Thanks!
Hmily + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2015-8-13 18:02
时隔两年,同样的程序不同的技术,你和它很有缘!
补你缺口 发表于 2015-8-13 19:02
niuniu919 发表于 2015-8-14 22:07
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-17 17:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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