老文章档案 · 2003 年

中级实例教程—之《楚汉棋缘V1.36》

赢政天下 [WINZHENG.COM] · 网络学院 · 2003-06-09 · 作者:afanty 人气: · 出处:赢政天下收集整理)

前言:

跟踪《楚汉棋缘》的算法只不过三个晚上约6、7个小时的时间,

而写出注册机却用了近一个月,大量的时间都花在大数运算库的调

试上,在这篇教程之后,俺将写一篇针对RSA 算法的详细教程。

俺是一个象棋爱好者,曾用ID“臭棋篓子”获得联众“大师”

级称号,但是俺经常会输给一个象棋程序《将族》。《将族》是90

年代初中国象棋程序史上划时代的产品,近十年来一直是俺的最爱,

可惜随着操作系统不断升级,修改《将族》以让它能够继续工作也

越来越困难。于是我一直在寻找一个棋力相当的新产品希望能够代

替它,直到碰到《楚汉棋缘 V1.3x》,看来大陆在象棋算法的研究

上落后台湾几乎有10年之久!

研究对象:

《楚汉棋缘 V1.36》,这里做个声明:俺的教程使用softice

为唯一工具,无脱壳与静态分析必要。

程序特点:

重启验证防爆破,RSA防注册机,Borland C++编译,“Borland

造”的东西(包括BC++、C++ Builder、DELPHI 等)都不能通过下

getwindowtext 之类的断点获得屏幕输入,断点必须下在windows

消息循环上,推荐使用 bpx callwindowproca。程序对用户名及假

码均进行了多次变换,最终的验证是用户名变码与假码变码之间的

验证。

前期工作:

进入注册界面,填入用户名及假码,切入softice,下断点bpx

callwindowproca,F5 回到程序,随便动动鼠标即被中断进入Sice,

下s 0 l ffffff "假码", 然后bpm 假码地址,F5回到程序,按下

“注册”按钮,让假码这把“钥匙”带我们去找验证函数!

算法分析:

好了,程序对假码开始进行处理的地方就是我们要进行分析的

验证函数,找到这一函数的入口并记下地址,这样以后可以直接在

这一地址上下断点。

如下所示,这一函数有900 多行代码,还包含了数不清的call,

不过请不要惊慌,如果你仔细看俺的注释,会发现几乎所有的call

俺都是毫不犹豫地用 F10来对付的,对算法的把握完全是通过归纳

总结逐步建立起来的。

:u 430be0 L e81

001B:00430BE0 PUSH EBP

001B:00430BE1 MOV EBP,ESP

001B:00430BE3 ADD ESP,FFFFFE94

001B:00430BE9 PUSH EBX

001B:00430BEA PUSH ESI

001B:00430BEB PUSH EDI

001B:00430BEC MOV [EBP-0094],EDX

001B:00430BF2 MOV DWORD PTR [EBP-0088],004EBB08

001B:00430BFC MOV [EBP-0084],ESP

001B:00430C02 MOV EDI,EAX

001B:00430C04 MOV DWORD PTR [EBP-008C],004A8C0B

001B:00430C0E MOV WORD PTR [EBP-80],0000

001B:00430C14 XOR EAX,EAX

001B:00430C16 MOV [EBP-74],EAX

001B:00430C19 MOV EDX,FS:[00000000]

001B:00430C20 MOV [EBP-0090],EDX

001B:00430C26 LEA ECX,[EBP-0090]

001B:00430C2C MOV FS:[00000000],ECX

//以上估计是函数调用环境的保存及异常处理入口的设置

001B:00430C33 MOV WORD PTR [EBP-80],0014

//[ebp-xx]通常是属于当前函数体的局部变量

//给变量[ebp-80]赋初值为20

001B:00430C39 MOV EDX,004EB5CE

//[4eb5ce]="L5WXT6VMB4GE3RUYJ9HASF8KQNPD7CI",用来干嘛呢?

//暂且称之为密码表吧

001B:00430C3E LEA EAX,[EBP-04]

//[ebp-04]=[12f80c]=16

001B:00430C41 CALL 004B7350

//eax=12f80c,没有发生变化,而**eax=密码表

//edx发生了变化,=12f780

001B:00430C46 INC DWORD PTR [EBP-74]

//变量[ebp-74]加1

001B:00430C49 XOR ECX,ECX

001B:00430C4B MOV WORD PTR [EBP-80],0008

001B:00430C51 MOV WORD PTR [EBP-80],0020

001B:00430C57 MOV [EBP-08],ECX

001B:00430C5A XOR EAX,EAX

001B:00430C5C INC DWORD PTR [EBP-74]

001B:00430C5F XOR EDX,EDX

001B:00430C61 MOV WORD PTR [EBP-80],0008

001B:00430C67 MOV WORD PTR [EBP-80],002C

001B:00430C6D MOV [EBP-0C],EAX

001B:00430C70 XOR ECX,ECX

001B:00430C72 INC DWORD PTR [EBP-74]

001B:00430C75 MOV WORD PTR [EBP-80],0008

001B:00430C7B MOV WORD PTR [EBP-80],0038

001B:00430C81 MOV [EBP-10],EDX

001B:00430C84 LEA EDX,[EBP-00C4]

001B:00430C8A INC DWORD PTR [EBP-74]

001B:00430C8D MOV WORD PTR [EBP-80],0008

001B:00430C93 MOV WORD PTR [EBP-80],0044

001B:00430C99 MOV [EBP-14],ECX

001B:00430C9C INC DWORD PTR [EBP-74]

001B:00430C9F XOR EAX,EAX

001B:00430CA1 MOV WORD PTR [EBP-80],0008

001B:00430CA7 MOV [EBP-0098],EAX

//将[ebp-08]到[ebp-14]四个32位地址清零

//将[ebp-98]也清零

//并将计数器[ebp-74]加5

001B:00430CAD PUSH 14

001B:00430CAF PUSH 00

001B:00430CB1 PUSH EDX

001B:00430CB2 CALL 004A8778

//[eax]=[12f74c]=0

//[ecx]=[12f75c]=0

//不知道在干什么

001B:00430CB7 MOV WORD PTR [EBP-80],0050

//变量[ebp-80]在被频繁地赋值,暂不明白有何用

001B:00430CBD XOR ECX,ECX

001B:00430CBF ADD ESP,0C

001B:00430CC2 MOV [EBP-24],ECX

//[ebp-24]=0

001B:00430CC5 LEA EDX,[EBP-24]

001B:00430CC8 INC DWORD PTR [EBP-74]

001B:00430CCB MOV EAX,[EDI+00000308]

001B:00430CD1 CALL 004776F4

//eax=6

//刚刚被赋值为零的[ebp-24]发生了变化

//*[ebp-24]="doggie",是俺输入的用户名!

//所以,eax=6应该是返回用户名的长度

001B:00430CD6 CMP DWORD PTR [EBP-24],00

001B:00430CDA JZ 00430CE1

001B:00430CDC MOV ECX,[EBP-24]

001B:00430CDF JMP 00430CE6

001B:00430CE1 MOV ECX,004EB5EE

001B:00430CE6 PUSH EDI

001B:00430CE7 MOV EDI,ECX

//edi=用户名地址

001B:00430CE9 XOR EAX,EAX

//eax=0

001B:00430CEB OR ECX,-01

//ecx=-1

001B:00430CEE REPNZ SCASB

//循环edi+1、计数器ecx-1

//直到[edi]=eax或ecx=0,而ecx一开始就<0

001B:00430CF0 NOT ECX

//ecx=用户名长度+1

001B:00430CF2 SUB EDI,ECX

//恢复edi=用户名地址

001B:00430CF4 LEA ESI,[EBP-00C4]

001B:00430CFA XCHG ESI,EDI

001B:00430CFC MOV EDX,ECX

001B:00430CFE MOV EAX,EDI

001B:00430D00 SHR ECX,02

//ecx=ecx/4

001B:00430D03 LEA EAX,[EBP-24]

001B:00430D06 REPZ MOVSD

//以双字为单位将esi中的用户名拷贝至edi,即[ebp-c4]

001B:00430D08 MOV ECX,EDX

001B:00430D0A MOV EDX,00000002

001B:00430D0F AND ECX,03

001B:00430D12 REPZ MOVSB

//将剩下的字节从esi拷贝至edi

001B:00430D14 POP EDI

001B:00430D15 DEC DWORD PTR [EBP-74]

001B:00430D18 CALL 004B74A8

//*eax,即用户名的源地址[ebp-24]被清零

//估计call 4b74a8相当于对象delete

//所以在call之前减1的变量[ebp-74]估计是对象实例计数器

001B:00430D1D MOV DWORD PTR [EDI+00000390],0001E240

//1e240十进制=123456,应该是拿来做变换用的常量

001B:00430D27 MOV DWORD PTR [EDI+00000394],00000000

001B:00430D31 XOR ESI,ESI

001B:00430D33 LEA EBX,[EBP-00C4]

//[ebp-c4]是前面被装入用户名的地址

001B:00430D39 XOR EAX,EAX

001B:00430D3B INC ESI

001B:00430D3C MOV AL,[EBX]

001B:00430D3E INC EBX

001B:00430D3F MOV EDX,EAX

001B:00430D41 IMUL EDX,EAX

001B:00430D44 ADD EDX,EAX

001B:00430D46 ADD [EBP-0098],EDX

001B:00430D4C CMP ESI,14

001B:00430D4F JL 00430D39

//从esi=1到20循环

//[ebp-98]+=(用户名第esi位)*(用户名第esi位+1)

//[ebp-98]就是用户名的变码

//可见用户名只有前20位有效

001B:00430D51 MOV EAX,[EBP-0098]

001B:00430D57 XOR EDX,EDX

001B:00430D59 ADD [EDI+00000390],EAX

//用户名变码再+123456

001B:00430D5F ADC [EDI+00000394],EDX

001B:00430D65 PUSH DWORD PTR [EDI+00000394]

001B:00430D6B PUSH DWORD PTR [EDI+00000390]

001B:00430D71 PUSH 004EB5EF

//[4eb5ef]="%ld",按“长整数”格式化?

001B:00430D76 LEA EAX,[EBP-10]

001B:00430D79 PUSH EAX

001B:00430D7A CALL 004B75F8

//**eax=*[ebp-10]=用户名变码十进制字符串形式

//可见call 4b75f8是某种字符串对象的格式化赋值函数

001B:00430D7F ADD ESP,10

001B:00430D82 LEA EDX,[EBP-00D8]

001B:00430D88 PUSH 14

001B:00430D8A PUSH 00

001B:00430D8C PUSH EDX

001B:00430D8D CALL 004A8778

//观察结果结合上次调用此函数的记录可知

//将edx,即[ebp-d8]后的20个字节清零

001B:00430D92 ADD ESP,0C

001B:00430D95 LEA ECX,[EBP-0108]

001B:00430D9B PUSH 2D

001B:00430D9D PUSH 00

001B:00430D9F PUSH ECX

001B:00430DA0 CALL 004A8778

//将ecx,即[ebp-108]后的45个字节清零

001B:00430DA5 ADD ESP,0C

001B:00430DA8 CMP DWORD PTR [EBP-10],00

001B:00430DAC JZ 00430DB3

001B:00430DAE MOV EAX,[EBP-10]

001B:00430DB1 JMP 00430DB8

001B:00430DB3 MOV EAX,004EB5F3

001B:00430DB8 PUSH EDI

001B:00430DB9 MOV EDI,EAX

001B:00430DBB XOR EAX,EAX

001B:00430DBD OR ECX,-01

001B:00430DC0 REPNZ SCASB

001B:00430DC2 NOT ECX

001B:00430DC4 SUB EDI,ECX

001B:00430DC6 LEA ESI,[EBP-00D8]

001B:00430DCC XCHG ESI,EDI

001B:00430DCE MOV EDX,ECX

001B:00430DD0 MOV EAX,EDI

001B:00430DD2 SHR ECX,02

001B:00430DD5 REPZ MOVSD

001B:00430DD7 MOV ECX,EDX

001B:00430DD9 LEA EDX,[EBP-28]

001B:00430DDC AND ECX,03

001B:00430DDF REPZ MOVSB

//将用户名变码转移到[ebp-d8]

001B:00430DE1 POP EDI

001B:00430DE2 XOR EAX,EAX

001B:00430DE4 MOV WORD PTR [EBP-80],005C

001B:00430DEA MOV [EBP-28],EAX

001B:00430DED INC DWORD PTR [EBP-74]

001B:00430DF0 MOV EAX,[EDI+0000030C]

001B:00430DF6 CALL 004776F4

//上次调用4776f4是取用户名

//这次当然是假码了,存入[esp-28]

001B:00430DFB LEA EDX,[EBP-28]

001B:00430DFE LEA EAX,[EBP-08]

001B:00430E01 CALL 004B74D8

//假码由[ebp-28]转移到了[ebp-08]

001B:00430E06 DEC DWORD PTR [EBP-74]

001B:00430E09 LEA EAX,[EBP-28]

001B:00430E0C MOV EDX,00000002

001B:00430E11 CALL 004B74A8

//现在基本可以确定call 4b74a8就是delete了

001B:00430E16 PUSH EDI

001B:00430E17 LEA EDI,[EBP-0158]

001B:00430E1D MOV ESI,004EB504

001B:00430E22 MOV ECX,00000014

001B:00430E27 REPZ MOVSD

//将[ebp-158]后的20个双字清零

001B:00430E29 POP EDI

001B:00430E2A XOR EDX,EDX

001B:00430E2C MOV WORD PTR [EBP-80],0008

001B:00430E32 MOV EAX,[EDI+00000308]

001B:00430E38 CALL 0047760C

001B:00430E3D MOV EAX,[EDI+0000030C]

001B:00430E43 XOR EDX,EDX

001B:00430E45 CALL 0047760C

001B:00430E4A MOV EAX,[EDI+00000310]

001B:00430E50 XOR EDX,EDX

001B:00430E52 CALL 0047760C

001B:00430E57 MOV EAX,[EDI+00000380]

001B:00430E5D MOV DL,01

001B:00430E5F CALL 0047760C

001B:00430E64 MOV WORD PTR [EBP-80],0068

001B:00430E6A MOV EDX,004EB5F4

001B:00430E6F LEA EAX,[EBP-2C]

001B:00430E72 CALL 004B7350

001B:00430E77 INC DWORD PTR [EBP-74]

001B:00430E7A MOV EAX,[EAX]

001B:00430E7C XOR EDX,EDX

001B:00430E7E MOV [EBP-30],EDX

001B:00430E81 LEA EDX,[EBP-30]

001B:00430E84 INC DWORD PTR [EBP-74]

001B:00430E87 CALL 00423550

001B:00430E8C LEA EAX,[EBP-30]

001B:00430E8F MOV EAX,[EAX]

001B:00430E91 CALL 0047236C

//“关闭程序重启后才能完成注册”

//之前一连串的call不知道是干什么的

//估计与windows界面操作有关

001B:00430E96 DEC DWORD PTR [EBP-74]

001B:00430E99 LEA EAX,[EBP-30]

001B:00430E9C MOV EDX,00000002

001B:00430EA1 CALL 004B74A8

001B:00430EA6 DEC DWORD PTR [EBP-74]

001B:00430EA9 LEA EAX,[EBP-2C]

001B:00430EAC MOV EDX,00000002

001B:00430EB1 CALL 004B74A8

//清除[ebp-30]、[ebp-2c]

001B:00430EB6 MOV WORD PTR [EBP-80],0074

001B:00430EBC MOV EDX,004EB619

001B:00430EC1 LEA EAX,[EBP-18]

001B:00430EC4 CALL 004B7350

//第一次调用4b7350,不知道干什么

001B:00430EC9 INC DWORD PTR [EBP-74]

001B:00430ECC MOV EDX,004EB61A

001B:00430ED1 MOV WORD PTR [EBP-80],0008

001B:00430ED7 MOV WORD PTR [EBP-80],0080

001B:00430EDD LEA EAX,[EBP-34]

001B:00430EE0 CALL 004B7350

//第二次调用4b7350,发现*[ebp-34]变成了"-"

//而函数调用之前赋过值的[edx]="-"

//猜测也是一种字符串赋值函数

001B:00430EE5 INC DWORD PTR [EBP-74]

001B:00430EE8 LEA EDX,[EBP-34]

001B:00430EEB LEA EAX,[EBP-08]

001B:00430EEE CALL 004B7674

//函数调用之前设置了两个参数:[ebp-08]、[ebp-34]

//[ebp-08]是假码,[ebp-34]是"-"

//函数返回值在后面被作为跳转并退出的判断依据

//联想到很多软件的注册码都是用"-"进行分段的

//估计此函数是判断假码中是否含有"-"

//将假码修改成用"-"分段的格式,重新来过

//发现函数返回值eax=第一个"-"在假码中的位置

001B:00430EF3 MOV [EBP-009C],EAX

//将eax的值写入变量[ebp-9c]

001B:00430EF9 DEC DWORD PTR [EBP-74]

001B:00430EFC LEA EAX,[EBP-34]

001B:00430EFF MOV EDX,00000002

001B:00430F04 CALL 004B74A8

//清除[ebp-34]

001B:00430F09 MOV WORD PTR [EBP-80],0008

001B:00430F0F CMP DWORD PTR [EBP-009C],00

001B:00430F16 JNZ 00430F8A

//若假码中含"-"则跳转

001B:00430F18 DEC DWORD PTR [EBP-74]

001B:00430F1B LEA EAX,[EBP-18]

001B:00430F1E MOV EDX,00000002

001B:00430F23 CALL 004B74A8

001B:00430F28 DEC DWORD PTR [EBP-74]

001B:00430F2B LEA EAX,[EBP-14]

001B:00430F2E MOV EDX,00000002

001B:00430F33 CALL 004B74A8

001B:00430F38 DEC DWORD PTR [EBP-74]

001B:00430F3B LEA EAX,[EBP-10]

001B:00430F3E MOV EDX,00000002

001B:00430F43 CALL 004B74A8

001B:00430F48 DEC DWORD PTR [EBP-74]

001B:00430F4B LEA EAX,[EBP-0C]

001B:00430F4E MOV EDX,00000002

001B:00430F53 CALL 004B74A8

001B:00430F58 DEC DWORD PTR [EBP-74]

001B:00430F5B LEA EAX,[EBP-08]

001B:00430F5E MOV EDX,00000002

001B:00430F63 CALL 004B74A8

001B:00430F68 DEC DWORD PTR [EBP-74]

001B:00430F6B LEA EAX,[EBP-04]

001B:00430F6E MOV EDX,00000002

001B:00430F73 CALL 004B74A8

001B:00430F78 MOV ECX,[EBP-0090]

001B:00430F7E MOV FS:[00000000],ECX

001B:00430F85 JMP 0043195A

//一系列的清除对象动作,之后退出

001B:00430F8A MOV WORD PTR [EBP-80],008C

001B:00430F90 XOR EAX,EAX

001B:00430F92 LEA EDX,[EBP-38]

001B:00430F95 MOV [EBP-38],EAX

001B:00430F98 PUSH EDX

//[ebp-38]清零后入栈

001B:00430F99 INC DWORD PTR [EBP-74]

001B:00430F9C MOV EDX,00000001

001B:00430FA1 MOV ECX,[EBP-009C]

//ecx="-"在假码中的位置

001B:00430FA7 LEA EAX,[EBP-08]

//eax=假码地址

001B:00430FAA DEC ECX

//ecx=假码第一段的长度

001B:00430FAB CALL 004B7698

//返回值[eax]=前面入栈的[ebp-38]

//*[ebp-38]=假码第一段

001B:00430FB0 LEA EDX,[EBP-38]

001B:00430FB3 LEA EAX,[EBP-18]

001B:00430FB6 CALL 004B74D8

001B:00430FBB DEC DWORD PTR [EBP-74]

001B:00430FBE LEA EAX,[EBP-38]

001B:00430FC1 MOV EDX,00000002

001B:00430FC6 CALL 004B74A8

//将假码一段从[ebp-38]转移至[ebp-18]

//并清除[ebp-38]

001B:00430FCB LEA EAX,[EBP-08]

001B:00430FCE MOV ECX,[EBP-009C]

001B:00430FD4 MOV EDX,00000001

001B:00430FD9 CALL 004B762C

//将[ebp-08]中的假码删去其第一段

001B:00430FDE MOV ESI,00000001

//esi通常被用做循环变量

001B:00430FE3 LEA EBX,[EBP-0158]

001B:00430FE9 CMP ESI,[EBP-009C]

001B:00430FEF JGE 0043104D

001B:00430FF1 MOV WORD PTR [EBP-80],0098

001B:00430FF7 XOR EAX,EAX

001B:00430FF9 LEA EDX,[EBP-3C]

001B:00430FFC MOV [EBP-3C],EAX

001B:00430FFF PUSH EDX

001B:00431000 INC DWORD PTR [EBP-74]

001B:00431003 MOV EDX,ESI

001B:00431005 LEA EAX,[EBP-18]

001B:00431008 MOV ECX,00000001

001B:0043100D CALL 004B7698

//返回值[eax]为前面入栈的[ebp-3c]

//*[ebp-3c]=假码一段第一个字符

//此函数在一个以esi为循环变量的循环体内

//几次执行后可总结出此函数的作用是:

//将调用前[eax]中的字符串从第edx字节开始

//拷贝ecx个字节到之前被push的地址中

//并返回其指针到eax

001B:00431012 LEA EDX,[EBP-3C]

001B:00431015 LEA EAX,[EBP-10]

001B:00431018 CALL 004B74D8

001B:0043101D DEC DWORD PTR [EBP-74]

001B:00431020 LEA EAX,[EBP-3C]

001B:00431023 MOV EDX,00000002

001B:00431028 CALL 004B74A8

//将[ebp-3c]中的假码一段当前字符转移到[ebp-10]

//并清除[ebp-3c]

001B:0043102D LEA EDX,[EBP-10]

001B:00431030 LEA EAX,[EBP-04]

//[ebp-04]是前面被俺命名为“密码表”的一个长字符串

001B:00431033 CALL 004B7674

//前面曾用call 4b7674函数检查"-"在假码中的位置

//稍加推测,这里是返回假码中某字符在密码表中的位置

001B:00431038 MOV WORD PTR [EBP-80],0008

001B:0043103E DEC EAX

001B:0043103F MOV [EBX],EAX

//将eax-1存入ebx

//ebx在循环开始前被赋值为[ebp-158]

//ebx在循环中每次+4

//所以假码一段的第i个字符的查表值存在[ebp-158+i*4]

//i从0开始,到假码一段长度-1

001B:00431041 INC ESI

001B:00431042 ADD EBX,04

001B:00431045 CMP ESI,[EBP-009C]

001B:0043104B JL 00430FF1

//循环“查表”动作

001B:0043104D XOR EDI,EDI

001B:0043104F MOV ESI,[EBP-009C]

//[ebp-9c]=假码一段长度+1

001B:00431055 ADD ESI,-02

//esi=假码一段长度-1

001B:00431058 LEA EBX,[ESI*4+EBP-0158]

001B:0043105F TEST ESI,ESI

001B:00431061 JL 004310C1

001B:00431063 MOV [EBP-015C],ESI

001B:00431069 FILD DWORD PTR [EBP-015C]

//将esi读入浮点寄存器转化成real8

001B:0043106F ADD ESP,-08

001B:00431072 FSTP REAL8 PTR [ESP]

001B:00431075 PUSH 403E0000

//403e0000是30的real8格式

001B:0043107A PUSH 00

001B:0043107C CALL 004AFE38

//浮点寄存器st(0)返回30的esi次方

//用wf指令可查看浮点寄存器的值

001B:00431081 MOV EAX,[EBX]

001B:00431083 XOR EDX,EDX

001B:00431085 MOV [EBP-0164],EAX

001B:0043108B MOV [EBP-0160],EDX

001B:00431091 FILD QWORD PTR [EBP-0164]

001B:00431097 ADD ESP,10

001B:0043109A XOR ECX,ECX

001B:0043109C MOV [EBP-016C],EDI

//将上次结果记入[ebp-16c]

001B:004310A2 MOV [EBP-0168],ECX

001B:004310A8 FMULP ST(1),ST

//假码查表值的第i位乘上30的(i-1)次方

001B:004310AA FILD QWORD PTR [EBP-016C]

001B:004310B0 FADDP ST(1),ST

//累加运算结果

001B:004310B2 CALL 004AF9F0

001B:004310B7 MOV EDI,EAX

//将结果记入edi

001B:004310B9 DEC ESI

001B:004310BA ADD EBX,-04

001B:004310BD TEST ESI,ESI

001B:004310BF JGE 00431063

//循环操作

//相当于将假码一段的查表值倒序后

//再由30进制转化为10进制

001B:004310C1 PUSH EDI

001B:004310C2 PUSH 004EB61C

001B:004310C7 LEA EDX,[EBP-10]

001B:004310CA PUSH EDX

001B:004310CB CALL 004B75F8

001B:004310D0 ADD ESP,0C

001B:004310D3 LEA EDX,[EBP-10]

001B:004310D6 LEA EAX,[EBP-0C]

001B:004310D9 CALL 004B74EC

//再转换成十进制表示的字符串存入[ebp-0c]

//不妨称之为假码一段变码

001B:004310DE MOV WORD PTR [EBP-80],00A4

001B:004310E4 MOV EDX,004EB620

001B:004310E9 LEA EAX,[EBP-1C]

001B:004310EC CALL 004B7350

001B:004310F1 INC DWORD PTR [EBP-74]

001B:004310F4 MOV EDX,004EB621

001B:004310F9 MOV WORD PTR [EBP-80],0008

001B:004310FF MOV WORD PTR [EBP-80],00B0

001B:00431105 LEA EAX,[EBP-40]

001B:00431108 CALL 004B7350

001B:0043110D INC DWORD PTR [EBP-74]

001B:00431110 LEA EDX,[EBP-40]

001B:00431113 LEA EAX,[EBP-08]

001B:00431116 CALL 004B7674

//检查"-"在假码二段中的位置

001B:0043111B MOV [EBP-009C],EAX

001B:00431121 DEC DWORD PTR [EBP-74]

001B:00431124 LEA EAX,[EBP-40]

001B:00431127 MOV EDX,00000002

001B:0043112C CALL 004B74A8

001B:00431131 MOV WORD PTR [EBP-80],00BC

001B:00431137 XOR ECX,ECX

001B:00431139 LEA EAX,[EBP-44]

001B:0043113C MOV [EBP-44],ECX

001B:0043113F PUSH EAX

001B:00431140 INC DWORD PTR [EBP-74]

001B:00431143 LEA EAX,[EBP-08]

001B:00431146 MOV ECX,[EBP-009C]

001B:0043114C MOV EDX,00000001

001B:00431151 DEC ECX

001B:00431152 CALL 004B7698

//将假码二段提取出来放入[ebp-44]

001B:00431157 LEA EDX,[EBP-44]

001B:0043115A LEA EAX,[EBP-1C]

001B:0043115D CALL 004B74D8

001B:00431162 DEC DWORD PTR [EBP-74]

001B:00431165 LEA EAX,[EBP-44]

001B:00431168 MOV EDX,00000002

001B:0043116D CALL 004B74A8

001B:00431172 LEA EAX,[EBP-08]

001B:00431175 MOV ECX,[EBP-009C]

001B:0043117B MOV EDX,00000001

001B:00431180 CALL 004B762C

001B:00431185 MOV ESI,00000001

001B:0043118A LEA EBX,[EBP-0158]

001B:00431190 CMP ESI,[EBP-009C]

001B:00431196 JGE 004311F4

001B:00431198 MOV WORD PTR [EBP-80],00C8

001B:0043119E XOR EAX,EAX

001B:004311A0 LEA EDX,[EBP-48]

001B:004311A3 MOV [EBP-48],EAX

001B:004311A6 PUSH EDX

001B:004311A7 INC DWORD PTR [EBP-74]

001B:004311AA MOV EDX,ESI

001B:004311AC LEA EAX,[EBP-1C]

001B:004311AF MOV ECX,00000001

001B:004311B4 CALL 004B7698

001B:004311B9 LEA EDX,[EBP-48]

001B:004311BC LEA EAX,[EBP-10]

001B:004311BF CALL 004B74D8

001B:004311C4 DEC DWORD PTR [EBP-74]

001B:004311C7 LEA EAX,[EBP-48]

001B:004311CA MOV EDX,00000002

001B:004311CF CALL 004B74A8

001B:004311D4 LEA EDX,[EBP-10]

001B:004311D7 LEA EAX,[EBP-04]

001B:004311DA CALL 004B7674

001B:004311DF MOV WORD PTR [EBP-80],0008

001B:004311E5 DEC EAX

001B:004311E6 MOV [EBX],EAX

001B:004311E8 INC ESI

001B:004311E9 ADD EBX,04

001B:004311EC CMP ESI,[EBP-009C]

001B:004311F2 JL 00431198

001B:004311F4 XOR EDI,EDI

001B:004311F6 CMP DWORD PTR [EBP-0158],1E

001B:004311FD JNZ 00431251

001B:004311FF MOV WORD PTR [EBP-80],00D4

001B:00431205 LEA EAX,[EBP-4C]

001B:00431208 MOV DL,30

001B:0043120A CALL 004B745C

001B:0043120F INC DWORD PTR [EBP-74]

001B:00431212 LEA EDX,[EBP-4C]

001B:00431215 LEA EAX,[EBP-0C]

001B:00431218 CALL 004B74EC

001B:0043121D DEC DWORD PTR [EBP-74]

001B:00431220 LEA EAX,[EBP-4C]

001B:00431223 MOV EDX,00000002

001B:00431228 CALL 004B74A8

001B:0043122D MOV WORD PTR [EBP-80],0008

001B:00431233 XOR EDX,EDX

001B:00431235 LEA EAX,[EBP-0154]

001B:0043123B MOV ECX,[EAX]

001B:0043123D MOV [EAX-04],ECX

001B:00431240 INC EDX

001B:00431241 ADD EAX,04

001B:00431244 CMP EDX,13

001B:00431247 JL 0043123B

001B:00431249 DEC DWORD PTR [EBP-009C]

001B:0043124F JMP 004311F6

001B:00431251 MOV ESI,[EBP-009C]

001B:00431257 ADD ESI,-02

001B:0043125A LEA EBX,[ESI*4+EBP-0158]

001B:00431261 TEST ESI,ESI

001B:00431263 JL 004312C3

001B:00431265 MOV [EBP-015C],ESI

001B:0043126B FILD DWORD PTR [EBP-015C]

001B:00431271 ADD ESP,-08

001B:00431274 FSTP REAL8 PTR [ESP]

001B:00431277 PUSH 403E0000

001B:0043127C PUSH 00

001B:0043127E CALL 004AFE38

001B:00431283 MOV EAX,[EBX]

001B:00431285 XOR EDX,EDX

001B:00431287 MOV [EBP-0164],EAX

001B:0043128D MOV [EBP-0160],EDX

001B:00431293 FILD QWORD PTR [EBP-0164]

001B:00431299 ADD ESP,10

001B:0043129C XOR ECX,ECX

001B:0043129E MOV [EBP-016C],EDI

001B:004312A4 MOV [EBP-0168],ECX

001B:004312AA FMULP ST(1),ST

001B:004312AC FILD QWORD PTR [EBP-016C]

001B:004312B2 FADDP ST(1),ST

001B:004312B4 CALL 004AF9F0

001B:004312B9 MOV EDI,EAX

001B:004312BB DEC ESI

001B:004312BC ADD EBX,-04

001B:004312BF TEST ESI,ESI

001B:004312C1 JGE 00431265

//以上求假码二段变码

001B:004312C3 PUSH EDI

001B:004312C4 PUSH 004EB623

001B:004312C9 LEA EDX,[EBP-10]

001B:004312CC PUSH EDX

001B:004312CD CALL 004B75F8

001B:004312D2 ADD ESP,0C

001B:004312D5 LEA EDX,[EBP-10]

001B:004312D8 LEA EAX,[EBP-0C]

001B:004312DB CALL 004B74EC

//将假码二段变码添加到假码一段变码之后

//变码地址为[ebp-0c]

001B:004312E0 MOV WORD PTR [EBP-80],00E0

001B:004312E6 MOV EDX,004EB627

001B:004312EB LEA EAX,[EBP-20]

001B:004312EE CALL 004B7350

001B:004312F3 INC DWORD PTR [EBP-74]

001B:004312F6 MOV EDX,004EB628

001B:004312FB MOV WORD PTR [EBP-80],0008

001B:00431301 MOV WORD PTR [EBP-80],00EC

001B:00431307 LEA EAX,[EBP-50]

001B:0043130A CALL 004B7350

001B:0043130F INC DWORD PTR [EBP-74]

001B:00431312 LEA EDX,[EBP-50]

001B:00431315 LEA EAX,[EBP-08]

001B:00431318 CALL 004B7674

001B:0043131D MOV [EBP-009C],EAX

001B:00431323 DEC DWORD PTR [EBP-74]

001B:00431326 LEA EAX,[EBP-50]

001B:00431329 MOV EDX,00000002

001B:0043132E CALL 004B74A8

001B:00431333 CMP DWORD PTR [EBP-009C],00

001B:0043133A JNZ 00431353

001B:0043133C CMP DWORD PTR [EBP-08],00

001B:00431340 JZ 0043134A

001B:00431342 MOV ECX,[EBP-08]

001B:00431345 MOV EAX,[ECX-04]

001B:00431348 JMP 0043134C

001B:0043134A XOR EAX,EAX

001B:0043134C INC EAX

001B:0043134D MOV [EBP-009C],EAX

001B:00431353 MOV WORD PTR [EBP-80],00F8

001B:00431359 XOR EDX,EDX

001B:0043135B LEA ECX,[EBP-54]

001B:0043135E MOV [EBP-54],EDX

001B:00431361 PUSH ECX

001B:00431362 INC DWORD PTR [EBP-74]

001B:00431365 MOV EDX,00000001

001B:0043136A MOV ECX,[EBP-009C]

001B:00431370 LEA EAX,[EBP-08]

001B:00431373 DEC ECX

001B:00431374 CALL 004B7698

001B:00431379 LEA EDX,[EBP-54]

001B:0043137C LEA EAX,[EBP-20]

001B:0043137F CALL 004B74D8

001B:00431384 DEC DWORD PTR [EBP-74]

001B:00431387 LEA EAX,[EBP-54]

001B:0043138A MOV EDX,00000002

001B:0043138F CALL 004B74A8

001B:00431394 LEA EAX,[EBP-08]

001B:00431397 MOV ECX,[EBP-009C]

001B:0043139D MOV EDX,00000001

001B:004313A2 CALL 004B762C

001B:004313A7 MOV ESI,00000001

001B:004313AC LEA EBX,[EBP-0158]

001B:004313B2 CMP ESI,[EBP-009C]

001B:004313B8 JGE 00431416

001B:004313BA MOV WORD PTR [EBP-80],0104

001B:004313C0 XOR EAX,EAX

001B:004313C2 LEA EDX,[EBP-58]

001B:004313C5 MOV [EBP-58],EAX

001B:004313C8 PUSH EDX

001B:004313C9 INC DWORD PTR [EBP-74]

001B:004313CC MOV EDX,ESI

001B:004313CE LEA EAX,[EBP-20]

001B:004313D1 MOV ECX,00000001

001B:004313D6 CALL 004B7698

001B:004313DB LEA EDX,[EBP-58]

001B:004313DE LEA EAX,[EBP-10]

001B:004313E1 CALL 004B74D8

001B:004313E6 DEC DWORD PTR [EBP-74]

001B:004313E9 LEA EAX,[EBP-58]

001B:004313EC MOV EDX,00000002

001B:004313F1 CALL 004B74A8

001B:004313F6 LEA EDX,[EBP-10]

001B:004313F9 LEA EAX,[EBP-04]

001B:004313FC CALL 004B7674

001B:00431401 MOV WORD PTR [EBP-80],0008

001B:00431407 DEC EAX

001B:00431408 MOV [EBX],EAX

001B:0043140A INC ESI

001B:0043140B ADD EBX,04

001B:0043140E CMP ESI,[EBP-009C]

001B:00431414 JL 004313BA

001B:00431416 XOR EDI,EDI

001B:00431418 CMP DWORD PTR [EBP-0158],1E

001B:0043141F JNZ 00431473

001B:00431421 MOV WORD PTR [EBP-80],0110

001B:00431427 LEA EAX,[EBP-5C]

001B:0043142A MOV DL,30

001B:0043142C CALL 004B745C

001B:00431431 INC DWORD PTR [EBP-74]

001B:00431434 LEA EDX,[EBP-5C]

001B:00431437 LEA EAX,[EBP-0C]

001B:0043143A CALL 004B74EC

001B:0043143F DEC DWORD PTR [EBP-74]

001B:00431442 LEA EAX,[EBP-5C]

001B:00431445 MOV EDX,00000002

001B:0043144A CALL 004B74A8

001B:0043144F MOV WORD PTR [EBP-80],0008

001B:00431455 XOR EDX,EDX

001B:00431457 LEA EAX,[EBP-0154]

001B:0043145D MOV ECX,[EAX]

001B:0043145F MOV [EAX-04],ECX

001B:00431462 INC EDX

001B:00431463 ADD EAX,04

001B:00431466 CMP EDX,13

001B:00431469 JL 0043145D

001B:0043146B DEC DWORD PTR [EBP-009C]

001B:00431471 JMP 00431418

001B:00431473 MOV ESI,[EBP-009C]

001B:00431479 ADD ESI,-02

001B:0043147C LEA EBX,[ESI*4+EBP-0158]

001B:00431483 TEST ESI,ESI

001B:00431485 JL 004314E5

001B:00431487 MOV [EBP-015C],ESI

001B:0043148D FILD DWORD PTR [EBP-015C]

001B:00431493 ADD ESP,-08

001B:00431496 FSTP REAL8 PTR [ESP]

001B:00431499 PUSH 403E0000

001B:0043149E PUSH 00

001B:004314A0 CALL 004AFE38

001B:004314A5 MOV EAX,[EBX]

001B:004314A7 XOR EDX,EDX

001B:004314A9 MOV [EBP-0164],EAX

001B:004314AF MOV [EBP-0160],EDX

001B:004314B5 FILD QWORD PTR [EBP-0164]

001B:004314BB ADD ESP,10

001B:004314BE XOR ECX,ECX

001B:004314C0 MOV [EBP-016C],EDI

001B:004314C6 MOV [EBP-0168],ECX

001B:004314CC FMULP ST(1),ST

001B:004314CE FILD QWORD PTR [EBP-016C]

001B:004314D4 FADDP ST(1),ST

001B:004314D6 CALL 004AF9F0

001B:004314DB MOV EDI,EAX

001B:004314DD DEC ESI

001B:004314DE ADD EBX,-04

001B:004314E1 TEST ESI,ESI

001B:004314E3 JGE 00431487

001B:004314E5 PUSH EDI

001B:004314E6 PUSH 004EB62A

001B:004314EB LEA EDX,[EBP-10]

001B:004314EE PUSH EDX

001B:004314EF CALL 004B75F8

001B:004314F4 ADD ESP,0C

001B:004314F7 LEA EDX,[EBP-10]

001B:004314FA LEA EAX,[EBP-0C]

001B:004314FD CALL 004B74EC

//将假码三段变码加入[ebp-0c]

001B:00431502 CMP DWORD PTR [EBP-08],00

001B:00431506 JZ 00431510

001B:00431508 MOV ECX,[EBP-08]

001B:0043150B MOV EAX,[ECX-04]

001B:0043150E JMP 00431512

001B:00431510 XOR EAX,EAX

001B:00431512 TEST EAX,EAX

001B:00431514 JLE 00431712

001B:0043151A MOV WORD PTR [EBP-80],0128

001B:00431520 MOV EDX,004EB62E

001B:00431525 LEA EAX,[EBP-60]

001B:00431528 CALL 004B7350

001B:0043152D INC DWORD PTR [EBP-74]

001B:00431530 MOV WORD PTR [EBP-80],011C

001B:00431536 CMP DWORD PTR [EBP-08],00

001B:0043153A JZ 00431544

001B:0043153C MOV EDX,[EBP-08]

001B:0043153F MOV ECX,[EDX-04]

001B:00431542 JMP 00431546

001B:00431544 XOR ECX,ECX

001B:00431546 INC ECX

001B:00431547 XOR EAX,EAX

001B:00431549 MOV [EBP-009C],ECX

001B:0043154F LEA EDX,[EBP-64]

001B:00431552 MOV WORD PTR [EBP-80],0134

001B:00431558 MOV [EBP-64],EAX

001B:0043155B PUSH EDX

001B:0043155C INC DWORD PTR [EBP-74]

001B:0043155F MOV EDX,00000001

001B:00431564 MOV ECX,[EBP-009C]

001B:0043156A LEA EAX,[EBP-08]

001B:0043156D DEC ECX

001B:0043156E CALL 004B7698

001B:00431573 LEA EDX,[EBP-64]

001B:00431576 LEA EAX,[EBP-60]

001B:00431579 CALL 004B74D8

001B:0043157E DEC DWORD PTR [EBP-74]

001B:00431581 LEA EAX,[EBP-64]

001B:00431584 MOV EDX,00000002

001B:00431589 CALL 004B74A8

001B:0043158E LEA EAX,[EBP-08]

001B:00431591 MOV ECX,[EBP-009C]

001B:00431597 MOV EDX,00000001

001B:0043159C CALL 004B762C

001B:004315A1 MOV ESI,00000001

001B:004315A6 LEA EBX,[EBP-0158]

001B:004315AC CMP ESI,[EBP-009C]

001B:004315B2 JGE 00431610

001B:004315B4 MOV WORD PTR [EBP-80],0140

001B:004315BA XOR EAX,EAX

001B:004315BC LEA EDX,[EBP-68]

001B:004315BF MOV [EBP-68],EAX

001B:004315C2 PUSH EDX

001B:004315C3 INC DWORD PTR [EBP-74]

001B:004315C6 MOV EDX,ESI

001B:004315C8 LEA EAX,[EBP-60]

001B:004315CB MOV ECX,00000001

001B:004315D0 CALL 004B7698

001B:004315D5 LEA EDX,[EBP-68]

001B:004315D8 LEA EAX,[EBP-10]

001B:004315DB CALL 004B74D8

001B:004315E0 DEC DWORD PTR [EBP-74]

001B:004315E3 LEA EAX,[EBP-68]

001B:004315E6 MOV EDX,00000002

001B:004315EB CALL 004B74A8

001B:004315F0 LEA EDX,[EBP-10]

001B:004315F3 LEA EAX,[EBP-04]

001B:004315F6 CALL 004B7674

001B:004315FB MOV WORD PTR [EBP-80],011C

001B:00431601 DEC EAX

001B:00431602 MOV [EBX],EAX

001B:00431604 INC ESI

001B:00431605 ADD EBX,04

001B:00431608 CMP ESI,[EBP-009C]

001B:0043160E JL 004315B4

001B:00431610 XOR EDI,EDI

001B:00431612 CMP DWORD PTR [EBP-0158],1E

001B:00431619 JNZ 0043166D

001B:0043161B MOV WORD PTR [EBP-80],014C

001B:00431621 LEA EAX,[EBP-6C]

001B:00431624 MOV DL,30

001B:00431626 CALL 004B745C

001B:0043162B INC DWORD PTR [EBP-74]

001B:0043162E LEA EDX,[EBP-6C]

001B:00431631 LEA EAX,[EBP-0C]

001B:00431634 CALL 004B74EC

001B:00431639 DEC DWORD PTR [EBP-74]

001B:0043163C LEA EAX,[EBP-6C]

001B:0043163F MOV EDX,00000002

001B:00431644 CALL 004B74A8

001B:00431649 MOV WORD PTR [EBP-80],011C

001B:0043164F XOR EDX,EDX

001B:00431651 LEA EAX,[EBP-0154]

001B:00431657 MOV ECX,[EAX]

001B:00431659 MOV [EAX-04],ECX

001B:0043165C INC EDX

001B:0043165D ADD EAX,04

001B:00431660 CMP EDX,13

001B:00431663 JL 00431657

001B:00431665 DEC DWORD PTR [EBP-009C]

001B:0043166B JMP 00431612

001B:0043166D MOV ESI,[EBP-009C]

001B:00431673 ADD ESI,-02

001B:00431676 LEA EBX,[ESI*4+EBP-0158]

001B:0043167D TEST ESI,ESI

001B:0043167F JL 004316DF

001B:00431681 MOV [EBP-015C],ESI

001B:00431687 FILD DWORD PTR [EBP-015C]

001B:0043168D ADD ESP,-08

001B:00431690 FSTP REAL8 PTR [ESP]

001B:00431693 PUSH 403E0000

001B:00431698 PUSH 00

001B:0043169A CALL 004AFE38

001B:0043169F MOV EAX,[EBX]

001B:004316A1 XOR EDX,EDX

001B:004316A3 MOV [EBP-0164],EAX

001B:004316A9 MOV [EBP-0160],EDX

001B:004316AF FILD QWORD PTR [EBP-0164]

001B:004316B5 ADD ESP,10

001B:004316B8 XOR ECX,ECX

001B:004316BA MOV [EBP-016C],EDI

001B:004316C0 MOV [EBP-0168],ECX

001B:004316C6 FMULP ST(1),ST

001B:004316C8 FILD QWORD PTR [EBP-016C]

001B:004316CE FADDP ST(1),ST

001B:004316D0 CALL 004AF9F0

001B:004316D5 MOV EDI,EAX

001B:004316D7 DEC ESI

001B:004316D8 ADD EBX,-04

001B:004316DB TEST ESI,ESI

001B:004316DD JGE 00431681

001B:004316DF PUSH EDI

001B:004316E0 PUSH 004EB62F

001B:004316E5 LEA EDX,[EBP-10]

001B:004316E8 PUSH EDX

001B:004316E9 CALL 004B75F8

001B:004316EE ADD ESP,0C

001B:004316F1 LEA EDX,[EBP-10]

001B:004316F4 LEA EAX,[EBP-0C]

001B:004316F7 CALL 004B74EC

//将假码四段变码加入[ebp-0c]

001B:004316FC DEC DWORD PTR [EBP-74]

001B:004316FF LEA EAX,[EBP-60]

001B:00431702 MOV EDX,00000002

001B:00431707 CALL 004B74A8

001B:0043170C MOV WORD PTR [EBP-80],0008

001B:00431712 CMP DWORD PTR [EBP-0C],00

001B:00431716 JZ 0043171D

001B:00431718 MOV ECX,[EBP-0C]

001B:0043171B JMP 00431722

001B:0043171D MOV ECX,004EB633

001B:00431722 MOV EDI,ECX

001B:00431724 XOR EAX,EAX

001B:00431726 OR ECX,-01

001B:00431729 LEA ESI,[EBP-0108]

001B:0043172F REPNZ SCASB

001B:00431731 NOT ECX

001B:00431733 SUB EDI,ECX

001B:00431735 MOV EDX,ECX

001B:00431737 XCHG ESI,EDI

001B:00431739 SHR ECX,02

001B:0043173C MOV EAX,EDI

001B:0043173E REPZ MOVSD

001B:00431740 MOV ECX,EDX

001B:00431742 AND ECX,03

001B:00431745 REPZ MOVSB

//将四段合并后的假码变码转移到[ebp-108]

//可见注册码是分成四段的

//另外回头去看本验证函数在前面曾有

//将[ebp-d8]后20字节清零

//将[ebp-108]后45字节清零

//的可疑动作,现在清楚了

//[ebp-d8]是用户名变码

//[ebp-108]是假码变码

001B:00431747 XOR EAX,EAX

001B:00431749 XOR EDX,EDX

001B:0043174B MOV [EBP-00A0],EAX

001B:00431751 XOR ECX,ECX

001B:00431753 MOV WORD PTR [EBP-80],0008

001B:00431759 MOV [EBP-00A4],EDX

001B:0043175F MOV [EBP-00A8],ECX

001B:00431765 XOR EAX,EAX

001B:00431767 XOR EDX,EDX

001B:00431769 MOV [EBP-00AC],EAX

001B:0043176F MOV [EBP-00B0],EDX

//一大堆清零动作

001B:00431775 LEA ECX,[EBP-00A8]

001B:0043177B LEA EAX,[EBP-0108]

001B:00431781 PUSH ECX

001B:00431782 PUSH EAX

001B:00431783 CALL 0043CC8C

//将假码变码变成了一个很大的整数

001B:00431788 ADD ESP,08

001B:0043178B LEA EDX,[EBP-00A0]

001B:00431791 PUSH EDX

001B:00431792 PUSH 004EB634

//[4eb634]="C7B71C573A60F571"

//看起来像一个16进制的大数

001B:00431797 CALL 0043CAC0

//将字符串转换成了数值,但变成了

//C1EDC715C3A60F571

//高位变了低位不变

//猜测是数值形式有符号及进位标志造成的

001B:0043179C ADD ESP,08

001B:0043179F LEA ECX,[EBP-00A4]

001B:004317A5 PUSH ECX

001B:004317A6 PUSH 004EB645

//[4eb645]="10001"

001B:004317AB CALL 0043CAC0

//将字符串变成数值

001B:004317B0 ADD ESP,08

001B:004317B3 LEA EAX,[EBP-00B0]

001B:004317B9 PUSH EAX

001B:004317BA MOV EDX,[EBP-00A0]

001B:004317C0 PUSH EDX

001B:004317C1 MOV ECX,[EBP-00A4]

001B:004317C7 PUSH ECX

001B:004317C8 MOV EAX,[EBP-00A8]

001B:004317CE PUSH EAX

001B:004317CF CALL 0043BC38

//以假码变码、C7B71C573A60F571、10001为参数

//计算出另一个数

001B:004317D4 ADD ESP,10

001B:004317D7 LEA EDX,[EBP-00AC]

001B:004317DD PUSH EDX

001B:004317DE LEA ECX,[EBP-00D8]

001B:004317E4 PUSH ECX

001B:004317E5 CALL 0043CAC0

//将这个数与用户名变码做比较

//不同则跳出函数!!!

//观察C7B71C573A60F571=14391002295252874609

//14391002295252874609=3040705643*4732783763

//是两个大素数的积

//而10001化成十进制=65537

//是典型的公钥

//所以,RSA无疑

001B:004317EA ADD ESP,08

001B:004317ED MOV EAX,[EBP-00B0]

001B:004317F3 PUSH EAX

001B:004317F4 MOV EDX,[EBP-00AC]

001B:004317FA PUSH EDX

001B:004317FB CALL 00439DF0

001B:00431800 ADD ESP,08

001B:00431803 TEST EAX,EAX

001B:00431805 JNZ 004318CD

001B:0043180B MOV ECX,[004F538C]

001B:00431811 LEA EDI,[EBP-00C4]

001B:00431817 MOV EAX,[ECX]

001B:00431819 ADD EAX,000020F1

001B:0043181E MOV ESI,EAX

001B:00431820 XOR EAX,EAX

001B:00431822 OR ECX,-01

001B:00431825 REPNZ SCASB

001B:00431827 NOT ECX

001B:00431829 SUB EDI,ECX

001B:0043182B MOV EDX,ECX

001B:0043182D XCHG ESI,EDI

001B:0043182F SHR ECX,02

001B:00431832 MOV EAX,EDI

001B:00431834 REPZ MOVSD

001B:00431836 MOV ECX,EDX

001B:00431838 AND ECX,03

001B:0043183B REPZ MOVSB

001B:0043183D MOV EAX,[004F538C]

001B:00431842 LEA EDI,[EBP-0108]

001B:00431848 MOV EDX,[EAX]

001B:0043184A XOR EAX,EAX

001B:0043184C ADD EDX,0000210A

001B:00431852 OR ECX,-01

001B:00431855 REPNZ SCASB

001B:00431857 NOT ECX

001B:00431859 SUB EDI,ECX

001B:0043185B MOV ESI,EDX

001B:0043185D XCHG ESI,EDI

001B:0043185F MOV EDX,ECX

001B:00431861 MOV EAX,EDI

001B:00431863 SHR ECX,02

001B:00431866 REPZ MOVSD

001B:00431868 MOV ECX,EDX

001B:0043186A AND ECX,03

001B:0043186D REPZ MOVSB

001B:0043186F MOV EAX,[EBP-00B0]

001B:00431875 PUSH EAX

001B:00431876 MOV EDX,[EBP-00AC]

001B:0043187C PUSH EDX

001B:0043187D CALL 00439DF0

001B:00431882 ADD ESP,08

001B:00431885 TEST EAX,EAX

001B:00431887 JNZ 004318CD

001B:00431889 MOV ECX,[004F538C]

001B:0043188F XOR ESI,ESI

001B:00431891 MOV EAX,[ECX]

001B:00431893 MOV BYTE PTR [EAX+00002141],01

001B:0043189A CALL 004B00C0

001B:0043189F CDQ

001B:004318A0 MOV ECX,00000032

001B:004318A5 IDIV ECX

001B:004318A7 LEA EAX,[ESI*4+ESI]

001B:004318AA MOV ECX,[004F538C]

001B:004318B0 ADD DL,65

001B:004318B3 LEA EAX,[EAX*2+ESI]

001B:004318B6 SHL EAX,03

001B:004318B9 MOV ECX,[ECX]

001B:004318BB SUB EAX,ESI

001B:004318BD LEA EAX,[EAX*4+ESI]

001B:004318C0 INC ESI

001B:004318C1 CMP ESI,03

001B:004318C4 MOV [EAX*4+ECX+00000A26],DL

001B:004318CB JL 0043189A

001B:004318CD DEC DWORD PTR [EBP-74]

001B:004318D0 LEA EAX,[EBP-20]

001B:004318D3 MOV EDX,00000002

001B:004318D8 CALL 004B74A8

001B:004318DD DEC DWORD PTR [EBP-74]

001B:004318E0 LEA EAX,[EBP-1C]

001B:004318E3 MOV EDX,00000002

001B:004318E8 CALL 004B74A8

001B:004318ED DEC DWORD PTR [EBP-74]

001B:004318F0 LEA EAX,[EBP-18]

001B:004318F3 MOV EDX,00000002

001B:004318F8 CALL 004B74A8

001B:004318FD DEC DWORD PTR [EBP-74]

001B:00431900 LEA EAX,[EBP-14]

001B:00431903 MOV EDX,00000002

001B:00431908 CALL 004B74A8

001B:0043190D DEC DWORD PTR [EBP-74]

001B:00431910 LEA EAX,[EBP-10]

001B:00431913 MOV EDX,00000002

001B:00431918 CALL 004B74A8

001B:0043191D DEC DWORD PTR [EBP-74]

001B:00431920 LEA EAX,[EBP-0C]

001B:00431923 MOV EDX,00000002

001B:00431928 CALL 004B74A8

001B:0043192D DEC DWORD PTR [EBP-74]

001B:00431930 LEA EAX,[EBP-08]

001B:00431933 MOV EDX,00000002

001B:00431938 CALL 004B74A8

001B:0043193D DEC DWORD PTR [EBP-74]

001B:00431940 LEA EAX,[EBP-04]

001B:00431943 MOV EDX,00000002

001B:00431948 CALL 004B74A8

001B:0043194D MOV ECX,[EBP-0090]

001B:00431953 MOV FS:[00000000],ECX

001B:0043195A POP EDI

001B:0043195B POP ESI

001B:0043195C POP EBX

001B:0043195D MOV ESP,EBP

001B:0043195F POP EBP

001B:00431960 RET

//在验证假码之后,此函数还将用户名、假码再做变换并写入文件

//在重启之后肯定还有多次验证

//对于本教程来说,这些都已经不重要

//应为我们追求的是正确的注册码,而不是爆破

注册机算法:

注册机算法当然就是注册验证算法的逆算法啦!我们先来总结

一下验证算法:

1、用户名的变化

设用户名为char username[len];

用户名变码为 long name;

则有:

int num;

name = 0;

for(int i=0;i<len;i++)

{

num = username[i]-48;

num = num*(num+1);

name = name+num;

}

name = name+123456;

2、假码的变化

设假码为char passcode[4][len];

密码表为 char* table="L5WXT6VMB4GE3RUYJ9HASF8KQNPD7CI";

假码变码为 long code[4];

则有:

int num;

char ch;

for(int i=0;i<4;i++)

{

code[i]=0;

for(int j=len-1;j>=0;j--)

{

ch = passcode[i][j];

for(int k=0;k<30;k++)

{

if(table[k]==ch)

{

num=k;

break;

}

}

code[i]=code[i]*30+num;

}

}

3、RSA验证

模 n =14391002295252874609

公钥 d =65537

可计算出私钥 e =3084742971672649089

既然 假码变码^d mod n = 用户名变码

所以 假码变码 = 用户名变码^e mod n

对以上算法求逆就是注册机算法,留给有兴趣的朋友自己练习

练习吧,呵呵,有一点点难度哦。

(出处:赢政天下收集整理)

相关文章:

·简单算法——Cisco某个学习资料

·starforce的一些资料

相关软件:

·西苑资料管理 (版本1.3)通用版注册器

·西苑资料管理 企业单机版

·通用资料管理器(mybase)v4.52

·资料收集库 v2.3.8.0 注册机

·资料大师--建筑施工验收规范系列标准 V8.0

·资料伴侣 V2.10

·图文资料收集整理阅读系统(书人之友) V3.0.405

·资料收集库 V2.3.7.0

·CSDN资料库(Mycsdn) V1.28

·用电、农电、供电资料管理 V8.0

→ 特别推荐

→ 热点TOP10

关于我们 |

帮助(?)

| 广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright © 1999-2003

winzheng.com All Rights Reserved.

繁体版:由华琦数码技术提供

Powered

by:MeSky.Net

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史