tao1224 2006-12-23 14:38
有关内存问题请教^^
目前小弟想制作完美世界国际版的辅助程序,
但一开始就遇到内存搜索的问题,
(因为完美世界每次登入时,内存都会不一样,所以要先制作一个搜索HP内存的功能)
目前可以搜索到一些数值(Long),但都不是正确的HP内存,
(可用其他工具(gm8)先搜索出正确的内存,再比对其中,看是不是有在List1中)
所以想在这请教高手们,要如何改,才能搜索到正确的内存值,
等到可以搜索到正确的内存,再来就简单多了...请大家帮帮忙^^
程序码在附件中.请大家多多指导^^
Nothing 2006-12-23 21:09
没有三研究过完美世界,不过你的方法都是一些修改内存的程序常用的方法,因为Windows系统给每个系统都是一个虚拟机,所以,你需要先得到启动程序的地址,然后再得到里面的程序在地址。
我看你的程序,是先找程序的时候出错了,你可以试试hwnd = FindWindow(vbNullString, Text1.Text),看看这个hwnd与GM8的是否一致。
tao1224 2006-12-24 09:29
[color=black][size=12px][size=9pt][size=9pt]感谢您帮我看程序[/size][size=9pt]...[/size][size=9pt]谢谢您[/size][size=9pt]^^[/size][/size][/size]
[b][font=新細明體][size=9pt]我有找过[/size][/font]"用VB制作带搜索功能的游戏修改器"[font=新細明體]教学文章[/font][/b][/color]
[b][color=black][font=新細明體][size=9pt]经测试后[/size][/font][b][font=Verdana][size=9pt]..[/size][/font][/b][b][font=新細明體][size=9pt]结果也是错的[/size][/font][/b][/color][/b]
[b][color=black][font=新細明體][size=9pt]本篇如果可以测试通过[/size][/font][b][font=Verdana][size=9pt].[/size][/font][/b][b][font=新細明體][size=9pt]正好也可以让有心想学好[/size][/font][/b][b][font=Verdana][size=9pt]vb[/size][/font][/b][b][font=新細明體][size=9pt]的人[/size][/font][/b][/color][/b]
[b][color=black][font=新細明體][size=9pt]多了一篇实用文章[/size][/font][b][font=Verdana][size=9pt]...[/size][/font][/b][/color][/b]
[size=12px][/size]
[font=新細明體]可以再看看后面的问题吗[/font][size=9pt][font=Verdana]..QQ[/font][/size]
[size=9pt][font=Verdana][/font][/size]
[size=12px][font=新細明體][size=9pt]经测试后[/size][/font][font=Verdana][size=9pt].hwnd[/size][/font][font=新細明體][size=9pt]没问题[/size][/font][font=Verdana][size=9pt]...[/size][/font][font=新細明體][size=9pt]加上一句判断式就可以了[/size][/font][font=Verdana][size=9pt][/size][/font]
[/size]
[size=12px]hwnd = FindWindow(vbNullString, Text1.Text) ' [color=blue]完美世界窗口名"Element Client[/color]"
[color=red]If Text1.Text = "" Then hwnd = 0[/color]
If hwnd = 0 Then
MsgBox "找不到窗口"
Exit Sub
End If[/size]
[size=12px][/size]
[size=12px][font=新細明體][size=9pt][color=blue]感觉是[font=新細明體][size=9pt][color=blue]以下[/color][/size][/font]这段搜索[font=Verdana]条件[/font]出问题了[/color][/size][/font][/size]
[size=12px]我不知要如何用Long去比对4个Byte
(byte只要比对一个Byte,Integer和Long分别要比对2和4个Byte..)
[/size]
[size=12px][/size]
[size=12px]Dim data() As [color=red]Long[/color], i As Long, j As Long, k As Long
Dim finded As Long, fio As [color=red]Long
[/color]fio = [color=red]CLng[/color](Text2.Text)
For i = 0 To PageNum - 1
ReDim data(1 To PageSize(i))
ReadProcessMemory hProcess, ByVal BassAddr(i), data(1), PageSize(i), ByVal 0&
For j = 1 To PageSize(i)
If data(j) = fio Then
'List1.AddItem BassAddr(i) + j - 1 [color=black]'[size=12pt][size=12pt]10[/size][font=新細明體][size=12pt]进制[/size][/font][/size][/color][/size]
[size=12px][color=black][size=12pt][/size][/color] List1.AddItem Right("00000000" & Hex(BassAddr(i) + j - 1), 8) '[size=12pt]16[/size][font=新細明體][size=12pt]进制[/size][/font][/size]
[size=12px] DoEvents
finded = finded + 1
End If
Next[/size]
[size=12px]Next
Next[/size]
[size=12px][/size]
[size=12px][/size]
[size=12px][color=blue][font=新細明體][size=9pt]原本的程序是比对[/size][/font][font=Verdana][size=9pt]Byte[/size][/font][/color][/size]
[size=12px][color=blue][font=Verdana][size=9pt]([/size][/font][font=新細明體][size=9pt]开启一[/size][/font][font=Verdana][size=9pt]wordpad,[/size][/font][font=新細明體][size=9pt]再用本程序与[/size][/font][font=Verdana][size=9pt]gm8[/size][/font][font=新細明體][size=9pt]所搜索出的值是一样的[/size][/font][font=Verdana][size=9pt])[/size][/font][/color][/size]
[size=12px][/size]
[size=12px]Dim data() As [color=red]Byte,[/color] i As Long, j As Long, k As Long
Dim finded As Long, fio As [color=red]Byte
[/color]fio = [color=red]CByte[/color](Text2.Text)
For i = 0 To PageNum - 1
ReDim data(1 To PageSize(i))
ReadProcessMemory hProcess, ByVal BassAddr(i), data(1), PageSize(i), ByVal 0&
For j = 1 To PageSize(i)
If data(j) = fio Then
'List1.AddItem BassAddr(i) + j - 1 [color=#000000]'[/color][size=12pt][size=12pt]10[/size][font=新細明體][size=12pt]进制[/size][/font][/size][/size]
[size=12px][size=12pt][/size] List1.AddItem Right("00000000" & Hex(BassAddr(i) + j - 1), 8) '[size=12pt]16[/size][font=新細明體][size=12pt]进制[/size][/font][/size]
[size=12px] DoEvents
finded = finded + 1
End If
Next
Next
Next[/size]
[[i] 本帖最后由 tao1224 于 2006-12-24 09:44 编辑 [/i]]
Nothing 2006-12-24 20:15
有可能是完美世界进行了一些加密处理,如果是GM8能搜索正确,可能是算法的问题,一般类似的程序很少用VB开发的,因为VB对低层操作能力并不强。
你可以先用GM8读取地址,然后用VB程序也读那个地址,看看出来的值是否一样。
还有可能是数据的字符数不一样,这一点要注意。
netice 2006-12-24 22:05
:lol :lol :lol
不错也。。我也正打算用VB做游戏修改器呢。。西西
楼主,有问题还要向你请教啊。。