首先祝各位学习、工作愉快。
MagicWin v1.3是一个内码转换工具。它可是一个老工具了,我现在也不用它了,在它从我的机器消失之前,我把它的注册算法分析出来。我的目的只是为了学习。
你可设中断BPX HMEMCPY
36B7:0502 6A01 PUSH BYTE +01
36B7:0504 16 PUSH SS
36B7:0505 8D86C8FE LEA AX,[BP+FEC8]
36B7:0509 50 PUSH AX
36B7:050A 16 PUSH SS
36B7:050B 8D46C8 LEA AX,[BP-38]
36B7:050E 50 PUSH AX
36B7:050F 16 PUSH SS
36B7:0510 8D46E4 LEA AX,[BP-1C]
36B7:0513 50 PUSH AX
36B7:0514 9AAB030737 CALL 03AB按F8进入
36B7:0519 83C40E ADD SP,BYTE +0E
36B7:051C 3D0100 CMP AX,01 01是成功标志
36B7:051F 7558 JNZ 0579
*******************
:0038.03BD 9AFFFF0000 call KERNEL.LSTRLEN计算机器码长度
:0038.03C2 50 push ax机器码长度入栈
:0038.03C3 66FF760A push word ptr [bp+0A]
:0038.03C7 9AFFFF0000 call KERNEL.LSTRLEN计算假码长度
:0038.03CC 5A pop dx机器码长度出栈
:0038.03CD 3BD0 cmp dx, ax二者进行比较
:0038.03CF 7E25 jle 03F6机器码长度低于假码长度就跳
*******************
:0038.03F6 C45E0A les bx, [bp+0A]假码地址
:0038.03F9 26803F00 cmp byte ptr es:[bx], 00比较是否为空
:0038.03FD 7503 jne 0402不为空就跳
:0038.03FF E9C801 jmp 05CA
********************
:0038.0412 8D867AFF lea ax, [bp+FF7A]机器码地址
:0038.0416 50 push ax
:0038.0417 9AFFFF0000 call KERNEL.LSTRLEN计算机器码长度
:0038.041C 8BF8 mov di, ax机器码长度
:0038.041E BA0300 mov dx, 0003首先取机器码的第四位
**********************
注:机器码的首地址为[bp+FF7A]
:0038.0421 8D867DFF lea ax, [bp+FF7D]机器码的第四位地址
:0038.0425 8BF0 mov si, ax
:0038.0427 EB4C jmp 0475
************************
:0038.0475 36803C00 cmp byte ptr ss:[si], 00比较是否为空
:0038.0479 75AE jne 0429不为空就跳
**********************
此部分代码是重新排列机器码的位置。
:0038.0429 8BC2 mov ax, dx第DX位
:0038.042B 050400 add ax, 0004与4相加
:0038.042E 3BC7 cmp ax, di是否大于机器码的长度
:0038.0430 7D1E jge 0450大于等于就跳
:0038.0432 368A0C mov cl , ss:[si]取第DX位机器码
:0038.0435 8D867EFF lea ax, [bp+FF7E]第DX+1位机器码地址
:0038.0439 8BDA mov bx, dx第DX位
:0038.043B 03D8 add bx, ax
:0038.043D 368A07 mov al , ss:[bx]第DX+1+DX位机器码
:0038.0440 368804 mov ss:[si], al
:0038.0443 8D867EFF lea ax, [bp+FF7E]第DX+1位机器码地址
:0038.0447 8BDA mov bx, dx
:0038.0449 03D8 add bx, ax
:0038.044B 36880F mov ss:[bx], cl
:0038.044E EB23 jmp 0473
:0038.0450 8BC2 mov ax, dx
:0038.0452 40 inc ax
:0038.0453 3BC7 cmp ax, di
:0038.0455 7D1C jge 0473
:0038.0457 368A0C mov cl , ss:[si]上次循环的串地址
:0038.045A 8D867BFF lea ax, [bp+FF7B]机器码地址
:0038.045E 8BDA mov bx, dx
:0038.0460 03D8 add bx, ax
:0038.0462 368A07 mov al , ss:[bx]
:0038.0465 368804 mov ss:[si], al
:0038.0468 8D867BFF lea ax, [bp+FF7B]
:0038.046C 8BDA mov bx, dx
:0038.046E 03D8 add bx, ax
:0038.0470 36880F mov ss:[bx], cl
:0038.0473 46 inc si加1
:0038.0474 42 inc dx加1
:0038.0475 36803C00 cmp byte ptr ss:[si], 00
:0038.0479 75AE jne 0429没循环完毕就跳
:0038.047B BA0300 mov dx, 0003初始化机器码序号为3
:0038.047E 3BD7 cmp dx, di DI是机器码长度
:0038.0480 7D19 jge 049B大于等于就跳
:0038.0482 8D867AFF lea ax, [bp+FF7A]机器码首地址
:0038.0486 8BDA mov bx, dx
:0038.0488 03D8 add bx, ax BX也就是机器码的第BX位
:0038.048A 8BF3 mov si, bx
:0038.048C 368A07 mov al , ss:[bx]
:0038.048F 02C2 add al , dl DL就是所取码的序号,AL是第在DX位机器码的ASCII码,二者相加。
:0038.0491 0410 add al, 10上面的结果再加10
:0038.0493 368804 mov ss:[si], al 结果存入原位
:0038.0496 42 inc dx序号加1
:0038.0497 3BD7 cmp dx, di DI是机器码长度。
:0038.0499 7CE7 jl 0482低于就跳,依次循环。
:0038.049B 66FF760E push word ptr [bp+0E]
:0038.049F 9AFFFF0000 call KERNEL.LSTRLEN
:0038.04A4 8BC8 mov cx, ax
:0038.04A6 660FBFC1 movsx eax, ecx
:0038.04AA 668946FA mov [bp-06], eax
:0038.04AE 33D2 xor dx, dx
:0038.04B0 8B760E mov si, [bp+0E]
:0038.04B3 3BD1 cmp dx, cx
:0038.04B5 7D15 jge 04CC
:0038.04B7 8E4610 mov es, [bp+10]
:0038.04BA 268A04 mov al , es:[si]
:0038.04BD 98 cbw
:0038.04BE 660FBFC0 movsx eax, eax
:0038.04C2 660146FA add [bp-06], eax
:0038.04C6 46 inc si
:0038.04C7 42 inc dx
:0038.04C8 3BD1 cmp dx, cx
:0038.04CA 7CEB jl 04B7
机器码的格式为:如MGW3762-10(每台机器都不一样,但都是10位)
按上面的步骤处理如下:
1、首先是3与-互换位置,也就是MGW-762310
2、取7与1互换位置,也就是MGW-162370
3、再取6与0互换位置,也就是MGW-102376
4、取3与2互换位置,也就是MGW-103276
5、取2与7互换位置,也就是MGW-103726
6、取2与6互换位置,也就是MGW-103762
7、然后"-"的ASCII码+3+10=40(也就是@),存入原位。依次类推。最后结果:
MGW@EEINNK这是前十位注册码。
**************************
:0038.0473 46 inc si加1
:0038.0474 42 inc dx加1
:0038.0475 36803C00 cmp byte ptr ss:[si], 00为空
:0038.0479 75AE jne 0429不为空继续循环
:0038.047B BA0300 mov dx, 0003
:0038.047E 3BD7 cmp dx, di
:0038.0480 7D19 jge 049B
**************************************
:0038.049B 66FF760E push word ptr [bp+0E]
:0038.049F 9AFFFF0000 call KERNEL.LSTRLEN此处是取注册名长度
:0038.04A4 8BC8 mov cx, ax长度存入CX
:0038.04A6 660FBFC1 movsx eax, ecx
:0038.04AA 668946FA mov [bp-06], eax
:0038.04AE 33D2 xor dx, dx清零
:0038.04B0 8B760E mov si, [bp+0E]注册名首址
:0038.04B3 3BD1 cmp dx, cx CX是注册名的长度
:0038.04B5 7D15 jge 04CC
:0038.04B7 8E4610 mov es, [bp+10]
:0038.04BA 268A04 mov al , es:[si]首先取注册名的第SI位
:0038.04BD 98 cbw
:0038.04BE 660FBFC0 movsx eax, eax
:0038.04C2 660146FA add [bp-06], eax第SI位注册名的ASCII码与其[bp-06]相加。
:0038.04C6 46 inc si注册名串地址加1
:0038.04C7 42 inc dx序号加1
:0038.04C8 3BD1 cmp dx, cx是否循环完毕
:0038.04CA 7CEB jl 04B7否就继续计算。
:0038.04CC 66FF76FA push word ptr [bp-06]计算之和入栈
:0038.04D0 1E push ds
:0038.04D1 684D1E push 1E4D
:0038.04D4 8D867AFF lea ax, [bp+FF7A]机器码首址,
:0038.04D8 8BD7 mov dx, di DI是机器码的长度。
:0038.04DA 03D0 add dx, ax机器码码末尾地址。
:0038.04DC 16 push ss
:0038.04DD 52 push dx
:0038.04DE 9AFFFF0000 call USER._WSPRINTF此处调用是用上面的结果计算最后几位的注册码并把其进行排序。可以按F8进入。
:0038.04E3 83C40C add sp, 000C
:0038.04E6 16 push ss
**********************************************
计算最后几位的注册码并把其进行排序
1777:2D67 837E0400 CMP WORD [BP+04],BYTE +00
1777:2D6B 7402 JZ 2D6F
1777:2D6D B007 MOV AL,07
1777:2D6F 884604 MOV [BP+04],AL
1777:2D72 8B5E0A MOV BX,[BP+0A]姓名之和
1777:2D75 8B560C MOV DX,[BP+0C]0
1777:2D78 8B4E06 MOV CX,[BP+06]机器码长度
1777:2D7B C47E0E LES DI,[BP+0E]
1777:2D7E 8B7608 MOV SI,[BP+08]
1777:2D81 92 XCHG AX,DX
1777:2D82 33D2 XOR DX,DX
1777:2D84 85C0 TEST AX,AX
1777:2D86 7402 JZ 2D8A
1777:2D88 F7F1 DIV CX
1777:2D8A 93 XCHG AX,BX交换
1777:2D8B F7F1 DIV CX除以机器码长度
1777:2D8D 92 XCHG AX,DX商和余数相交换
1777:2D8E 87D3 XCHG DX,BX
1777:2D90 0430 ADD AL,30余数加30
1777:2D92 3C39 CMP AL,39是否大于39
1777:2D94 7603 JNA 2D99
1777:2D96 024604 ADD AL,[BP+04]
1777:2D99 4E DEC SI
1777:2D9A 7407 JZ 2DA3
1777:2D9C AA STOSB 存入前面注册码的末尾。
1777:2D9D 8BC2 MOV AX,DX
1777:2D9F 0BC3 OR AX,BX
1777:2DA1 75DE JNZ 2D81没算完就继续
1777:2DA3 8BC7 MOV AX,DI串指针
1777:2DA5 2B460E SUB AX,[BP+0E]计算新加入的机器码的长度1777:2DA8 5F POP DI
1777:2DA9 5E POP SI
1777:2DAA C9 LEAVE
如果输入的注册名为:123456
那么它们的ASCII码的总和+1= 13B
1、13B/A 商是1余数是5,
2、1F/A 商是3余数是1
3、3/A 商是0余数是3
也就是最后几位的注册码是513
与上面合起来就是MGW@EEINNK513
最后是把刚才计算的注册码513重新排序,其排序很简单。
代码如下:
2DC1:MOV AH,[ES:BX]最后一位
2DC4:MOV AL,[ES:SI]首码
2DC7:MOV [ES:SI],AH
2DCA:MOV [ES:BX],AL AH,AL位置互换。
2DCD INC SI
2DCE:DEC BX
2DCF:LOOP 2DC1没结束就循环。
也就是513的重新排列后就是315。
那么真正的注册码就是MGW@EEINNK315
*******************************
name:123456
code:MGW@EEINNK315
另注册码位数少于13位要用"-"补足如MGW@EEINNK-31
相关视频
相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么
热门文章 去除winrar注册框方法
最新文章
去除winrar注册框方法通过Access破解MSSQL获
JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)通过Access破解MSSQL获得数据安装office2003 出现错误提示1402、1308、1
人气排行 华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)qq相册密码破解方法去除winrar注册框方法(适应任何版本)怎么用手机破解收费游戏华为无线猫HG522破解如何给软件脱壳基础教程
查看所有0条评论>>