好友
阅读权限20
听众
最后登录1970-1-1
|
本帖最后由 1364847132 于 2015-8-13 22:29 编辑
一个自己2年前的帖子:http://www.52pojie.cn/thread-211591-1-1.html
当时的是内存注册机,今天分析算法自己写注册机。说得很细,大牛直接掠过.
废话不多说直接进正题。
知道了是注册表重启验证那就直接下段BP RegOpenKeyA,F9运行
第一次停下来是在这里,保存的是试用的时间
再按一次F9,这个就是保存注册码
运行出来在这里
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位和这里的算法一样。
下面是显示的机器码的算法
在计算完了机器码(计算注册码的机器码)后,下断。
F9之后,停在系统领域.一直F8返回到程序。
找到段首00404DD0。
这里和上面的一模一样,
取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)
,易语言有源码的。
|
免费评分
-
查看全部评分
|