现在的位置: 首页 > 综合 > 正文

.NET学习:将VB6写的游戏修改器用.NET重写——专用游戏修改器通用框架编写

2013年10月11日 ⁄ 综合 ⁄ 共 2783字 ⁄ 字号 评论关闭

恩恩,好久没写了,怎么开头呢。。。。说说环境。。。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的使用,即如何提升本进程的进程操作权限,示例为全部权限。

抱歉!评论已关闭.