首页
社区
课程
招聘
[原创]呕心沥血用汇编写的Keygenme
发表于: 2008-12-26 22:56 7326

[原创]呕心沥血用汇编写的Keygenme

2008-12-26 22:56
7326
呕心沥血用汇编写的Keygenme,一路写来真的不容易啊!以前还老是歧视易语言,总说它怎么不好.现在想来自己真

的是愚昧无知,易语言的作者能把如此难的API转化为简单的中文供大家使用真是神啊!在汇编里有的只是API和一

些寄存器,写起程序来真是要了人的命啊!这也是为什么这类CM会那么少的原因之一啊!所以希望大家在玩的时候

能认真点的对待,这是一个Keygenme,如果只想爆破和随意追个注册码就了事的人,那就最好不要浪费你的宝贵时

间,因为从开OD到追出明码的时间最多也不到1分钟.而且这东东还加入了某软件关键的算法部分,看懂了这个算法

就等同拥有了这个软件的算法注册机了!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 212
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
顶,能用ASM写出CM来说已经很不错了。深有同感!(不过现在ASM写的CM源码都有很多)
2008-12-26 23:13
0
雪    币: 261
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
LS的能个几个来参考一下吗?我这个是用DELPHI写出来,然后再用OD反编译出来的,不太懂汇编有可能会有内存溢出的现象,要是有错请高手们指出!
2008-12-26 23:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看来楼主对语言很有研究嘛!!!
说易语言垃圾是因为 相对而言易语言有些地方不是很多完善。
不过,只要你学的好,我想任何一种语言都可以变成一种利器。
但如果学的不好 即使你把世界上的语言通通学了,你也只能是样样精通 样样稀松而已 。

再说 易语言现在是很垃圾。
但我想这可能不会一成不变 永远垃圾下去吧 。
个人看法!!!!
2008-12-26 23:26
0
雪    币: 295
活跃值: (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
code:12345
serial:73305657
2008-12-27 02:37
0
雪    币: 261
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
样样精通 样样稀松而已 。

哈哈!我没那么神,至少不会VB,BCD,还有C++也没有!我也有我最强项就是DELPHI!
2008-12-27 09:35
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
7
楼主以前明白人,现在才叫愚昧无知
E语言自己玩玩小打小闹可以,终究在几年内是上不了台面的
你看外面有哪家正规公司(我的定义是除去外挂木马工作室)招程序员是招E语言的?
2008-12-27 10:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我十分的同意您的看法
易语言短期内很难有飞越的进步!
出于对国产的支持 所以我很期待易语言有能上得支台面的那一天!!!!
2008-12-27 12:04
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
9
嘿嘿 不好意思 窃了成果
上传的附件:
2008-12-27 17:01
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
EBX 被算法破坏掉了, 引发例外.
callback func 请养成保存ebx'esi'edi的习惯
2008-12-27 18:01
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
支持一下lz,我是菜鸟新手,向lz学习了!
具体算法处理过程如下,不知道对不对:

00401201  /$  8BD8          mov     ebx, eax
00401203  |.  8BC3          mov     eax, ebx
00401205  |.  B9 E4120000   mov     ecx, 12E4
0040120A  |.  33D2          xor     edx, edx                         ;  10进制:eax=1e240 即123456 ecx=12e4 即4836
0040120C  |.  F7F1          div     ecx                              ;  商eax=19 余数edx=9FC
0040120E  |.  81F2 F1250B00 xor     edx, 0B25F1                      ;  余数与B25F1异或 EDX=B2C0D 十进制732173
00401214  |.  8BDA          mov     ebx, edx
00401216  |.  8BC3          mov     eax, ebx
00401218  |.  33D2          xor     edx, edx
0040121A  |.  52            push    edx
0040121B  |.  50            push    eax
0040121C  |.  8BD0          mov     edx, eax
0040121E  |.  52            push    edx                              ; /<%d>
0040121F  |.  68 00304000   push    Keygenme.00403000                ; |%d
00401224  |.  68 10304000   push    Keygenme.00403010                ; |s = Keygenme.00403010
00401229  |.  E8 D0000000   call    <jmp.&user32.wsprintfA>          ; \wsprintfA
0040122E  |.  83C4 0C       add     esp, 0C                          ;  把732173转化为字符串:732173 放在403010
00401231  |.  5A            pop     edx
00401232  |.  5A            pop     edx
00401233  |.  8D05 10304000 lea     eax, dword ptr ds:[403010]       ;  此行无意义
00401239  |.  0FB605 103040>movzx   eax, byte ptr ds:[403010]        ;  取结果第一个字符放eax=37
00401240  |.  8D15 10304000 lea     edx, dword ptr ds:[403010]
00401246  |.  0FB615 113040>movzx   edx, byte ptr ds:[403011]        ;  取结果第二个字符放edx=33
0040124D  |.  03C2          add     eax, edx                         ;  把上两个字符加起来放eax=6a
0040124F  |.  B9 05000000   mov     ecx, 5
00401254  |.  33D2          xor     edx, edx
00401256  |.  F7F1          div     ecx                              ;  相加结果除以5 商eax=15 余edx=1
00401258  |.  80C2 04       add     dl, 4                            ;  余数加4 edx=5
0040125B  |.  52            push    edx
0040125C  |.  50            push    eax
0040125D  |.  8BC2          mov     eax, edx                         ;  把edx中的数值%d格式化放在403110中,此处为5
0040125F  |.  50            push    eax                              ; /<%d>
00401260  |.  68 03304000   push    Keygenme.00403003                ; |%d
00401265  |.  68 10314000   push    Keygenme.00403110                ; |s = Keygenme.00403110
0040126A  |.  E8 8F000000   call    <jmp.&user32.wsprintfA>          ; \wsprintfA
0040126F  |.  83C4 0C       add     esp, 0C
00401272  |.  5A            pop     edx
00401273  |.  5A            pop     edx
00401274  |.  8D05 10304000 lea     eax, dword ptr ds:[403010]       ;  以下同401233处的处理:
0040127A  |.  0FB605 123040>movzx   eax, byte ptr ds:[403012]        ;  处理第三个字符:2
00401281  |.  8D15 10304000 lea     edx, dword ptr ds:[403010]
00401287  |.  0FB615 133040>movzx   edx, byte ptr ds:[403013]        ;  处理第四个字符:1
0040128E  |.  03C2          add     eax, edx                         ;  把上两个字符加起来放eax=63
00401290  |.  B9 05000000   mov     ecx, 5
00401295  |.  33D2          xor     edx, edx
00401297  |.  F7F1          div     ecx                              ;  相加结果除以5 商eax=13 余edx=4
00401299  |.  80C2 03       add     dl, 3                            ;  余数加3 edx=7
0040129C  |.  52            push    edx
0040129D  |.  50            push    eax
0040129E  |.  8BC2          mov     eax, edx                         ;  把上面结果再格式化为字符串'7'
004012A0  |.  50            push    eax                              ; /<%d>
004012A1  |.  68 06304000   push    Keygenme.00403006                ; |%d
004012A6  |.  68 10324000   push    Keygenme.00403210                ; |s = Keygenme.00403210
004012AB  |.  E8 4E000000   call    <jmp.&user32.wsprintfA>          ; \wsprintfA
004012B0  |.  83C4 0C       add     esp, 0C                          ;  把三个字符串接起来
004012B3  |.  68 10324000   push    Keygenme.00403210                ; /<%s> = "7"
004012B8  |.  68 10314000   push    Keygenme.00403110                ; |<%s> = "5"
004012BD  |.  68 10304000   push    Keygenme.00403010                ; |<%s> = "732173"
004012C2  |.  68 09304000   push    Keygenme.00403009                ; |%s%s%s
004012C7  |.  68 10334000   push    Keygenme.00403310                ; |s = Keygenme.00403310
004012CC  |.  E8 2D000000   call    <jmp.&user32.wsprintfA>          ; \wsprintfA
004012D1  |.  83C4 14       add     esp, 14                          ;  形成新字符串:73217357 与输入结果相比判断
004012D4  |.  68 10334000   push    Keygenme.00403310                ; /String2 = "73217357"
004012D9  |.  68 2C354000   push    Keygenme.0040352C                ; |String1 = "73217357"
004012DE  |.  E8 15000000   call    <jmp.&kernel32.lstrcmpA>         ; \lstrcmpA
004012E3  |.  5A            pop     edx
004012E4  |.  5A            pop     edx
004012E5  \.  C3            retn

算法如下:输入用户名:123456 注册码:444444
1.从把注册名转化为整形值 为10进制:1234567
2.结果除以4836的余数与B25F1异或 为10进制:732173
3.把上面的结果以%d格式化为 '732173' 设为var1
4.前两个字节的二进制值相加,再除以5,余数+4 转化为字符'5',设为var2
5.第三个,第四个字节二进制相加,再除以5,余数+3, 转化为字符'7',设为var3
6.把三个字符连接起来,即var1+var2+var3,结果为'73217357'
7.结果即为注册码
2008-12-27 18:03
0
雪    币: 261
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
不好意思,刚刚学汇编,根本不懂什么是EDX,ESI,EDI ,OD翻译瞎写,现在认真在学习着!还有楼上分析的不错要好好加油啊!
2008-12-27 21:16
0
雪    币: 517
活跃值: (64)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
13
算法挺简单的,注释一下

00401201  MOV EBX, EAX                         ;  EBX=0x1E240
00401203  MOV EAX, EBX                         ;  EAX=0x1E240
00401205  MOV ECX, 12E4                        ;  ECX=0x12E4
0040120A  XOR EDX, EDX                         ;  EDX=0,CF=0   //自身xor运算结果为0,CF=0
0040120C  DIV ECX                              ;  EAX=0x19;EDX=0x9FC //除法运算,商在EAX中,余数在EDX中
0040120E  XOR EDX, 0B25F1                      ;  EDX=0xB2C0D   //EDX=0x9FC^0xB25F1
00401214  MOV EBX, EDX                         ;  EBX=0xB2C0D
00401216  MOV EAX, EBX                         ;  EAX=0xB2C0D
00401218  XOR EDX, EDX                         ;  EDX=0,CF=0   //自身xor运算结果为0,CF=0
0040121A  PUSH EDX                             ;  0x0进栈
0040121B  PUSH EAX                             ;  0xB2C0D进栈
0040121C  MOV EDX, EAX                         ;  EDX=0xB2C0D
0040121E  PUSH EDX                             ; /arglist=0xB2C0D
0040121F  PUSH 403000                          ; |lpFormat=0x403000   (ASCII字符串:"%d")
00401224  PUSH 403010                          ; |lpBuffer=0x403010   (缓冲区ASCII字符串:"732173")
00401229  CALL 004012FE                        ; \wsprintfA  把arglist列表的数据按lpFormat的格式保存到lpBuffer中
0040122E  ADD ESP, 0C                          ;  在栈中抛去空闲空间,大小为0C字节(如EAX为双字,4字节)
00401231  POP EDX                              ;  EDX=0xB2C0D
00401232  POP EDX                              ;  EDX=0x0
00401233  LEA EAX, DWORD PTR DS:[403010]       ;  EAX=0x403010   (ASCII字符串:"732173")
00401239  MOVZX EAX, BYTE PTR DS:[403010]      ;  EAX=0x37 ('7')   //DS段[403010]   (ASCII字符串:"732173")
00401240  LEA EDX, DWORD PTR DS:[403010]       ;  EDX=0x403010   (ASCII字符串:"732173")
00401246  MOVZX EDX, BYTE PTR DS:[403011]      ;  EDX=0x33 ('3')   //DS段[403011]   (ASCII字符串:"32173")
0040124D  ADD EAX, EDX                         ;  EAX=0x6A   //EAX=0x37+0x33
0040124F  MOV ECX, 5                           ;  ECX=0x5
00401254  XOR EDX, EDX                         ;  EDX=0,CF=0   //自身xor运算结果为0,CF=0
00401256  DIV ECX                              ;  EAX=0x15;EDX=0x1 //除法运算,商在EAX中,余数在EDX中
00401258  ADD DL, 4                            ;  DL=0x5   //DL=0x1+0x4
0040125B  PUSH EDX                             ;  0x5进栈
0040125C  PUSH EAX                             ;  0x15进栈
0040125D  MOV EAX, EDX                         ;  EAX=0x5
0040125F  PUSH EAX                             ; /arglist=0x5
00401260  PUSH 403003                          ; |lpFormat=0x403003   (ASCII字符串:"%d")
00401265  PUSH 403110                          ; |lpBuffer=0x403110   (缓冲区ASCII字符串:"5")
0040126A  CALL 004012FE                        ; \wsprintfA  把arglist列表的数据按lpFormat的格式保存到lpBuffer中
0040126F  ADD ESP, 0C                          ;  在栈中抛去空闲空间,大小为0C字节(如EAX为双字,4字节)
00401272  POP EDX                              ;  EDX=0x15
00401273  POP EDX                              ;  EDX=0x5
00401274  LEA EAX, DWORD PTR DS:[403010]       ;  EAX=0x403010   (ASCII字符串:"732173")
0040127A  MOVZX EAX, BYTE PTR DS:[403012]      ;  EAX=0x32 ('2')   //DS段[403012]   (ASCII字符串:"2173")
00401281  LEA EDX, DWORD PTR DS:[403010]       ;  EDX=0x403010   (ASCII字符串:"732173")
00401287  MOVZX EDX, BYTE PTR DS:[403013]      ;  EDX=0x31 ('1')   //DS段[403013]   (ASCII字符串:"173")
0040128E  ADD EAX, EDX                         ;  EAX=0x63   //EAX=0x32+0x31
00401290  MOV ECX, 5                           ;  ECX=0x5
00401295  XOR EDX, EDX                         ;  EDX=0,CF=0   //自身xor运算结果为0,CF=0
00401297  DIV ECX                              ;  EAX=0x13;EDX=0x4 //除法运算,商在EAX中,余数在EDX中
00401299  ADD DL, 3                            ;  DL=0x7   //DL=0x4+0x3
0040129C  PUSH EDX                             ;  0x7进栈
0040129D  PUSH EAX                             ;  0x13进栈
0040129E  MOV EAX, EDX                         ;  EAX=0x7
004012A0  PUSH EAX                             ; /arglist=0x7
004012A1  PUSH 403006                          ; |lpFormat=0x403006   (ASCII字符串:"%d")
004012A6  PUSH 403210                          ; |lpBuffer=0x403210   (缓冲区ASCII字符串:"7")
004012AB  CALL 004012FE                        ; \wsprintfA  把arglist列表的数据按lpFormat的格式保存到lpBuffer中
004012B0  ADD ESP, 0C                          ;  在栈中抛去空闲空间,大小为0C字节(如EAX为双字,4字节)
004012B3  PUSH 403210                          ; /0x403210进栈   (ASCII字符串:"7")
004012B8  PUSH 403110                          ; |0x403110进栈   (ASCII字符串:"5")
004012BD  PUSH 403010                          ; |arglist=0x403010   (ASCII字符串:"732173")
004012C2  PUSH 403009                          ; |lpFormat=0x403009   (ASCII字符串:"%s%s%s")
004012C7  PUSH 403310                          ; |lpBuffer=0x403310   (缓冲区ASCII字符串:"73217357")
004012CC  CALL 004012FE                        ; \wsprintfA  把arglist列表的数据按lpFormat的格式保存到lpBuffer中
004012D1  ADD ESP, 14                          ;  在栈中抛去空闲空间,大小为14字节(如EAX为双字,4字节)
004012D4  PUSH 403310                          ; /ASCII "73217357"
004012D9  PUSH 40352C                          ; |ASCII "79797979"
004012DE  CALL 004012F8                        ; \lstrcmpA(kernel32)
004012E3  POP EDX                              ;  EDX=0x13
004012E4  POP EDX                              ;  EDX=0x7
004012E5  RETN
2008-12-28 00:38
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
14
楼上的注释是工具生成的?看着这么奇怪。

11楼已经放出算法了,我给个我写的C++

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>

int  main()
{

int serial;
std::stringstream code_buffer;

try
{
    std::cin    >> serial;
    code_buffer << std::dec << ( (serial % 0x12e4) ^ 0xb25f1 );
    code_buffer << std::dec << ( (code_buffer.str()[0] + code_buffer.str()[1]) % 5 + 4);
    code_buffer << std::dec << ( (code_buffer.str()[2] + code_buffer.str()[3]) % 5 + 3);
    std::cout   << code_buffer.str() << std::endl;

}
catch(std::exception e)
{
    std::cerr << e.what();
    return -1;
} 
system("pause");
return 0;
}
2008-12-28 04:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这个注册机的算法我已经写出来,还算是比较简单的,呵呵
有空再写写如何算的
上传的附件:
2008-12-28 05:50
0
雪    币: 517
活跃值: (64)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
16
是工具生成的
2008-12-29 01:13
0
雪    币: 94
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
5楼 我佩服你
呵呵
2008-12-29 16:02
0
游客
登录 | 注册 方可回帖
返回
//