首页
社区
课程
招聘
通过内存补丁实现程序自动注册并保存真码
发表于: 2005-3-15 09:40 4226

通过内存补丁实现程序自动注册并保存真码

2005-3-15 09:40
4226
通过内存补丁实现程序自动注册并保存真码
内存注册机通过中断的方式获得真码的方式达到注册成功,其实可以通过内存补丁实现程序自动保存真码达到注册成功。
以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
则注册失败后,自动弹出提示窗口。标题和内容均为注册码。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 151
活跃值: (66)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
不错,逆向哈.!~

顶一个.
支持..
2005-3-15 10:42
0
游客
登录 | 注册 方可回帖
返回
//