修改器的制作

一个问题:制作修改器需要懂得哪些方面的知识?
请列清楚,详细点,分不会少你的.
先说说制作简单修改器吧
最新回答
真心可是半斤ぴ

2024-10-30 08:02:56

vb制作简单游戏修改器
工具:SoftICE、金山游侠V(fpe2000也可)、vb6.0
测试平台:WindowXP Professional

所需知识:
1、SoftICE、金山游侠V(fpe2000)的使用方法
2、 汇编基础
3、 vb简单编程
开始:
1、运行SoftICE、金山游侠V(fpe2000)。
2、运行要修改的游戏,在此以红色警戒2为例。
3、在游戏中按“*”号键呼出金山游侠查找金钱,查找2-3次会找到地址0AAB8C6C(此地址是动态的,每次查出的可能不一样),记下此地址,回到游戏,按“Ctrl+D”键呼出SoftICE,输入“bpm 0AAB8C6C w”回车(拦截写入地址0AAB8C6C的指令),再按“Ctrl+D”回到游戏,建造一个建筑,SoftICE的窗口会弹出,按Ctrl+方向上键可看到以下代码:
001B:004E4B85 JLE 004E4BB1
001B:004E4B87 JMP 004E4B18
001B:004E4B89 SUB EAX,EDI //此行为关键
001B:004E4B8B MOV [ESP+24],EDI
001B:004E4B8F MOV [EBX+0000024C],EAX //此行即为写入金钱地址0AAB8C6C的指令
001B:004E4B95 JMP 004E4BE3 //此行高亮显示
你可以不知道以上代码的意义,只要注意高亮显示那一行上边的SUB XXX,XXX指令即可,那一行即是将金钱减少的指令,我们只要让其不执行金就不会减少了,到了这里,大家应该知道怎么做了吧,最简单的方法就是将SUB XXX,XXX改为NOP(空操作,俗称"90大法"),如果觉得不过隐,还可以将其改为ADD XXX,XXX,那么每造一样东西,金钱就会增加所造东西的价格。我们可以在SoftICE里打入:
A 001B:004E4B89 回车
NOP 回车
NOP 回车
回车
或:
A 001B:004E4B89 回车
ADD EAX,EDI 回车
回车
再打入
D 001B:004E4B89 回车
记下数据栏中001B:004E4B89和001B:004E4B8A两个字节的数值备用(如果用NOP指令数据为90 90,如果为ADD指令,数据为03 C7,指令视具体游戏而定)。
4、制作修改器:
打开vb6.0新建一工程,在窗体上加一按钮command1,写入以下代码:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal _
lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal _
hwnd As Long, lpdwProcessId As Long) As Long

Private Declare Function OpenProcess Lib "kernel32" (ByVal _
dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal _
hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long

Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal _
hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal _
nSize As Long, lpNumberOfBytesWritten As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal _
hObject As Long) As Long

Private Const PROCESS_ALL_ACCESS = &H1F0FFF
Dim hh As Long
Dim pp As Long
Dim pp2 As Long

Private Sub Command1_Click()
dim str as string
str="red alert 2" '此为游戏窗体名称,视游戏的不同而改变
hh = FindWindow(vbNullString, str)
If hh <> 0 Then
GetWindowThreadProcessId hh, pp
pp2 = OpenProcess(PROCESS_ALL_ACCESS, False, pp)
If pp2 <> 0 Then
WriteProcessMemory pp2, &H4E4B89, &H90, 1, 0 '如果为ADD指令则为WriteProcessMemory pp2, &H4E4B89, &H03, 1, 0
WriteProcessMemory pp2, &H4E4B8A, &H90, 1, 0 '如果为ADD指令则为WriteProcessMemory pp2, &H4E4B8A, &H27, 1, 0

CloseHandle (pp2)
Else
MsgBox "打开进程失败", , "红警修改器"
End If
Else
MsgBox "请先运行红色警戒2", , "红警修改器"
End If
End Sub

编译后,每次使用时先运行红色警戒2,再切换到windows运行编译的程序即可修改金钱。程序代码中的WriteProcessMemory pp2, &H4E4B89, &H90, 1, 0里的&H4E4B89即为上面提到的关键代码的地址,&H90为刚才记下的备用数据,根据游戏不同而变化,由于SUB EAX,EDI是2字节指令所以在地址&H4E4B8A也写入90(SUB XXX,XXX指令的字节数可用SUB指令的下一指令的地址减SUB指令的地址得到,即004E4B8B-004E4B89),很多游戏都可以用上面的方法找到关键代码SUB XXX,XXX做修改器,此方法即简单又不需太多的知识应该可以轻易做到。