通过内存补丁实现程序自动注册并保存真码
内存注册机通过中断的方式获得真码的方式达到注册成功,其实可以通过内存补丁实现程序自动保存真码达到注册成功。
以GzPower Chess 2.0为例:
下面是程序比较处:
0042F491 |. 8BF1 MOV ESI,ECX
0042F493 |. E8 38010000 CALL ChineseC.0042F5D0 算法CALL
0042F498 |. 8B46 0C MOV EAX,DWORD PTR DS:[ESI+C] 真码
0042F49B |. 8B76 08 MOV ESI,DWORD PTR DS:[ESI+8] 假码
0042F49E |. 50 PUSH EAX ; /s2
0042F49F |. 56 PUSH ESI ; |s1
0042F4A0 |. FF15 34874300 CALL DWORD PTR DS:[<&MSVCRT._mbscmp>] ; \_mbscmp 字符串比较函数
0042F4A6 |. 83C4 08 ADD ESP,8
0042F4A9 |. 85C0 TEST EAX,EAX
0042F4AB |. 0F94C0 SETE AL
0042F4AE |. 5E POP ESI
0042F4AF \. C3 RETN
强制注册成功后,下面储存注册码:
00430CA1 |. 6A 01 PUSH 1 ; |ValueType = REG_SZ
00430CA3 |. 6A 00 PUSH 0 ; |Reserved = 0
00430CA5 |. 68 F0044400 PUSH ChineseC.004404F0 ; |ValueName = "UserName"
00430CAA |. 52 PUSH EDX ; |hKey
00430CAB |. FFD3 CALL EBX ; \RegSetValueExA
00430CAD 8B47 64 MOV EAX,DWORD PTR DS:[EDI+64] 输入的注册码
00430CB0 8D77 64 LEA ESI,DWORD PTR DS:[EDI+64]
00430CB3 |. 8BCE MOV ECX,ESI
00430CB5 |. 8B40 F8 MOV EAX,DWORD PTR DS:[EAX-8]
00430CB8 |. 50 PUSH EAX
00430CB9 |. E8 7A350000 CALL <JMP.&MFC42.#2915>
00430CBE 8B0E MOV ECX,DWORD PTR DS:[ESI]
00430CC0 |. 8B51 F8 MOV EDX,DWORD PTR DS:[ECX-8]
00430CC3 |. 52 PUSH EDX
00430CC4 |. 50 PUSH EAX
00430CC5 |. 8B4424 14 MOV EAX,DWORD PTR SS:[ESP+14]
00430CC9 |. 6A 01 PUSH 1
00430CCB |. 6A 00 PUSH 0
00430CCD |. 68 FC044400 PUSH ChineseC.004404FC ; ASCII "RegisterNum"
00430CD2 |. 50 PUSH EAX
00430CD3 |. FFD3 CALL EBX
00430CD5 |. 5B POP EBX
00430CD6 |> 8B4C24 0C MOV ECX,DWORD PTR SS:[ESP+C]
00430CDA |. 8B35 14804300 MOV ESI,DWORD PTR DS:[<&ADVAPI32.RegClos>; ADVAPI32.RegCloseKey
00430CE0 |. 51 PUSH ECX ; /hKey
00430CE1 |. FFD6 CALL ESI ; \RegCloseKey
00430CE3 |. 8B5424 08 MOV EDX,DWORD PTR SS:[ESP+8]
00430CE7 |. 52 PUSH EDX ; /hKey
00430CE8 |. FFD6 CALL ESI ; \RegCloseKey
00430CEA |. 5F POP EDI
00430CEB |. 32C0 XOR AL,AL
00430CED |. 5E POP ESI
00430CEE |. 83C4 08 ADD ESP,8
00430CF1 \. C3 RETN
上面00430CAD处的[EDI+64]即为填入的假码,地址为0012F890,ollydbg右下窗口内容如下:
0012F264 00375098 ASCII "cbfc7e9c8723385361ad862a10a93bd"真码地址
0012F268 0012F398 Pointer to next SEH record
以上的假码地址要改为真码地址0012F264才可使程序保存真码。查看寄存器地址可知ESP地址是0012F234比较接近真码地址0012F264,0012F264-0012F234=1C,把[EDI+64]改为[ESP+1C],在代码不远处有好多NOP正好可以利用。如下:
00430CF2 90 NOP
00430CF3 90 NOP
00430CF4 90 NOP
00430CF5 90 NOP
00430CF6 90 NOP
00430CF7 90 NOP
00430CF8 90 NOP
00430CF9 90 NOP
00430CFA 90 NOP
00430CFB 90 NOP
00430CFC 90 NOP
00430CFD 90 NOP
00430CFE 90 NOP
00430CFF 90 NOP
动手吧!,首先:修改比较处,使其注册成功:
0042F498 |. 8B46 0C MOV EAX,DWORD PTR DS:[ESI+C] 真码
0042F49B |. 8B76 08 MOV ESI,DWORD PTR DS:[ESI+8] 假码
改为都变成真码
0042F498 |. 8B46 0C MOV EAX,DWORD PTR DS:[ESI+C] 真码
0042F49B |. 8B76 08 MOV ESI,DWORD PTR DS:[ESI+C] 真码
然后修改
00430CAD 8B47 64 MOV EAX,DWORD PTR DS:[ESP+1C]
改为
00430CAD EB 43 JMP SHORT ChineseC.00430CF2 跳到我们利用的地方
00430CAF 90 NOP 代码不足部分用90填充补齐
再然后:
00430CF2 90 NOP
00430CF3 90 NOP
00430CF4 90 NOP
00430CF5 90 NOP
00430CF6 90 NOP
00430CF7 90 NOP
00430CF8 90 NOP
00430CF9 90 NOP
00430CFA 90 NOP
00430CFB 90 NOP
00430CFC 90 NOP
00430CFD 90 NOP
00430CFE 90 NOP
00430CFF 90 NOP
改为:
00430CF2 3E8B4424 1C MOV EAX,DWORD PTR DS:[ESP+1C] 传送真码
00430CF7 3E8D7424 1C LEA ESI,DWORD PTR DS:[ESP+1C] 传送真码
00430CFC EB B5 JMP SHORT ChineseC.00430CB3 跳回原程序保存真码
00430CFE 90 NOP
00430CFF 90 NOP
根据以上分析就可以制作内存补丁了,推荐使用金山游侠制作修改器。本文主要是试图说明通过内存补丁使程序自动保存真码的思路和方法,程序算法和内存补丁的具体制作步骤不再本文叙述范围。我们可以利用这个思路应用到其他程序,使程序注册更加方便。如果程序只有一个注册标志位的话,那么内存补丁制作就更简单了,为什么呢?自己思考吧。
另一种方法(不可并用):自动弹出注册码。标题和内容均为注册码。
正确注册码 对应内存地址:003750A8
* Possible StringData Ref from Data Obj ->"GzPower Chess"
|
:00430B70 6890044400 push 00440490 传送上面的窗口标题,改为push 003750A8
:00430B75 7521 jne 00430B98
* Possible StringData Ref from Data Obj ->"姓名和注册码不匹配,注册不成功!"
|
:00430B77 689C1A4400 push 00441A9C 传送上面的提示,改为push 003750A8
:00430B7C 8BCE mov ecx, esi
则注册失败后,自动弹出提示窗口。标题和内容均为注册码。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!