|
某船舶管理系统软件的注册机,算法不难,练练手,我的第一个注册机。
算法部分汇编原码
/mov edx, dword ptr [esp+C]
|xor eax, eax
|mov al, byte ptr [esp+8]
|mov ebx, eax
|add ebx, ebx
|lea ebx, dword ptr [ebx+ebx*2]
|mov eax, dword ptr [esi+ebx*8]
|mov ecx, dword ptr [esp]
|mov ecx, dword ptr [ecx+eax*4]
|mov eax, dword ptr [esi+ebx*8+4]
|mov edi, dword ptr [esp]
|mov eax, dword ptr [edi+eax*4]
|mov ebx, dword ptr [esi+ebx*8+8]
|mov edi, dword ptr [esp]
|mov ebx, dword ptr [edi+ebx*4]
|add edx, ebx
|add ebx, edx
|mov edi, edx
|shr edi, 7
|xor edx, edi
|add ecx, edx
|add edx, ecx
|mov edi, ecx
|shl edi, 0D
|xor ecx, edi
|add eax, ecx
|add ecx, eax
|mov edi, eax
|shr edi, 11
|xor eax, edi
|add ebx, eax
|add eax, ebx
|mov edi, ebx
|shl edi, 9
|xor ebx, edi
|add edx, ebx
|add ebx, edx
|mov edi, edx
|shr edi, 3
|xor edx, edi
|add ecx, edx
|mov edx, ecx
|shl edx, 7
|xor ecx, edx
|add eax, ecx
|mov edx, ebx
|shr edx, 0F
|xor eax, edx
|add ebx, eax
|mov eax, ebx
|shl eax, 0B
|xor ebx, eax
|mov eax, dword ptr [esp+10]
|xor eax, ebx
|mov edx, dword ptr [esp+C]
|mov dword ptr [esp+10], edx
|mov dword ptr [esp+C], eax
|add esi, 0C
|dec dword ptr [esp+14]
\jnz 004CE06B
-------------------------------------------------------------------------------------------------------------------------------
部分注册机代码:
var ESI = [0,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0]
var ESP = [0x0,0x0,0x0,0x0];//保存处理过的机器码
var STATIC_CODE = [0x8962f635,0x106be105,0xa726a327,0x1eeba49e]; //一组静态的值,用于处理输入的机器码
function MyObject(str){//用于定义对象,达到传地址的效果
this.value = str;
}
function getCode(){
this.JQM = new MyObject("");
this.EDX = new MyObject(0x3c69);
this.AL = new MyObject(null);
this.EBX = new MyObject(null);
this.EAX = new MyObject(null);
this.ECX = new MyObject(null);
this.CURSE = new MyObject(0);
this.ESP_10 = new MyObject(0x76da);
this.ESP_C = new MyObject(0x3c69);
this.final_first = 0;
this.final_sec = 0;
this.printObj = printObj;
this.excute = excute;
}
function Coding(E1,E2,SH_NUM,TYPE){
var EDI;
E1.value = E1.value + E2.value;
E2.value = E2.value + E1.value;
EDI = E1.value;
if(TYPE=="R")
EDI = EDI >>> SH_NUM;
else
EDI = EDI << SH_NUM;
E1.value = E1.value ^ EDI;
}
function Coding_test(E1,E2,SH_NUM,TYPE){
var EDI;
E1.value = E1.value + E2.value;
E2.value = E2.value + E1.value;
EDI = E1.value;
if(TYPE=="R")
EDI = EDI >>> SH_NUM;
else
EDI = EDI << SH_NUM;
E1.value = E1.value ^ EDI;
}
function Coding_1(E1,E2,SH_NUM,TYPE){
E1.value = E1.value + E2.value;
E2.value = E1.value;
if(TYPE=="L"){
E2.value = E2.value << SH_NUM;
}
else
E2.value = E2.value >>> SH_NUM;
E1.value = E1.value ^ E2.value;
}
function Coding_2(E1,E2,E3,E4,SH_NUM){
E1.value = E1.value + E2.value;
E3.value = E4.value;
E3.value = E3.value >>> SH_NUM;
E1.value = E1.value ^ E3.value;
}
function excute(){
for(i=0;i<4;i++){
this.AL.value = 1;
this.EBX.value = this.AL.value;
this.EBX.value = this.EBX.value + this.EBX.value;//EBX = 2
this.EBX.value = this.EBX.value + this.EBX.value*2;//EBX = 6
this.EAX.value = ESI[this.CURSE.value+this.EBX.value*8];
this.ECX.value = ESP[this.EAX.value];
this.EAX.value = ESI[this.CURSE.value+this.EBX.value*8+4];
this.EAX.value = ESP[this.EAX.value];
this.EBX.value = ESI[this.CURSE.value+this.EBX.value*8+8];
this.EBX.value = ESP[this.EBX.value];
Coding(this.EDX,this.EBX,0x7,"R");//0x7
Coding_test(this.ECX,this.EDX,0xd,"L");//0xd
Coding(this.EAX,this.ECX,0x11,"R");//0x11
Coding(this.EBX,this.EAX,0x9,"L");//0x9
Coding(this.EDX,this.EBX,0x3,"R");//0x3
Coding_1(this.ECX,this.EDX,0x7,"L");//0x7
Coding_2(this.EAX,this.ECX,this.EDX,this.EBX,0xF);
Coding_1(this.EBX,this.EAX,0xB,"L");
this.EAX.value = this.ESP_10.value;
this.EAX.value = this.EAX.value ^ this.EBX.value;
this.EDX.value = this.ESP_C.value;
this.final_first = this.EAX.value;
this.final_sec = this.EDX.value;
this.ESP_10.value = this.EDX.value;
this.ESP_C.value = this.EAX.value;
this.EDX.value = this.ESP_C.value;
this.CURSE.value = this.CURSE.value + 0xc;
}
//负整数转换成16进制
if(this.final_first<0){
this.final_first = 0x100000000+this.final_first;
}
if(this.final_sec<0){
this.final_sec = 0x100000000+this.final_sec;
}
printObj(turnarround(this.final_sec.toString(16))+turnarround(this.final_first.toString(16)),"TEMP_TEXT");
}
function printObj(contect,target){
var targetObj = document.getElementById(target);
if(targetObj.value!=""){
targetObj.value = targetObj.value + "," + contect;
}
else{
targetObj.value = targetObj.value + contect;
}
}
//转换16进制格式
function turnarround(str){
var strUP = str.toUpperCase();
var str_return = "";
var two_char = "";
for(i=strUP.length-1;i>=0;i--){
two_char = strUP.charAt(i) + two_char;
if(two_char.length==2){
str_return = str_return + two_char;
two_char = "";
}
if((i-1)<0){
if(two_char.length==1){
str_return = str_return + "0"+two_char;
}
}
}
return str_return;
}
写的过程中遇到两个问题
1、javascript的传地址问题,传地址好像实现不了,所以改用传递对象
2、负整数转16进制问题,解决办法就是负整数 + 4294967296 再用toString(16)转成16进制
如有更好的解决办法欢迎提出~
我本机的机器码是60303725
算出来注册码是:CB7B3E0E1ED0A5DD
可成功注册。
[ 本帖最后由 xulrmb 于 2008-9-2 16:05 编辑 ] |
|