高分求助!急急急,内存搜索,得出的偏移量是错的!!!

ahaisoft 2005-01-23 11:56:48
Public Function searchBaseAddr(ByVal ProcessId As Long, ByVal lBeginAddr As Long) As Long
Dim sBuffer As String * 33600
Dim hProcess As Long
Dim addr As Long
Dim sLen As Long
Dim readLen As Long
Dim tLen As Long
Dim baseAddr As Long
'lBeginAddr from &H4FFA700

sLen = 33600

searchBaseAddr = 0
hProcess = OpenProcess(PROCESS_READ_WRITE_QUERY, 0, ProcessId)
If hProcess = 0 Then Exit Function

For addr = 0 To 500

baseAddr = lBeginAddr + addr * sLen
ReadProcessMemory hProcess, ByVal baseAddr, ByVal sBuffer, sLen, readLen

If readLen > 0 Then

tLen = InStr(sBuffer, MyString)
If tLen > 0 Then '找到了
searchBaseAddr = baseAddr + tLen - 1
Exit For
End If
If addr Mod 5 = 0 Then DoEvents

Next addr
CloseHandle hProcess

End Function

上面的这个function能够找到我要的字符串(通过调试输出,可以确定)。但是得出的偏移量是错的,与我在winhex中找到的偏移量不对,用VB读取此偏移量的字符证实有错。
上面的代码问题在哪?

请高手们帮忙看看!
分不够再加!
...全文
217 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahaisoft 2005-01-24
  • 打赏
  • 举报
回复
// samwzhang
谢谢了!

InstrB(1,sBuffer,MyString)解决问题。
把sbuffer和mystring全部定义成byte型数组 就行了。
aliang_2008 2005-01-23
  • 打赏
  • 举报
回复
帮你顶一下
ahaisoft 2005-01-23
  • 打赏
  • 举报
回复
不存在高低位的问题。
问题现在是解决了,用的BYTE法,不过心理总是不爽。
samwzhang 2005-01-23
  • 打赏
  • 举报
回复
还有你有没有注意高字节在后低字节在前的问题?
samwzhang 2005-01-23
  • 打赏
  • 举报
回复
InstrB(1,sBuffer,MyString)一样比的,BYTE数组其实就是Char *;所以可以参加所有字符串操作的
ahaisoft 2005-01-23
  • 打赏
  • 举报
回复
//InstrB(1,sBuffer,MyString)
这是怎么个比法,不明白。
myString是一个字符串啊。如:mystring="abc"

另外 ,string型 不会把chr(0)吞掉。

我通过把汉字长度由1变2,得出的结果还是不正确。不知道哪的问题。
samwzhang 2005-01-23
  • 打赏
  • 举报
回复
你把sBuffer定义成dim sBuffer(33600) as byte
再用InstrB(1,sBuffer,MyString)试试呢。我怕String型会把Chr(0)的长度给吞掉。
ahaisoft 2005-01-23
  • 打赏
  • 举报
回复
我知道用Byte 可是开销不起,太慢了。
用instrB无法解决问题。
samwzhang 2005-01-23
  • 打赏
  • 举报
回复
1、tlen>readLen时,找到的值也是假的;
2、一般用C语言做这个的时候都是按照BYTE型逐字比较的,没有直接用Instr这样的字符串搜索得到地址偏移量的。不过你可以用InstrB试试偏移量是否正确。
ahaisoft 2005-01-23
  • 打赏
  • 举报
回复
// 回复人: Tiger_Zhao(VB老鸟) ( ) 信誉:100 2005-01-23 16:01:00 得分: 0


// 同意 ahaisoft(我欲乘风归去) ,BStr 为一个字符两个字节,所以 tLen 应该乘 2


tLen*2 肯定也是不正确的。
有部分长度为2的字符被VB统计成1了。
Tiger_Zhao 2005-01-23
  • 打赏
  • 举报
回复
同意 ahaisoft(我欲乘风归去) ,BStr 为一个字符两个字节,所以 tLen 应该乘 2
ahaisoft 2005-01-23
  • 打赏
  • 举报
回复
//既然sBuffer用来存放的。为啥用byval呢?应该用byref吧?

传值、传址你还分不清啊。



我想我知道是什么原因了,就是不知道如何解决。
应该是instr出问题了。
mingxuan3000 2005-01-23
  • 打赏
  • 举报
回复
顶一下吧...
Summer006 2005-01-23
  • 打赏
  • 举报
回复
我觉得这里好象有个问题,看看先:
ReadProcessMemory hProcess, ByVal baseAddr, ByVal sBuffer, sLen, readLen
这一句的意思应该是在进程号为hProcess的进程内存中,从地址baseAddr开始读取长度为sLen的内容放在sBuffer中,实际读取了的长度放在sLen中。(是这样么?不是的话我就想错了。)

既然sBuffer用来存放的。为啥用byval呢?应该用byref吧?
说错了不好意思!
chuxue1342 2005-01-23
  • 打赏
  • 举报
回复
顶一下吧...
ahaisoft 2005-01-23
  • 打赏
  • 举报
回复
人气不行啊。

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧