找回密码
 加入
搜索
查看: 4114|回复: 9

[系统综合] CE(cheat engine)找内存,怎样找出字符,用于非标控件读取

    [复制链接]
发表于 2018-3-17 19:37:17 | 显示全部楼层 |阅读模式
本帖最后由 449199199 于 2018-3-17 19:49 编辑

目前在AU3中对许多非标控件没有抓取或修改的办法,想用CE查找到控件所在的内存地址,然后读取或修改该地址,
但是拿了一个微信电脑登录窗口验证了一下,发现最后找到的地址有点多,而且数值都是浮点,并非字符串,
不知道该如何继续下去,求各路汇编大神解答。
如图:


在CE贴吧也发了个问题帖子:
https://tieba.baidu.com/p/560131 ... 636529#118702067628

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2018-3-18 08:13:24 | 显示全部楼层
方法不对.

既然是字符串, 读和写应该以数组方式.
"byte[n]'
 楼主| 发表于 2018-3-19 01:18:51 | 显示全部楼层
回复 2# Alam

不是很理解,可否示例一下?
我是在CE通过变化与不变化最终定位到此,不知道如何把这个内存的值解析出来。
发表于 2018-3-20 22:51:37 | 显示全部楼层
数字 3 在内存表示为 33 ,英文和数字均占 1字节,汉字通常2个.
写前,文字要转化为对应二进制;读后,也是要将二进制转为文字
发表于 2018-3-21 00:31:54 | 显示全部楼层
虽然不懂楼上说的,但是ce显示红色的,基本不是你要找的,你看看ce的用法,里面讲绿色的可能性比较大~
 楼主| 发表于 2018-3-21 11:51:46 | 显示全部楼层
本帖最后由 449199199 于 2018-3-21 12:03 编辑

回复 4# Alam

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


再用内存读取来读:



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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 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]') ; 5000 比 4500 大,保证读取时,不会截断搜索的数据
        If  StringRegExp($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[2] = [DllOpen('kernel32.dll')]
        If @error Then
                SetError(2)
                Return 0
        EndIf
        Local $av_OpenProcess = DllCall($ah_Handle[0], 'int', 'OpenProcess', 'int', $iv_DesiredAccess, 'int', $if_InheritHandle, 'int', $iv_Pid)
        If @error Then
                DllClose($ah_Handle[0])
                SetError(3)
                Return 0
        EndIf
        $ah_Handle[1] = $av_OpenProcess[0]
        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[1], '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
发表于 2018-3-21 20:52:46 | 显示全部楼层
注意中文转为二进制的类型.
楼上的代码未编译时有效,编译了,文字需要转换的类型可能又不一样了.
发表于 2018-4-2 06:24:48 | 显示全部楼层
非标控件 微软提供了一个接口 调用改接口可能更加简单 接口名称Accessible
 楼主| 发表于 2018-4-2 10:18:25 | 显示全部楼层
回复 9# wjc826194

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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 18:33 , Processed in 0.111022 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表