【文章标题】: 不用IDA,从高级语言的角度分析VSuite Ramdisk(服务器版)的本地注册算法
【文章作者】: zouzhiyong
【作者邮箱】: zzydog@foxmail.com
【软件名称】: VSuite Ramdisk (服务器版)
【软件大小】: 1.44 MB
【下载地址】: http://www.romexsoftware.com/download/VSuite.Ramdisk.Srv.Setup.zip.html
【加壳方式】: 没有加壳
【保护方式】: KeyFile+ID序列
【编写语言】: Microsoft Visual Studio .NET 2005 -- 2008
【使用工具】: OD+Peid+Windows记事本 Notepad2+破解辅助计算器
【操作平台】: Windows 7
【软件介绍】: 是把系统内存划出一部分当作硬盘使用,建立一个虚拟磁盘。
其实有点标题党了,只是在R3层的分析。并没有很高深的知识,只是基础知识而已,让大家失望了,请原谅我这个无知的菜鸟吧!
最近买了一条2G的内存,内存空间多了,就想到把内存分割成一个硬盘使用,便下载了这个软件,其实有免费版本的,只
是自己有点变态,总想“强奸”它的最高级版~,因此便下载了服务器版下来分析。
我看了很多分析文章的都是基于汇编来做说明,经常拿寄存器来做运算说明的,这样是比较抽象和难懂的,因为程序是用
高级语言写的嘛。由于程序比较好分析(其实有很多问题没有理解和深究的,在后面我会说明),我尝试不用IDA,从高级语言
的角度去分析软件的注册算法。希望大家喜欢这样的分析。
【分析过程】:
使用PEID查了一下,Microsoft Visual Studio .NET 2005 -- 2008写的,没有加壳,心里一下子兴奋起来,这样
才不拒人于门外嘛~~~。
好,废话一大堆了,下面是整个过程,其中文字说明的比较少,多数为伪代码的注释。
注册流程比较标准,通过下bp MessageBoxW,不断返回就可以到达注册函数:
********************* 总体流程函数分析 *************************
00442760 /. 55 PUSH EBP
00442761 |. 8BEC MOV EBP,ESP
00442763 |. 6A FF PUSH -1
00442765 |. 68 7B844500 PUSH rxvsrdsr.0045847B
0044276A |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
00442770 |. 50 PUSH EAX
00442771 |. 83EC 14 SUB ESP,14
00442774 |. A1 50184700 MOV EAX,DWORD PTR DS:[471850]
00442779 |. 33C5 XOR EAX,EBP
0044277B |. 50 PUSH EAX
0044277C |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
0044277F |. 64:A3 0000000>MOV DWORD PTR FS:[0],EAX
00442785 |. 894D E8 MOV DWORD PTR SS:[EBP-18],ECX
00442788 |. 6A 01 PUSH 1
0044278A |. 8B4D E8 MOV ECX,DWORD PTR SS:[EBP-18]
0044278D |. E8 1961FCFF CALL rxvsrdsr.004088AB
00442792 |. 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
00442795 |. 83B8 8C000000>CMP DWORD PTR DS:[EAX+8C],0
0044279C |. 75 0D JNZ SHORT rxvsrdsr.004427AB
0044279E |. 8B4D E8 MOV ECX,DWORD PTR SS:[EBP-18]
004427A1 |. E8 5AFAFFFF CALL rxvsrdsr.00442200
004427A6 |. 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
004427A9 |. EB 0B JMP SHORT rxvsrdsr.004427B6
004427AB |> 8B4D E8 MOV ECX,DWORD PTR SS:[EBP-18]
004427AE |. E8 EDF4FFFF CALL rxvsrdsr.00441CA0 ; //这里是算法CALL,并且是带有错误提示的
004427B3 |. 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
004427B6 |> 837D F0 00 CMP DWORD PTR SS:[EBP-10],0 ; //判断注册是否成功
004427BA |. 74 4E JE SHORT rxvsrdsr.0044280A ; //这里是最外部的爆破点,但是不能修改这,因为上面的算法CALL已经提示错误了
004427BC |. 68 C1000000 PUSH 0C1 ; /Arg1 = 000000C1
004427C1 |. 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14] ; |
004427C4 |. E8 E7FAFBFF CALL rxvsrdsr.004022B0 ; \rxvsrdsr.004022B0
004427C9 |. 8945 E4 MOV DWORD PTR SS:[EBP-1C],EAX
004427CC |. 8B4D E4 MOV ECX,DWORD PTR SS:[EBP-1C]
004427CF |. 894D E0 MOV DWORD PTR SS:[EBP-20],ECX
004427D2 |. C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0
004427D9 |. 6A 00 PUSH 0
004427DB |. 6A 00 PUSH 0
004427DD |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
004427E0 |. E8 4BFEFBFF CALL rxvsrdsr.00402630
004427E5 |. 50 PUSH EAX ; |Arg1
004427E6 |. E8 70C2FCFF CALL rxvsrdsr.0040EA5B ; \rxvsrdsr.0040EA5B
004427EB |. C745 FC FFFFF>MOV DWORD PTR SS:[EBP-4],-1
004427F2 |. 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
004427F5 |. E8 06F2FBFF CALL rxvsrdsr.00401A00
004427FA |. 8B55 E8 MOV EDX,DWORD PTR SS:[EBP-18]
004427FD |. 8B02 MOV EAX,DWORD PTR DS:[EDX]
004427FF |. 8B4D E8 MOV ECX,DWORD PTR SS:[EBP-18]
00442802 |. 8B90 58010000 MOV EDX,DWORD PTR DS:[EAX+158]
00442808 |. FFD2 CALL EDX
0044280A |> 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C]
0044280D |. 64:890D 00000>MOV DWORD PTR FS:[0],ECX
00442814 |. 59 POP ECX
00442815 |. 8BE5 MOV ESP,EBP
00442817 |. 5D POP EBP
00442818 \. C3 RETN
00441CA0 /$ 55 PUSH EBP
00441CA1 |. 8BEC MOV EBP,ESP
00441CA3 |. 6A FF PUSH -1
00441CA5 |. 68 D5774500 PUSH rxvsrdsr.004577D5
00441CAA |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
00441CB0 |. 50 PUSH EAX
00441CB1 |. 81EC F8000000 SUB ESP,0F8
00441CB7 |. A1 50184700 MOV EAX,DWORD PTR DS:[471850]
00441CBC |. 33C5 XOR EAX,EBP
00441CBE |. 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
00441CC1 |. 50 PUSH EAX
00441CC2 |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
00441CC5 |. 64:A3 0000000>MOV DWORD PTR FS:[0],EAX
00441CCB |. 898D 14FFFFFF MOV DWORD PTR SS:[EBP-EC],ECX
00441CD1 |. 8B85 14FFFFFF MOV EAX,DWORD PTR SS:[EBP-EC] ; (Initial CPU selection)
00441CD7 |. 83B8 90000000>CMP DWORD PTR DS:[EAX+90],0
00441CDE |. 75 1D JNZ SHORT rxvsrdsr.00441CFD
00441CE0 |. 6A 10 PUSH 10
00441CE2 |. 8B8D 14FFFFFF MOV ECX,DWORD PTR SS:[EBP-EC]
00441CE8 |. 83C1 74 ADD ECX,74
00441CEB |. 51 PUSH ECX
00441CEC |. 8D55 E0 LEA EDX,DWORD PTR SS:[EBP-20]
00441CEF |. 52 PUSH EDX
00441CF0 |. E8 8B4CFEFF CALL rxvsrdsr.00426980
00441CF5 |. 83C4 0C ADD ESP,0C
00441CF8 |. E9 61010000 JMP rxvsrdsr.00441E5E
00441CFD |> 68 E4154600 PUSH rxvsrdsr.004615E4 ; /Arg1 = 004615E4
00441D02 |. 8D8D 34FFFFFF LEA ECX,DWORD PTR SS:[EBP-CC] ; |
00441D08 |. E8 A305FCFF CALL rxvsrdsr.004022B0 ; \rxvsrdsr.004022B0
00441D0D |. C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0
00441D14 |. 8D85 34FFFFFF LEA EAX,DWORD PTR SS:[EBP-CC]
00441D1A |. 50 PUSH EAX ; /Arg1
00441D1B |. 68 23040000 PUSH 423 ; |/Arg1 = 00000423
00441D20 |. 8B8D 14FFFFFF MOV ECX,DWORD PTR SS:[EBP-EC] ; ||
00441D26 |. E8 4AA1FCFF CALL rxvsrdsr.0040BE75 ; |\rxvsrdsr.0040BE75
00441D2B |. 8BC8 MOV ECX,EAX ; |
00441D2D |. E8 E284FCFF CALL rxvsrdsr.0040A214 ; \//获取用户ID
00441D32 |. 8D8D 34FFFFFF LEA ECX,DWORD PTR SS:[EBP-CC]
00441D38 |. 51 PUSH ECX ; /Arg1
00441D39 |. E8 722F0100 CALL rxvsrdsr.00454CB0 ; \//注册用户ID序列合法性检测
00441D3E |. 83C4 04 ADD ESP,4
00441D41 |. 85C0 TEST EAX,EAX
00441D43 |. 75 71 JNZ SHORT rxvsrdsr.00441DB6 ; //判断注册用户ID是否合法,合法就跳
00441D45 |. 68 00010000 PUSH 100 ; /Arg1 = 00000100
00441D4A |. 8D8D 30FFFFFF LEA ECX,DWORD PTR SS:[EBP-D0] ; |
00441D50 |. E8 5B05FCFF CALL rxvsrdsr.004022B0 ; \rxvsrdsr.004022B0
00441D55 |. 8985 10FFFFFF MOV DWORD PTR SS:[EBP-F0],EAX
00441D5B |. 8B95 10FFFFFF MOV EDX,DWORD PTR SS:[EBP-F0]
00441D61 |. 8995 0CFFFFFF MOV DWORD PTR SS:[EBP-F4],EDX
00441D67 |. C645 FC 01 MOV BYTE PTR SS:[EBP-4],1
00441D6B |. 6A 00 PUSH 0
00441D6D |. 6A 10 PUSH 10
00441D6F |. 8B8D 0CFFFFFF MOV ECX,DWORD PTR SS:[EBP-F4]
00441D75 |. E8 B608FCFF CALL rxvsrdsr.00402630
00441D7A |. 50 PUSH EAX ; |Arg1
00441D7B |. E8 DBCCFCFF CALL rxvsrdsr.0040EA5B ; \//这里提示错误,如果注册用户ID不合法的就在这里提示错误
00441D80 |. C645 FC 00 MOV BYTE PTR SS:[EBP-4],0
00441D84 |. 8D8D 30FFFFFF LEA ECX,DWORD PTR SS:[EBP-D0]
00441D8A |. E8 71FCFBFF CALL rxvsrdsr.00401A00
00441D8F |. C785 2CFFFFFF>MOV DWORD PTR SS:[EBP-D4],0
00441D99 |. C745 FC FFFFF>MOV DWORD PTR SS:[EBP-4],-1
00441DA0 |. 8D8D 34FFFFFF LEA ECX,DWORD PTR SS:[EBP-CC]
00441DA6 |. E8 55FCFBFF CALL rxvsrdsr.00401A00
00441DAB |. 8B85 2CFFFFFF MOV EAX,DWORD PTR SS:[EBP-D4]
00441DB1 |. E9 AF010000 JMP rxvsrdsr.00441F65
00441DB6 |> 8D45 E0 LEA EAX,DWORD PTR SS:[EBP-20]
00441DB9 |. 50 PUSH EAX ; /Arg2
00441DBA |. 8D8D 34FFFFFF LEA ECX,DWORD PTR SS:[EBP-CC] ; |
00441DC0 |. 51 PUSH ECX ; |Arg1
00441DC1 |. E8 7A330100 CALL rxvsrdsr.00455140 ; \//将注册码转换成HEX数据,假设存放在InputUserIdHex[16],
//其实这个函数不用跟入,看返回值EAX就可以知道它的功能
00441DC6 |. 83C4 08 ADD ESP,8
00441DC9 |. 0FB655 E0 MOVZX EDX,BYTE PTR SS:[EBP-20]
00441DCD |. 83FA 56 CMP EDX,56 ; //InputUserIdHex[0] == 56h? ,表明InputUserId前两个字符可以是"56"
00441DD0 |. 74 7A JE SHORT rxvsrdsr.00441E4C ; //符合要求就继续注册
00441DD2 |. 0FB645 E0 MOVZX EAX,BYTE PTR SS:[EBP-20]
00441DD6 |. 83F8 55 CMP EAX,55 ; //InputUserIdHex[0] == 55h?,表明InputUserId前两个字符还可以是"55"
00441DD9 |. 74 71 JE SHORT rxvsrdsr.00441E4C ; //符合要求就继续注册
00441DDB |. 68 00010000 PUSH 100 ; /Arg1 = 00000100
00441DE0 |. 8D8D 28FFFFFF LEA ECX,DWORD PTR SS:[EBP-D8] ; |
00441DE6 |. E8 C504FCFF CALL rxvsrdsr.004022B0 ; \rxvsrdsr.004022B0
00441DEB |. 8985 08FFFFFF MOV DWORD PTR SS:[EBP-F8],EAX
00441DF1 |. 8B8D 08FFFFFF MOV ECX,DWORD PTR SS:[EBP-F8]
00441DF7 |. 898D 04FFFFFF MOV DWORD PTR SS:[EBP-FC],ECX
00441DFD |. C645 FC 02 MOV BYTE PTR SS:[EBP-4],2
00441E01 |. 6A 00 PUSH 0
00441E03 |. 6A 10 PUSH 10
00441E05 |. 8B8D 04FFFFFF MOV ECX,DWORD PTR SS:[EBP-FC]
00441E0B |. E8 2008FCFF CALL rxvsrdsr.00402630
00441E10 |. 50 PUSH EAX ; |Arg1
00441E11 |. E8 45CCFCFF CALL rxvsrdsr.0040EA5B ; \//当InputUserId前个字符不为"55"或者是"56"的时候就提示用户ID不合法
00441E16 |. C645 FC 00 MOV BYTE PTR SS:[EBP-4],0
00441E1A |. 8D8D 28FFFFFF LEA ECX,DWORD PTR SS:[EBP-D8]
00441E20 |. E8 DBFBFBFF CALL rxvsrdsr.00401A00
00441E25 |. C785 24FFFFFF>MOV DWORD PTR SS:[EBP-DC],0
00441E2F |. C745 FC FFFFF>MOV DWORD PTR SS:[EBP-4],-1
00441E36 |. 8D8D 34FFFFFF LEA ECX,DWORD PTR SS:[EBP-CC]
00441E3C |. E8 BFFBFBFF CALL rxvsrdsr.00401A00
00441E41 |. 8B85 24FFFFFF MOV EAX,DWORD PTR SS:[EBP-DC]
00441E47 |. E9 19010000 JMP rxvsrdsr.00441F65
00441E4C |> C745 FC FFFFF>MOV DWORD PTR SS:[EBP-4],-1
00441E53 |. 8D8D 34FFFFFF LEA ECX,DWORD PTR SS:[EBP-CC]
00441E59 |. E8 A2FBFBFF CALL rxvsrdsr.00401A00
00441E5E |> 68 E8154600 PUSH rxvsrdsr.004615E8 ; /Arg1 = 004615E8
00441E63 |. 8D8D 38FFFFFF LEA ECX,DWORD PTR SS:[EBP-C8] ; |
00441E69 |. E8 4204FCFF CALL rxvsrdsr.004022B0 ; \rxvsrdsr.004022B0
00441E6E |. C745 FC 03000>MOV DWORD PTR SS:[EBP-4],3
00441E75 |. 8D95 38FFFFFF LEA EDX,DWORD PTR SS:[EBP-C8]
00441E7B |. 52 PUSH EDX ; /Arg1
00441E7C |. 68 20040000 PUSH 420 ; |/Arg1 = 00000420
00441E81 |. 8B8D 14FFFFFF MOV ECX,DWORD PTR SS:[EBP-EC] ; ||
00441E87 |. E8 E99FFCFF CALL rxvsrdsr.0040BE75 ; |\rxvsrdsr.0040BE75
00441E8C |. 8BC8 MOV ECX,EAX ; |
00441E8E |. E8 8183FCFF CALL rxvsrdsr.0040A214 ; \//读取KEY文件所在路径
00441E93 |. 8D85 3CFFFFFF LEA EAX,DWORD PTR SS:[EBP-C4]
00441E99 |. 50 PUSH EAX ; /Arg2
00441E9A |. 8D8D 38FFFFFF LEA ECX,DWORD PTR SS:[EBP-C8] ; |
00441EA0 |. 51 PUSH ECX ; |Arg1
00441EA1 |. 8B8D 14FFFFFF MOV ECX,DWORD PTR SS:[EBP-EC] ; |
00441EA7 |. E8 04F1FFFF CALL rxvsrdsr.00440FB0 ; \//读取注册文件数据,对数据有大小,格式的限制,需要跟入
00441EAC |. 85C0 TEST EAX,EAX ; //KEY文件数据是否符合要求
00441EAE |. 75 6E JNZ SHORT rxvsrdsr.00441F1E ; //符合要求的就跳走,继续注册
00441EB0 |. 68 BF000000 PUSH 0BF ; /Arg1 = 000000BF
00441EB5 |. 8D8D 20FFFFFF LEA ECX,DWORD PTR SS:[EBP-E0] ; |
00441EBB |. E8 F003FCFF CALL rxvsrdsr.004022B0 ; \rxvsrdsr.004022B0
00441EC0 |. 8985 00FFFFFF MOV DWORD PTR SS:[EBP-100],EAX
00441EC6 |. 8B95 00FFFFFF MOV EDX,DWORD PTR SS:[EBP-100]
00441ECC |. 8995 FCFEFFFF MOV DWORD PTR SS:[EBP-104],EDX
00441ED2 |. C645 FC 04 MOV BYTE PTR SS:[EBP-4],4
00441ED6 |. 6A 00 PUSH 0
00441ED8 |. 6A 10 PUSH 10
00441EDA |. 8B8D FCFEFFFF MOV ECX,DWORD PTR SS:[EBP-104]
00441EE0 |. E8 4B07FCFF CALL rxvsrdsr.00402630
00441EE5 |. 50 PUSH EAX ; |Arg1
00441EE6 |. E8 70CBFCFF CALL rxvsrdsr.0040EA5B ; \//如果KEY文件数据格式不符合要求就提示KEY文件无效
00441EEB |. C645 FC 03 MOV BYTE PTR SS:[EBP-4],3
00441EEF |. 8D8D 20FFFFFF LEA ECX,DWORD PTR SS:[EBP-E0]
00441EF5 |. E8 06FBFBFF CALL rxvsrdsr.00401A00
00441EFA |. C785 1CFFFFFF>MOV DWORD PTR SS:[EBP-E4],0
00441F04 |. C745 FC FFFFF>MOV DWORD PTR SS:[EBP-4],-1
00441F0B |. 8D8D 38FFFFFF LEA ECX,DWORD PTR SS:[EBP-C8]
00441F11 |. E8 EAFAFBFF CALL rxvsrdsr.00401A00
00441F16 |. 8B85 1CFFFFFF MOV EAX,DWORD PTR SS:[EBP-E4]
00441F1C |. EB 47 JMP SHORT rxvsrdsr.00441F65
00441F1E |> 8B85 14FFFFFF MOV EAX,DWORD PTR SS:[EBP-EC]
00441F24 |. 33C9 XOR ECX,ECX
00441F26 |. 83B8 90000000>CMP DWORD PTR DS:[EAX+90],1
00441F2D |. 0F94C1 SETE CL
00441F30 |. 51 PUSH ECX
00441F31 |. 8D55 E0 LEA EDX,DWORD PTR SS:[EBP-20]
00441F34 |. 52 PUSH EDX
00441F35 |. 8D85 3CFFFFFF LEA EAX,DWORD PTR SS:[EBP-C4]
00441F3B |. 50 PUSH EAX
00441F3C |. 8B8D 14FFFFFF MOV ECX,DWORD PTR SS:[EBP-EC]
00441F42 |. E8 F9F6FFFF CALL rxvsrdsr.00441640 ; //*************这里是整个本地注册的核心算法***************
00441F47 |. 8985 18FFFFFF MOV DWORD PTR SS:[EBP-E8],EAX
00441F4D |. C745 FC FFFFF>MOV DWORD PTR SS:[EBP-4],-1
00441F54 |. 8D8D 38FFFFFF LEA ECX,DWORD PTR SS:[EBP-C8]
00441F5A |. E8 A1FAFBFF CALL rxvsrdsr.00401A00
00441F5F |. 8B85 18FFFFFF MOV EAX,DWORD PTR SS:[EBP-E8]
00441F65 |> 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C]
00441F68 |. 64:890D 00000>MOV DWORD PTR FS:[0],ECX
00441F6F |. 59 POP ECX
00441F70 |. 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
00441F73 |. 33CD XOR ECX,EBP
00441F75 |. E8 1544FEFF CALL rxvsrdsr.0042638F
00441F7A |. 8BE5 MOV ESP,EBP
00441F7C |. 5D POP EBP
00441F7D \. C3 RETN
00454CB0 /$ 55 PUSH EBP
00454CB1 |. 8BEC MOV EBP,ESP
00454CB3 |. 83EC 08 SUB ESP,8
00454CB6 |. 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
00454CB9 |. E8 C2C3FAFF CALL rxvsrdsr.00401080
00454CBE |. 0FB6C0 MOVZX EAX,AL
00454CC1 |. 85C0 TEST EAX,EAX
00454CC3 |. 74 04 JE SHORT rxvsrdsr.00454CC9
00454CC5 |. 33C0 XOR EAX,EAX
00454CC7 |. EB 6B JMP SHORT rxvsrdsr.00454D34
00454CC9 |> C745 FC 23000>MOV DWORD PTR SS:[EBP-4],23 ; //DWORD UserIdLen = 35,注册用户ID为35个字符
00454CD0 |. 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
00454CD3 |. E8 A8C4FAFF CALL rxvsrdsr.00401180 ; //这里取注册用户ID长度
00454CD8 |. 3B45 FC CMP EAX,DWORD PTR SS:[EBP-4] ; //输入的注册用户ID长度是否等于35
00454CDB |. 74 04 JE SHORT rxvsrdsr.00454CE1
00454CDD |. 33C0 XOR EAX,EAX
00454CDF |. EB 53 JMP SHORT rxvsrdsr.00454D34
00454CE1 |> C745 F8 00000>MOV DWORD PTR SS:[EBP-8],0 ; //DWORD nIndex = NULL
00454CE8 |. EB 09 JMP SHORT rxvsrdsr.00454CF3
00454CEA |> 8B4D F8 /MOV ECX,DWORD PTR SS:[EBP-8]
00454CED |. 83C1 01 |ADD ECX,1
00454CF0 |. 894D F8 |MOV DWORD PTR SS:[EBP-8],ECX
00454CF3 |> 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
00454CF6 |. 3B55 FC |CMP EDX,DWORD PTR SS:[EBP-4] ; //nIndex >= UserIdLen ?
00454CF9 |. 7D 34 |JGE SHORT rxvsrdsr.00454D2F
00454CFB |. 837D F8 08 |CMP DWORD PTR SS:[EBP-8],8 ; //忽略InputUserId[8],字符'-'
00454CFF |. 74 2C |JE SHORT rxvsrdsr.00454D2D
00454D01 |. 837D F8 11 |CMP DWORD PTR SS:[EBP-8],11 ; //忽略InputUserId[11h],字符'-'
00454D05 |. 74 26 |JE SHORT rxvsrdsr.00454D2D
00454D07 |. 837D F8 1A |CMP DWORD PTR SS:[EBP-8],1A ; //忽略InputUserId[1AH],字符'-'
00454D0B |. 74 20 |JE SHORT rxvsrdsr.00454D2D
00454D0D |. 8B45 F8 |MOV EAX,DWORD PTR SS:[EBP-8]
00454D10 |. 50 |PUSH EAX ; /Arg1
00454D11 |. 8B4D 08 |MOV ECX,DWORD PTR SS:[EBP+8] ; |
00454D14 |. E8 E7C2FAFF |CALL rxvsrdsr.00401000 ; \//DWORD FlagIndex = InputUserId[nIndex]
00454D19 |. 0FB7C8 |MOVZX ECX,AX
00454D1C |. 51 |PUSH ECX ; /Arg1
00454D1D |. E8 2F18FDFF |CALL rxvsrdsr.00426551 ; \//返回FlagHexData[FlagIndex] AND 80,
//实际上是限制InputUserId[nIndex]字符范围是:0~9 ,A~F,a~f
00454D22 |. 83C4 04 |ADD ESP,4
00454D25 |. 85C0 |TEST EAX,EAX ; //判断InputUserId[nIndex]是否符合范围
00454D27 |. 75 04 |JNZ SHORT rxvsrdsr.00454D2D
00454D29 |. 33C0 |XOR EAX,EAX
00454D2B |. EB 07 |JMP SHORT rxvsrdsr.00454D34
00454D2D |>^ EB BB \JMP SHORT rxvsrdsr.00454CEA
00454D2F |> B8 01000000 MOV EAX,1
00454D34 |> 8BE5 MOV ESP,EBP
00454D36 |. 5D POP EBP
00454D37 \. C3 RETN
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!