.NET学习:将VB6写的游戏修改器用.NET重写——专用游戏修改器通用框架编写
2007-06-07 15:31
495 查看
恩恩,好久没写了,怎么开头呢。。。。说说环境。。。VB .NET 2005 以后再说可就是.NET了。。。。
首先感谢:VirtualDesktop(^_^) 、vbman2003(家人) 两位朋友的支持,这个代码没有他们的帮助是不可能完成的,对于其他给于帮助的朋友也表示谢意~~~~~~
然后呢说说我在写啥东东:一个游戏修改器,但是可以用做很多个游戏却不能搜索内存。。呵呵。。不过可以用来制作自己的专门的游戏修改工具,还是比较爽的,内存搜索和汇编编辑以后再说,慢慢来,心急吃不了热豆腐。
这个东西呢,现在的动能来看,需要的核心就这几部分
1、进程列表获取,VB6中都是用API,可是.NET里不用了。
2、进程操作权限的提升,修改了VB6的一些API声明来实现的。
3、进程内存的读写,也是修改了一些VB6的API实现的。
4、用BYTE结构存取2进制文件内容以获取配置。
5、一些进制的转换。
要陪媳妇去了,所以这篇写最简单的一个:BYTE数组与INTEGER类型的转换。
同志们可能要说了,这个是啥,还用你写。。。呵呵。。反正我是不知道.NET里面转换的方法,另外用分字节转化的办法代码太多,也懒得写。再就是公开一下这个API的使用方法,在网上找的头大手疼也没找到。
把它帖在这里,.NET2005下测试通过。
Private Declare Sub CopyMemoryToArr Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination() As Byte, ByRef Source As Integer, ByVal Length As Integer)
Private Declare Sub CopyMemoryToDec Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Int32, ByVal Source() As Byte, ByVal Length As Integer)
嘿嘿,看着眼熟吧,实际上就是VB6里咱们可爱的CopyMemory。。。不过因为用途不同,所以出现了2个定义方式,我弄了半天,还是没能写成一种定义形式。
写成函数:
Public Function HexArr2Dec(ByVal ByteArr() As Byte) As Integer
Dim Dec As Integer
CopyMemoryToDec(Dec, ByteArr, 4)
Return Dec
End Function
Public Function Dec2HexArr(ByVal Dec As Integer) As Byte()
Dim mTmpArr(3) As Byte
CopyMemoryToArr(mTmpArr, Dec, 4)
Return mTmpArr
End Function
调用方法:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim byteArr(3) As Byte, intnum As Integer = 511
byteArr = Dec2HexArr(intnum)
Debug.Print(byteArr(0) & " " & byteArr(1) & " " & byteArr(2) & " " & byteArr(3))
MsgBox(HexArr2Dec(byteArr))
End Sub
ok了,就这些啊。。回头看看这个定义,有几个有趣的地方
CopyMemoryToArr 中 ByVal Destination() As Byte 和 ByRef Source As Integer
CopyMemoryToDec 中 ByRef Destination As Int32 和 ByVal Source() As Byte
以往VB6里面,我们(至少是我)要像RtlMoveMemory函数传递值的时候,是这样定义的
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
在.NET里这个ANY被INTPTR代替了,但是在某些操作数组的API中,例如ReadProcessMemory、WriteProcessMemory等,写成INTPTR很难成功调用,我们就可以修改定义为XXXX() As Byte。还有一个有趣的地方,API里面传递数值时,一般Byval来做,可是上面,却定义为ByRef Source As Integer和ByRef Destination As Int32。。(懒啊我,没有统一定义,INT32和INTEGER一样吧)
总结一下:
若,VB6的API声明中参数为ANY则:
1、当需要向API内传递数组的指针时,将VB6声明修改为ByVal xxxx() As Byte (必须为BYVAL)
2、当需要向API内传递一个被其操作的数据时,将VB6声明修改为ByRef Source As (Integer)
3、仅传递数据时,可声明为ByRef XXXX As IntPtr(Int32,Integer)
另举2例:
Private Declare Function ReadProcessMemory Lib "kernel32" ( _
ByVal hProcess As Integer, _
ByVal lpBaseAddress As Integer, _
ByVal lpBuffer() As Byte, _
ByVal nSize As Integer, _
ByRef lpNumberOfBytesWritten As Integer) As Integer
Private Declare Function WriteProcessMemory Lib "kernel32" ( _
ByVal hProcess As Int32, _
ByVal lpBaseAddress As Int32, _
ByVal lpBuffer() As Byte, _
ByVal nSize As Int32, _
ByRef lpNumberOfBytesWritten As Int32) As Integer
以上2声明在VS.NET 2005环境测试通过。其中Int32和Integer可互相替换。
下一篇,说一下关于.NET中向API传递结构的问题,公开LookupPrivilegeValue、AdjustTokenPrivileges、OpenProcessToken的使用,即如何提升本进程的进程操作权限,示例为全部权限。
首先感谢:VirtualDesktop(^_^) 、vbman2003(家人) 两位朋友的支持,这个代码没有他们的帮助是不可能完成的,对于其他给于帮助的朋友也表示谢意~~~~~~
然后呢说说我在写啥东东:一个游戏修改器,但是可以用做很多个游戏却不能搜索内存。。呵呵。。不过可以用来制作自己的专门的游戏修改工具,还是比较爽的,内存搜索和汇编编辑以后再说,慢慢来,心急吃不了热豆腐。
这个东西呢,现在的动能来看,需要的核心就这几部分
1、进程列表获取,VB6中都是用API,可是.NET里不用了。
2、进程操作权限的提升,修改了VB6的一些API声明来实现的。
3、进程内存的读写,也是修改了一些VB6的API实现的。
4、用BYTE结构存取2进制文件内容以获取配置。
5、一些进制的转换。
要陪媳妇去了,所以这篇写最简单的一个:BYTE数组与INTEGER类型的转换。
同志们可能要说了,这个是啥,还用你写。。。呵呵。。反正我是不知道.NET里面转换的方法,另外用分字节转化的办法代码太多,也懒得写。再就是公开一下这个API的使用方法,在网上找的头大手疼也没找到。
把它帖在这里,.NET2005下测试通过。
Private Declare Sub CopyMemoryToArr Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination() As Byte, ByRef Source As Integer, ByVal Length As Integer)
Private Declare Sub CopyMemoryToDec Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Int32, ByVal Source() As Byte, ByVal Length As Integer)
嘿嘿,看着眼熟吧,实际上就是VB6里咱们可爱的CopyMemory。。。不过因为用途不同,所以出现了2个定义方式,我弄了半天,还是没能写成一种定义形式。
写成函数:
Public Function HexArr2Dec(ByVal ByteArr() As Byte) As Integer
Dim Dec As Integer
CopyMemoryToDec(Dec, ByteArr, 4)
Return Dec
End Function
Public Function Dec2HexArr(ByVal Dec As Integer) As Byte()
Dim mTmpArr(3) As Byte
CopyMemoryToArr(mTmpArr, Dec, 4)
Return mTmpArr
End Function
调用方法:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim byteArr(3) As Byte, intnum As Integer = 511
byteArr = Dec2HexArr(intnum)
Debug.Print(byteArr(0) & " " & byteArr(1) & " " & byteArr(2) & " " & byteArr(3))
MsgBox(HexArr2Dec(byteArr))
End Sub
ok了,就这些啊。。回头看看这个定义,有几个有趣的地方
CopyMemoryToArr 中 ByVal Destination() As Byte 和 ByRef Source As Integer
CopyMemoryToDec 中 ByRef Destination As Int32 和 ByVal Source() As Byte
以往VB6里面,我们(至少是我)要像RtlMoveMemory函数传递值的时候,是这样定义的
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
在.NET里这个ANY被INTPTR代替了,但是在某些操作数组的API中,例如ReadProcessMemory、WriteProcessMemory等,写成INTPTR很难成功调用,我们就可以修改定义为XXXX() As Byte。还有一个有趣的地方,API里面传递数值时,一般Byval来做,可是上面,却定义为ByRef Source As Integer和ByRef Destination As Int32。。(懒啊我,没有统一定义,INT32和INTEGER一样吧)
总结一下:
若,VB6的API声明中参数为ANY则:
1、当需要向API内传递数组的指针时,将VB6声明修改为ByVal xxxx() As Byte (必须为BYVAL)
2、当需要向API内传递一个被其操作的数据时,将VB6声明修改为ByRef Source As (Integer)
3、仅传递数据时,可声明为ByRef XXXX As IntPtr(Int32,Integer)
另举2例:
Private Declare Function ReadProcessMemory Lib "kernel32" ( _
ByVal hProcess As Integer, _
ByVal lpBaseAddress As Integer, _
ByVal lpBuffer() As Byte, _
ByVal nSize As Integer, _
ByRef lpNumberOfBytesWritten As Integer) As Integer
Private Declare Function WriteProcessMemory Lib "kernel32" ( _
ByVal hProcess As Int32, _
ByVal lpBaseAddress As Int32, _
ByVal lpBuffer() As Byte, _
ByVal nSize As Int32, _
ByRef lpNumberOfBytesWritten As Int32) As Integer
以上2声明在VS.NET 2005环境测试通过。其中Int32和Integer可互相替换。
下一篇,说一下关于.NET中向API传递结构的问题,公开LookupPrivilegeValue、AdjustTokenPrivileges、OpenProcessToken的使用,即如何提升本进程的进程操作权限,示例为全部权限。
相关文章推荐
- .NET学习:将VB6写的游戏修改器用.NET重写——专用游戏修改器通用框架编写(3)
- .NET学习:将VB6写的游戏修改器用.NET重写——专用游戏修改器通用框架
- 发布新版本,以后专用游戏修改器通用框架不做了。
- 发布一个专用游戏修改器的通用框架
- 测试:专用游戏修改器通用框架更新配置贴
- 从零开始编写自己的C#框架——框架学习补充说明
- .Net 初步学习笔记之一——.Net 平台与.Net FrameWork框架的关系
- SpringMVC框架的学习及入门案例编写
- 企业通用开发框架学习
- .net学习框架
- Python学习 - 编写一个简单的web框架(二)
- strut2 学习之验证框架二编写验证规则
- 跟着BOY学习开发cocos2d-x 游戏 实战篇(2)之 欢迎 界面编写
- 用MASM32编写通用游戏改器流程-转贴
- 小羊驼和你一起学习cocos2d-x与lua之五(lua编写cocos2d-x游戏)
- 一起谈.NET技术,ASP.NET MVC验证框架中关于属性标记的通用扩展方法
- 学习笔记:银江数据源在.net下的使用方法(marshal类在框架下调用非框架dll中的使用)
- Visual C#编写3D游戏框架示例(转)
- ElasticSearch学习(6)-- 在SSM框架中编写ES的增删改查方法
- 用 MASM32 编写通用游戏改器流程