能力值:
( LV4,RANK:50 )
|
-
-
2 楼
顶,能用ASM写出CM来说已经很不错了。深有同感!(不过现在ASM写的CM源码都有很多)
|
能力值:
( LV6,RANK:90 )
|
-
-
3 楼
LS的能个几个来参考一下吗?我这个是用DELPHI写出来,然后再用OD反编译出来的,不太懂汇编有可能会有内存溢出的现象,要是有错请高手们指出!
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
看来楼主对语言很有研究嘛!!!
说易语言垃圾是因为 相对而言易语言有些地方不是很多完善。
不过,只要你学的好,我想任何一种语言都可以变成一种利器。
但如果学的不好 即使你把世界上的语言通通学了,你也只能是样样精通 样样稀松而已 。
再说 易语言现在是很垃圾。
但我想这可能不会一成不变 永远垃圾下去吧 。
个人看法!!!!
|
能力值:
( LV5,RANK:60 )
|
-
-
5 楼
code:12345
serial:73305657
|
能力值:
( LV6,RANK:90 )
|
-
-
6 楼
样样精通 样样稀松而已 。 哈哈!我没那么神,至少不会VB,BCD,还有C++也没有!我也有我最强项就是DELPHI!
|
能力值:
(RANK:650 )
|
-
-
7 楼
楼主以前明白人,现在才叫愚昧无知
E语言自己玩玩小打小闹可以,终究在几年内是上不了台面的
你看外面有哪家正规公司(我的定义是除去外挂木马工作室)招程序员是招E语言的?
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
我十分的同意您的看法
易语言短期内很难有飞越的进步!
出于对国产的支持 所以我很期待易语言有能上得支台面的那一天!!!!
|
能力值:
( LV9,RANK:490 )
|
-
-
9 楼
|
能力值:
( LV9,RANK:180 )
|
-
-
10 楼
EBX 被算法破坏掉了, 引发例外.
callback func 请养成保存ebx'esi'edi的习惯
|
能力值:
( 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.结果即为注册码
|
能力值:
( LV6,RANK:90 )
|
-
-
12 楼
不好意思,刚刚学汇编,根本不懂什么是EDX,ESI,EDI ,OD翻译瞎写,现在认真在学习着!还有楼上分析的不错要好好加油啊!
|
能力值:
( 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
|
能力值:
(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;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
这个注册机的算法我已经写出来,还算是比较简单的,呵呵
有空再写写如何算的
|
能力值:
( LV8,RANK:130 )
|
-
-
16 楼
是工具生成的
|