449199199 发表于 2018-3-17 19:37:17

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

Alam 发表于 2018-3-18 08:13:24

方法不对.

既然是字符串, 读和写应该以数组方式.
"byte'

449199199 发表于 2018-3-19 01:18:51

回复 2# Alam

不是很理解,可否示例一下?
我是在CE通过变化与不变化最终定位到此,不知道如何把这个内存的值解析出来。

Alam 发表于 2018-3-20 22:51:37

数字 3 在内存表示为 33 ,英文和数字均占 1字节,汉字通常2个.
写前,文字要转化为对应二进制;读后,也是要将二进制转为文字

nhnhwsnh 发表于 2018-3-21 00:31:54

虽然不懂楼上说的,但是ce显示红色的,基本不是你要找的,你看看ce的用法,里面讲绿色的可能性比较大~

449199199 发表于 2018-3-21 11:51:46

本帖最后由 449199199 于 2018-3-21 12:03 编辑

回复 4# Alam

先创建一个简单的Edit程序:


再用内存读取来读:



好像找出了基址,但是就是用疯子的方法读不出来。。。拜托各位帮忙顶一下
搞了一晚上,从CE各种方法找字符,查资料,再到把内存读取的Dll AU3研究,DLL数据格式验证,Edit变动的最终能读出来,但是是数字,BUTTON的文字读不出来。

Alam 发表于 2018-3-21 20:15:50

算是模糊搜索的范例
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

Alam 发表于 2018-3-21 20:52:46

注意中文转为二进制的类型.
楼上的代码未编译时有效,编译了,文字需要转换的类型可能又不一样了.

wjc826194 发表于 2018-4-2 06:24:48

非标控件 微软提供了一个接口 调用改接口可能更加简单 接口名称Accessible

449199199 发表于 2018-4-2 10:18:25

回复 9# wjc826194

感谢,虽然还没搞定内存读控件,但是已经通过屏幕点读取控件内容了,
不过你说的这个感觉也是对控件操作很有用,不知道后面有没有大神去研究出个UDF
从官网找到的,还不会用


页: [1]
查看完整版本: CE(cheat engine)找内存,怎样找出字符,用于非标控件读取