- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
不好意思,之前编写的时候,由于疏忽,竟然缩小了搜索的范围,所以现在重新上传了,需要的朋友可以重新下载一下,这次我做过充分的测试了,精确度和CE一样
下面是XP下蜘蛛纸牌的范例,只是作一个功能演示,并没有其它作用
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal Classname As String, ByVal WindowName As String) 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 Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function ScanTZ Lib "mem.dll" (ByVal hProcess As Long, ByVal s As String) As Long
Private Const PROCESS_ALL_ACCESS = &H1F0FFF
Dim hwnd As Long, pid As Long, hProc As Long
Sub Main()
hwnd = FindWindow(vbNullString, "蜘蛛")
GetWindowThreadProcessId hwnd, pid
hProc = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
MsgBox Hex(ScanTZ(hProc, "1C210300")) '查找特征码
CloseHandle (hProc)
End Sub
得到了这个地址就很方便了,游戏内存是动态分配的,但是相对于一些地址的位移差是不变的
比如
第1次搜索特征码A1C4FC8B008B401C
地址定位到400000,血的地址是410000,那么她们的位移差就是10000,
第2次搜索特征码A1C4FC8B008B401C
地址定位到500000,那么血的地址就是500000+10000就是了,
举个VB例子
dim i as long,u as long 'u表示血的地址
i=ScanTZ(hProc, "A1C4FC8B008B401C")
u=i+&H10000 '这样就得到准确血的地址了
当然你要早到正确的特征码(不要问我怎么找特征码,这个去查论坛的相关贴)
'关于应用,在举个例子
'比如征途的体力什么的是按照人物的名称的Unicode来定位的
'比如人物名称"广海游戏"他的UNicode是B9E3BAA3D3CECFB7
dim i as long,u as long 'u表示血的地址,i表示内存人物名称地址
i=ScanTZ(hProc, "B9E3BAA3D3CECFB7") '假设血的地址和人物名称相差&H10000
u=i+&H10000 '这样就得到准确血的地址了
mem.dll和VB调用源代码在附件里,dll很小的,支持其它语言调用的
|
|