V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
596164296
V2EX  ›  Windows

如何获取 windows 应用程序界面数据,非简单的使用句柄!

  •  
  •   596164296 · 2021-08-17 19:10:49 +08:00 · 2159 次点击
    这是一个创建于 1220 天前的主题,其中的信息可能已经有所发展或是发生改变。

    场景:目前公司开发了一款 windows 桌面应用程序,界面 UI 为自定义的 UI,目前使用 spy++与 inspect 等均无法抓取到界面上的文字内容,也无法复制修改这些业务数据,这些业务数据均是从服务器实时获取到的。

    需求:现在有没有什么办法可以获取到这些数据,内存方法已经使用 ce 测试过,无法获取到。使用 ollydbg 同样无法获取到。

    反思:即使是自定义的 UI,上面的静态文本数据是有的(该数据是以列表的形式显示在程序界面上),应该是有办法获取到的,windows 去熏染也要有数据才能熏染!也可能是使用 ce 与 ollydbg 方法不对。

    恳请有懂的大哥指点一二

    13 条回复    2021-08-18 20:59:10 +08:00
    xupefei
        1
    xupefei  
       2021-08-17 19:18:31 +08:00 via iPhone
    用 dx 画的画就去 hook dx api,gdi 画的就去 hook drawtext 或 createglyphoutline,哪儿有拿不到的道理。
    ila
        2
    ila  
       2021-08-17 19:59:11 +08:00 via Android
    autoit
    secondwtq
        3
    secondwtq  
       2021-08-17 20:12:35 +08:00
    有服务器就抓包啊 ...
    DirectUI 没有通用的方法的,上面有人说去抓 DX API,你抓过来只会抓到一堆 triangle

    我之前在 v2ex.com/t/794788#r_10778545 说过 OS X 的 automation 做的好,没提的是其中一个原因是 OS X 的软件技术选型比较统一,最后都收敛到 Cocoa 。不过我觉得 现在 Electron 越来越普遍,这个优势可能慢慢淡了。
    ch2
        4
    ch2  
       2021-08-17 20:26:00 +08:00
    试一试 uia 模式,别用 win32 模式
    ku9527
        5
    ku9527  
       2021-08-17 20:34:40 +08:00
    @xupefei hook 不了吧,有些自定义 UI,为了跨平台,并不调用 drawtext, 而是自己读字体的形状,画上去的
    BeautifulSoap
        6
    BeautifulSoap  
       2021-08-17 20:39:07 +08:00
    等等,这程序是 lz 公司自己开发的话直接问问开发部门具体是怎么画上去的不就好了?然后根据画上去的方法找对应方法

    如果对方愿意帮忙的话,给你开个调试用的接口不更方便。

    实在不行的话我觉得直接在程序和服务器之间搞个中间人修改数据也比你做反向工程方便啊(当然像学习反向工程的话另当别论
    levelworm
        7
    levelworm  
       2021-08-17 20:42:25 +08:00
    有加密吗?听起来应该是没有?
    forgottencoast
        8
    forgottencoast  
       2021-08-17 20:58:30 +08:00
    @BeautifulSoap 总感觉楼主有点奇怪。
    g00001
        9
    g00001  
       2021-08-17 21:23:21 +08:00
    无句柄窗口也不是完全不能控制,
    一种方法是使用 UI Automation 或 MSAA ,
    举个例子读取 QQ 聊天消息( aardio 代码 )

    import winex;
    import winex.accObject;
    import console;

    for hwnd in winex.each( "TXGuiFoundation" ) {

    var accObject = winex.accObject.fromWindow(hwnd)
    if(accObject){
    var accMessage = accObject.find(role="list")
    if(accMessage){
    for accChild in accMessage.each(){
    console.log(accChild.roleText(),accChild.name(),accChild.value())
    }
    }
    }

    }

    console.pause(true);

    还有一种方法是直接窗口截图文字识别, 用 aardio 写个例子:

    import winex;
    import string.ocrLite;
    import string.ocrLite.defaultModels;

    var ocr = string.ocrLite(,true);
    var hwnd = winex.findExists("窗口标题");
    if(!hwnd) return;

    var ocrResult = ocr.detectClient(winform.hwnd);
    if(ocrResult){

    var x,y = ocrResult.findPoint("按钮文本",0.1);
    if(x && y){
    import mouse;
    //无句柄窗口可以直接用 winex.mouse.click() 点击
    mouse.moveToWindow(x,y,winform.hwnd);
    mouse.click();
    }
    }
    lukaz
        10
    lukaz  
       2021-08-17 22:30:26 +08:00
    感觉像是搞黑产的
    kerro1990
        11
    kerro1990  
       2021-08-17 22:36:13 +08:00
    后台截图是最好的,然后 OCR 识别,然后鼠标点击特定的坐标
    chenmobuys
        12
    chenmobuys  
       2021-08-18 09:23:38 +08:00
    正常需求,直接跟公司开发部门沟通
    不是正常需求,那还是算了
    AX5N
        13
    AX5N  
       2021-08-18 20:59:10 +08:00
    目测楼主是开发外挂的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5195 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:06 · PVG 17:06 · LAX 01:06 · JFK 04:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.