1个回答
展开全部
这个东西呢,现在的动能来看,需要的核心就这几部分
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可互相替换。
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可互相替换。
AiPPT
2024-09-19 广告
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图...
点击进入详情页
本回答由AiPPT提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询