CE(cheat engine)找内存,怎样找出字符,用于非标控件读取
本帖最后由 449199199 于 2018-3-17 19:49 编辑目前在AU3中对许多非标控件没有抓取或修改的办法,想用CE查找到控件所在的内存地址,然后读取或修改该地址,
但是拿了一个微信电脑登录窗口验证了一下,发现最后找到的地址有点多,而且数值都是浮点,并非字符串,
不知道该如何继续下去,求各路汇编大神解答。
如图:
在CE贴吧也发了个问题帖子:
https://tieba.baidu.com/p/5601319227?pid=118702067628&cid=0&red_tag=2952636529#118702067628 方法不对.
既然是字符串, 读和写应该以数组方式.
"byte' 回复 2# Alam
不是很理解,可否示例一下?
我是在CE通过变化与不变化最终定位到此,不知道如何把这个内存的值解析出来。 数字 3 在内存表示为 33 ,英文和数字均占 1字节,汉字通常2个.
写前,文字要转化为对应二进制;读后,也是要将二进制转为文字 虽然不懂楼上说的,但是ce显示红色的,基本不是你要找的,你看看ce的用法,里面讲绿色的可能性比较大~ 本帖最后由 449199199 于 2018-3-21 12:03 编辑
回复 4# Alam
先创建一个简单的Edit程序:
再用内存读取来读:
好像找出了基址,但是就是用疯子的方法读不出来。。。拜托各位帮忙顶一下
搞了一晚上,从CE各种方法找字符,查资料,再到把内存读取的Dll AU3研究,DLL数据格式验证,Edit变动的最终能读出来,但是是数字,BUTTON的文字读不出来。
算是模糊搜索的范例
Global $TItle="我的 GUI",$str='我是头 要找的数据 我是尾'
GUICreate("读取内存",400,200,default,default,default)
$Button1 = GUICtrlCreateButton("读 取", 312, 150, 75, 40)
$Button2 = GUICtrlCreateLabel($str, 5, 5, 370, 30)
$Button3 = GUICtrlCreateLabel("2", 5, 35, 370, 30)
GUISetState(@SW_SHOW)
While 1
Switch GUIGetMsg()
Case -3
ExitLoop
Case $Button1
_test()
EndSwitch
WEnd
Func _test()
$Handle=_MemoryOpen(@AutoItPID)
If Not IsArray($Handle) Then
Return MsgBox(16, '', '读取进程出错')
EndIf
Local $Addr, $sHex, $iSecq, $iLen, $i = 0
Local $sMatch1 = StringToBinary('我是头')
$sMatch1 = StringTrimLeft($sMatch1, 2) ;删除开头的 "0x"
Local $sMatch2 = StringToBinary('我是尾')
$sMatch2 = StringTrimLeft($sMatch2, 2) ;删除开头的 "0x"
;CE D2 CA C7 CD B7 20 D2 AA D5 D2 B5 C4 CA FD BE DD 20 CE D2 CA C7 CE B2
Local $sMatch = $sMatch1 & '\w{10,40}' & $sMatch2
ConsoleWrite( $sMatch & @CRLF)
$Addr = 0x40000 ;程序 通常的 起始地址
While 1 ;地址顺序,搜索内存数据
If $Addr > 0x10000000 Then ExitLoop ; 设定的搜索最大地址.
$sHex=_MemoryRead($Addr,$Handle,'byte') ; 5000 比 4500 大,保证读取时,不会截断搜索的数据
IfStringRegExp($sHex, $sMatch) Then
$iSecq = StringInStr($sHex, $sMatch1)
If $iSecq > 0 Then
$Addr = $Addr+Round($iSecq/2)-2 ;读内存中数据, 1 byte = 2个数字组成的数据
ConsoleWrite('地址已找到: ' &Hex($Addr, 8) & @CRLF)
$iLen = BinaryLen(StringToBinary($str))
$str =_MemoryRead($Addr, $Handle, 'char[' & $iLen & ']')
$sHex = _MemoryRead($Addr, $Handle, 'byte[' & $iLen & ']')
MsgBox(0, '数据找到' , '直接读取文字 : ' & $str & @CRLF & '读取后转化的文字: ' & BinaryToString($sHex))
Return
EndIf
EndIf
$Addr += 4500
$i+=1
GUICtrlSetData($Button3,$i& @TAB & Hex($Addr, 8))
WEnd
EndFunc
Func _MemoryOpen($iv_Pid, $iv_DesiredAccess = 0x1F0FFF, $if_InheritHandle = 1)
If Not ProcessExists($iv_Pid) Then
SetError(1)
Return 0
EndIf
Local $ah_Handle =
If @error Then
SetError(2)
Return 0
EndIf
Local $av_OpenProcess = DllCall($ah_Handle, 'int', 'OpenProcess', 'int', $iv_DesiredAccess, 'int', $if_InheritHandle, 'int', $iv_Pid)
If @error Then
DllClose($ah_Handle)
SetError(3)
Return 0
EndIf
$ah_Handle = $av_OpenProcess
Return $ah_Handle
EndFunc ;==>_MemoryOpen
Func _MemoryRead($iv_Address, $ah_Handle, $sv_Type = 'dword')
If Not IsArray($ah_Handle) Then
SetError(1)
Return 0
EndIf
Local $v_Buffer = DllStructCreate($sv_Type)
If @error Then
SetError(@error + 1)
Return 0
EndIf
DllCall("kernel32.dll", 'int', 'ReadProcessMemory', 'int', $ah_Handle, 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
If Not @error Then
Local $v_Value = DllStructGetData($v_Buffer, 1)
Return $v_Value
Else
SetError(6)
Return 0
EndIf
EndFunc ;==>_MemoryRead
注意中文转为二进制的类型.
楼上的代码未编译时有效,编译了,文字需要转换的类型可能又不一样了. 非标控件 微软提供了一个接口 调用改接口可能更加简单 接口名称Accessible 回复 9# wjc826194
感谢,虽然还没搞定内存读控件,但是已经通过屏幕点读取控件内容了,
不过你说的这个感觉也是对控件操作很有用,不知道后面有没有大神去研究出个UDF
从官网找到的,还不会用
页:
[1]