首页
社区
课程
招聘
[讨论]VB读写内存问题
发表于: 2015-4-11 14:58 7545

[讨论]VB读写内存问题

2015-4-11 14:58
7545
今天突然想用VB往自身进程里头写点东西,编了一段代码如下:

Option Explicit
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) 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 Sub Command1_Click()
Dim hProcess As Long, pid As Long, bb1 As String
GetWindowThreadProcessId Form1.hwnd, pid
hProcess = OpenProcess(&H1F0FFF, True, pid)
MsgBox hProcess & " " & pid & " " & WriteProcessMemory(hProcess, &H401000, &HF1234512, 4, 0&) '写内存API,加个MSG检测前两部的结果
End Sub


按理说应该可以向401000写入F1234512的,可是经过检测发现401000的数据并没有被修改。

于是就用OD调试了一下程序

BP WriteProcessMemory,程序断下后的堆栈窗口:


0012F3B0   00401CD8  /CALL 到 WriteProcessMemory 来自 111.00401CD3
0012F3B4   00000334  |hProcess = 00000334 (window)
0012F3B8   0012F3F0  |Address = 12F3F0
0012F3BC   0012F3EC  |Buffer = 0012F3EC
0012F3C0   00000004  |BytesToWrite = 4
0012F3C4   0012F3E8  \pBytesWritten = 0012F3E8



Address = 12F3F0
这个地址保存的数据是:00 10 40 00
同样后面的pBytesWritten中保存的为0,buffer(0012F3EC)中是12 45 23 F1

F9运行起来之后,发现0X401000中的内存没变,但是12F3F0中的00 10 40 00变成了12 45 23 F1!

到这里我真的不知道是什么原因了,是操作系统处理错误么(虽然不太可能)。。。
之前做过一个VB的扫雷读写内存的实例,代码丢了,但是的确可以读写成功,大家帮忙看看是什么原因

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 459
活跃值: (166)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
2
OK找到原因了,API的传址方式错误。。。BASEDADDRESS应该用BYVAL传进去。
Private Declare Function WriteProcessMemory _
                Lib "kernel32" (ByVal hProcess As Long, _
                                         ByVal lpBaseAddress As Any, _
                                         ByVal lpBuffer As Any, _
                                         ByVal nSize As Long, _
                                         lpNumberOfBytesWritten As Long) As Long


这样就OK
2015-4-11 16:45
0
雪    币: 10561
活跃值: (3484)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
这个问题不是应该在vbgood里面讨论会更好吗?
2015-4-11 18:28
0
雪    币: 459
活跃值: (166)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
4
都一样
2015-4-11 20:32
0
雪    币: 10561
活跃值: (3484)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
你确定你改写自身程序的代码?按理说代码空间是不可写的。
2015-4-15 14:01
0
雪    币: 10561
活跃值: (3484)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
不要误人子弟!你这样声明是写入代码不成功的,需要如下声明:
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
因为byval传入的是地址!
2015-5-6 14:59
0
雪    币: 459
活跃值: (166)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
7
您先去编译试试。。。
2015-5-7 12:26
0
雪    币: 10561
活跃值: (3484)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
我是编译后,用od分析得出的结果,不是信口雌黄得出的结论!
在vb里面,函数里面的变量前面加byval,传的是变量的地址,而不加传的是数值。
当然在大多数情况,两者并没有区别,只是调用api的时候会有不同的效果。
2015-5-7 14:05
0
雪    币: 459
活跃值: (166)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
9
问题出在lpBaseAddress传址,至于后面lpBuffer加byval为何不行,就不追究了,这种声明方式并没有错,不是么
2015-5-7 17:59
0
雪    币: 3676
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
byref  传的是地址
2018-11-7 22:11
0
游客
登录 | 注册 方可回帖
返回
//