[求助]如何获取进程的基址
;这个程序中有不少程序细节的技巧,要认真体会有注释的地方opt("MouseClickDelay", 0);设置鼠标移动及点击延时为0
opt("MouseClickDownDelay", 0)
opt('MouseCoordMode', 0);设置用于鼠标函数的坐标参照
$i_pid = Run('winmine.exe')
ProcessWait($i_pid)
$v_Open = _MemOpen($i_pid)
;Width0x1005334
;$i_Width = _MemRead($v_Open, 0x1005334, "Byte") ;注释部分是到内存中取值的做法,不过在注册表中有一份,所以两种方法都可以
$i_Width = RegRead('HKEY_CURRENT_USER\Software\Microsoft\winmine', 'Width')
;Height 0x1005338
;$i_Height = _MemRead($v_Open, 0x1005338, "Byte") ;注释部分是到内存中取值的做法,不过在注册表中有一份,所以两种方法都可以
$i_Height = RegRead('HKEY_CURRENT_USER\Software\Microsoft\winmine', 'Height')
;Number 0x1005330
;$i_NonMines = _MemRead($v_Open, 0x1005330, "Short")
;$i_NonMines = $i_Width * $i_Height - $i_NonMines ;注释部分是到内存中取值的做法,不过在注册表中有一份,所以两种方法都可以
$i_NonMines = $i_Width * $i_Height - RegRead('HKEY_CURRENT_USER\Software\Microsoft\winmine', 'Mines')
Dim $i_Array = 0;非雷数
Dim $ai_Loc[$i_NonMines];用于存放非雷的坐标
For $y = 0 To $i_Height - 1
For $x = 0 To $i_Width - 1
;mine 0x1005340 + 32 * y + x
$Mine = _MemRead($v_Open, 0x1005340 + 32 * ($y + 1) + ($x + 1), "Byte")
If $Mine = -113 Then ;8F
ConsoleWrite("X ")
ContinueLoop
Else
ConsoleWrite("O ")
$ai_Loc[$i_Array] = 23 + $x * 16
$ai_Loc[$i_Array] = 112 + $y * 16
$i_Array += 1
EndIf
Next;~
ConsoleWrite(@LF)
Next ;获取非雷的坐标完毕
_MemClose($v_Open)
$v_Open = UBound($ai_Loc) - 1
opt('WinTitleMatchMode', 4);更改窗口函数在执行搜索操作时的标题匹配模式。
For $i = 0 To $v_Open
MouseClick('left', $ai_Loc[$i], $ai_Loc[$i], 1, 0)
If StringInStr(WinGetText('active'), '确定') Then ExitLoop;如果过关要留记录说明雷扫完了,这个窗口不一定弹出来
Next;扫雷主程序结束
Func _MemOpen($i_Pid, $i_Access = 0x1F0FFF, $i_Inherit = 0)
Local $av_Return =
Local $ai_Handle = DllCall($av_Return, 'int', 'OpenProcess', 'int', $i_Access, 'int', $i_Inherit, 'int', $i_Pid)
If @error Then
DllClose($av_Return)
SetError(1)
Return 0
EndIf
$av_Return = $ai_Handle
Return $av_Return
EndFunc;==>_MemOpen
Func _MemClose($ah_Mem)
Local $av_Ret = DllCall($ah_Mem, 'int', 'CloseHandle', 'int', $ah_Mem)
DllClose($ah_Mem)
Return $av_Ret
EndFunc;==>_MemClose
Func _MemRead( $ah_Mem, $i_Address, $s_Type = '' )
If $s_Type = '' Then
Local $v_Return = ''
Local $v_Struct = DllStructCreate('byte')
Local $v_Ret
While 1
DllCall($ah_Mem, 'int', 'ReadProcessMemory', 'int', $ah_Mem, 'int', $i_Address, 'ptr', DllStructGetPtr($v_Struct), 'int', 1, 'int', '')
$v_Ret = DllStructGetData($v_Struct, 1)
If $v_Ret = 0 Then ExitLoop
$v_Return &= Chr($v_Ret)
$i_Address += 1
WEnd
Else
Local $v_Struct = DllStructCreate($s_Type)
DllCall($ah_Mem, 'int', 'ReadProcessMemory', 'int', $ah_Mem, 'int', $i_Address, 'ptr', DllStructGetPtr($v_Struct), 'int', _SizeOf($s_Type), 'int', '')
Local $v_Return = DllStructGetData($v_Struct, 1, 1)
EndIf
Return $v_Return
EndFunc;==>_MemRead
Func _SizeOf( $s_Type )
Local $v_Struct = DllStructCreate($s_Type), $i_Size = DllStructGetSize($v_Struct)
If @error Then
SetError(1)
Return 0
EndIf
$v_Struct = 0
Return $i_Size
EndFunc;==>_SizeOf以上是从源码区找来的扫雷外挂的代码,想知道其中的内存基址(0x1005334)是如何获取到的。
主要是想根据QQ的PID获取所对应的QQ号码,纯属娱乐加挑战而已,对HACK不感冒。谢谢。
[ 本帖最后由 pusofalse 于 2009-2-26 20:44 编辑 ] - - 用ce搜...我这里qq2009 0x07A0D9B6
ce的全名: Cheat Engine
多找几次...选稳定的地址下手
回复 2# rolaka 的帖子
OK, 问题已经解决,我也是用ce搜的,我用的是QQ2008,基址是0x010DE43C。麻烦诸位测试一下,谢谢。$QQ = ProcessExists("QQ.exe")
If not $QQ then Exit
$hQQ = DllCall("kernel32.dll", "hwnd", "OpenProcess", _
"dword", 2035711, "int", 0, "int", $QQ)
$Buffer = DllStructCreate("char")
$baseAddr = 0x010DE43C
While 1
$err = DllCall("kernel32.dll", "int", "ReadProcessMemory", _
"hwnd", $hQQ, _
"ptr", $baseAddr, _
"ptr", DllStructGetPtr($buffer), _
"dword", DllStructGetSize($buffer), _
"dword", 0)
If StringInStr(DllStructGetData($buffer, 1), "@qq") then
$QQUin = DllStructGetData($buffer, 1)
$QQUin = StringRegExp($QQUin, "(.*)@", 3)
msgBox(0, $QQ, $QQUin)
ExitLoop
EndIf
$baseAddr += 1
WEnd 测试无法获取............ 关注中:face (33): 原帖由 pusofalse 于 26-2-2009 22:16 发表 http://www.autoitx.com/images/common/back.gif
OK, 问题已经解决,我也是用ce搜的,我用的是QQ2008,基址是0x010DE43C。麻烦诸位测试一下,谢谢。
$QQ = ProcessExists("QQ.exe")
If not $QQ then Exit
$hQQ = DllCall("kernel32.dll", "hwnd", "OpenPr ...
话说你真的知道什么叫做 基址 ? 学习一下。
页:
[1]