596164296
V2EX  ›  Windows

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

  •  
  •   596164296 · Aug 17, 2021 · 2772 views
    This topic created in 1773 days ago, the information mentioned may be changed or developed.

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

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

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

    恳请有懂的大哥指点一二

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

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

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

    实在不行的话我觉得直接在程序和服务器之间搞个中间人修改数据也比你做反向工程方便啊(当然像学习反向工程的话另当别论
    levelworm
        7
    levelworm  
       Aug 17, 2021
    有加密吗?听起来应该是没有?
    forgottencoast
        8
    forgottencoast  
       Aug 17, 2021
    @BeautifulSoap 总感觉楼主有点奇怪。
    g00001
        9
    g00001  
       Aug 17, 2021
    无句柄窗口也不是完全不能控制,
    一种方法是使用 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  
       Aug 17, 2021
    感觉像是搞黑产的
    kerro1990
        11
    kerro1990  
       Aug 17, 2021
    后台截图是最好的,然后 OCR 识别,然后鼠标点击特定的坐标
    chenmobuys
        12
    chenmobuys  
       Aug 18, 2021
    正常需求,直接跟公司开发部门沟通
    不是正常需求,那还是算了
    AX5N
        13
    AX5N  
       Aug 18, 2021
    目测楼主是开发外挂的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5301 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 08:57 · PVG 16:57 · LAX 01:57 · JFK 04:57
    ♥ Do have faith in what you're doing.