当前位置:编程学习 > VB >>

[求助]急求高手来 问题烦了一个多月(100点数)




从上图可见,Writeprocessmemory & Readprocessmemory也是用Byte数组读的

我希望有人可以帮助我解决写入是byte的问题,及读取也是byte数组的问题

我问过很多人也解决不了,希望有人可以解答我,由于小弟VB是新手

可否帮我改改? 小弟一定感激不尽

这是我的VB : http://u.115.com/file/t07c7d402f --------------------编程问答-------------------- http://u.115.com/file/t07c7d402f --------------------编程问答-------------------- 跟着JHONE99顶了 --------------------编程问答-------------------- 你更改的是内存数据吧,一般内存中存储的都是数值型的数据,也许访问内存必须是BYTE,可能是根据栈内的每个存储器单元最高存储能力设计的吧。 --------------------编程问答--------------------
引用 3 楼 xslslx 的回复:
你更改的是内存数据吧,一般内存中存储的都是数值型的数据,也许访问内存必须是BYTE,可能是根据栈内的每个存储器单元最高存储能力设计的吧。
那有没有方法解决这个问题呢? --------------------编程问答-------------------- upupupupupupupupupupupupupupupupupup --------------------编程问答-------------------- 惭愧,没看明白楼主的问题是啥,你的程序好像是能正确读取那4个字节的值000307FC吧,那你要问的问题是什么呢? --------------------编程问答-------------------- 抓取内存数据一般好像只能是BYTE类型的吧,内存能直接处理汉字或者字符吗????? --------------------编程问答-------------------- 在 Byte 数组和字符串之间做转换就可以了
'如果对方内存中是 Unicode 字符串
Dim aBytes() As Byte
Dim s As String

'ReadProcessMemory 之后
s = aBytes

'WriteProcessMemory 之前
aBytes = s

'如果对方内存中是 ASCII/DBCS 字符串
Dim aBytes() As Byte
Dim s As String

'ReadProcessMemory 之后
s = StrConv(aBytes, vbUnicode)

'WriteProcessMemory 之前
aBytes = StrConv(s, vbFromUnicode)
--------------------编程问答-------------------- 回复 Tiger_Zhao #8
我用了这方法后还是不行啊!
大大能够下载我的VB作测试吗? --------------------编程问答-------------------- --------------------编程问答-------------------- 顶上去... --------------------编程问答-------------------- 求教 幫忙頂頂............. --------------------编程问答-------------------- 帮忙顶……可以找老马帮忙…… --------------------编程问答-------------------- 读取内存中的值,首先确定基址,及偏移量,
至于你想写入某个进程中的某块地址:
1.此地址在写入时必须时静止的,即:不在CPU的调度中
2.得到基址,将插入内存中 --------------------编程问答-------------------- 回复m60a1 #14
不是这个问题! 急求高人帮助! --------------------编程问答-------------------- 这问题我问过很多高手,总是失败回头,希望在这的高手可给我一个答案! --------------------编程问答-------------------- 首先要搞清楚exe的格式。&H307FC在VB中应该加上基址&H400000,即实际地址是&H4307FC。其次要搞清楚该地址是否可写。如果是exe的代码区域,则是不能写入的,需要用api将该section设置为可写,写入后再设置为只读;如果是临时空间,则可以随意写入。 --------------------编程问答--------------------
引用 17 楼 lzqgj 的回复:
首先要搞清楚exe的格式。&H307FC在VB中应该加上基址&H400000,即实际地址是&H4307FC。其次要搞清楚该地址是否可写。如果是exe的代码区域,则是不能写入的,需要用api将该section设置为可写,写入后再设置为只读;如果是临时空间,则可以随意写入。

请各位可否下载我的VB测试? 我图的意思是表达可以写入的,但是写入的数值却是用Byte写入
就像我写入200,他转了3145778 --------------------编程问答-------------------- 看看你的代码,tmp 数组的大小只有 nSize,参数中的地址 VarPtr(tmp(0)) + nSize 什么意思。
更不要说 VarPtr() 的结果可能返回负值。
Public Function ReadProcessMemory(hProcess As Long, lpBaseAddress As Long, lpBuffer() As Byte, nSize As Long) As Boolean
    Dim tmp() As Byte
    ...
    ReDim tmp(nSize - 1)
    ...
    ret = m_DriverLoader.IoControl(ctlCode, VarPtr(udtInput), LenB(udtInput), VarPtr(tmp(0)) + nSize, 4)
End Function
--------------------编程问答--------------------
引用 19 楼 tiger_zhao 的回复:
看看你的代码,tmp 数组的大小只有 nSize,参数中的地址 VarPtr(tmp(0)) + nSize 什么意思。
更不要说 VarPtr() 的结果可能返回负值。

VB code
Public Function ReadProcessMemory(hProcess As Long, lpBaseAddress As Long, lpBuffer() As Byte, nSize ……

那大大我应该怎做呢? --------------------编程问答-------------------- 我把楼主的写入代码小改了一下 ,加了一个函数,楼主自己对比吧。你的错误就是把"200"这个字符串给传入了。'2'的16进制是32,'0'的16进制是30,由于vb中都用的是unicode,因此你实际传入的4字节数组为32 00 30 00,由于是小字节序的,实际的16进制数据应该是300032[16]=3145778[10]。

Private Sub cmdWrite_Click()
    Dim pid As Long, hProc As Long
    
    pid = getProcessId(txtExeName)
    labPid.Caption = "进程编号:" & pid
    hProc = OpenProcess(pid)
    labHProc.Caption = "进程句柄:" & hProc
    
    Dim lData As Long, ret As Boolean
    lData = CLng(Val(txtWrite.Text))
    
    ret = WriteProcessMemory4Long(hProc, CLng(Val(txtAddr)), lData, LenB(lData))
    MsgBox ret
    CloseHandle pid
    CloseHandle hProc
End Sub


Public Function WriteProcessMemory4Long(ByVal hProcess As Long, _
                                    ByVal lpBaseAddress As Long, _
                                    ByRef lpData As Long, _
                                    nSize As Long) As Boolean
    WriteProcessMemory4Long = False
    If m_DriverLoader.isInvalide = False Then Exit Function
    If hProcess <= 0 Then Exit Function
    Dim ctlCode As Long, ret As Long, tmp() As Byte, tmpAddr As Long
    Dim udtInput As MEMINFO
    

    udtInput.hProcess = hProcess
    udtInput.inputAddr = VarPtr(lpData)
    udtInput.lpBaseAddress = lpBaseAddress
    udtInput.nSize = nSize
    
    ctlCode = m_DriverLoader.CTL_CODE(FILE_DEVICE_UNKNOWN, &H808, METHOD_BUFFERED, FILE_ANY_ACCESS)
    ret = m_DriverLoader.IoControl(ctlCode, VarPtr(udtInput), LenB(udtInput), 0, 4)
    If ret > 0 Then
        WriteProcessMemory4Long = True
    End If
End Function
--------------------编程问答--------------------
引用 21 楼 yunyu97 的回复:
我把楼主的写入代码小改了一下 ,加了一个函数,楼主自己对比吧。你的错误就是把"200"这个字符串给传入了。'2'的16进制是32,'0'的16进制是30,由于vb中都用的是unicode,因此你实际传入的4字节数组为32 00 30 00,由于是小字节序的,实际的16进制数据应该是300032[16]=3145778[10]。

VB code

Private Sub cmdWrite_……

成功了!万分感激大大的帮助! --------------------编程问答-------------------- 没明白到底是什么问题.

内存中本来就是字节存放,何来问题? --------------------编程问答-------------------- 出于保护机制、对外部进程是不能进行操作、要先注入目标进程才可以进行读写的操作吧?
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,