vb制作简单游戏修改器
中国SOHO特区网(http://www.sohozones.com)会员来稿
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做修改器,此方法即简单又不需太多的知识应该可以轻易做到。 如有疑问可以与我联系:zcxlhx@km169.net QQ:37988815 撰稿人:云南省楚雄州禄丰县医保中心 素还真 邮编:651200
|
|