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

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

  •  
  •   596164296 · 61 天前 · 1119 次点击
    这是一个创建于 61 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    恳请有懂的大哥指点一二

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

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

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

    实在不行的话我觉得直接在程序和服务器之间搞个中间人修改数据也比你做反向工程方便啊(当然像学习反向工程的话另当别论
    levelworm
        7
    levelworm   61 天前
    有加密吗?听起来应该是没有?
    forgottencoast
        8
    forgottencoast   61 天前
    @BeautifulSoap 总感觉楼主有点奇怪。
    g00001
        9
    g00001   61 天前
    无句柄窗口也不是完全不能控制,
    一种方法是使用 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   61 天前
    感觉像是搞黑产的
    kerro1990
        11
    kerro1990   61 天前
    后台截图是最好的,然后 OCR 识别,然后鼠标点击特定的坐标
    chenmobuys
        12
    chenmobuys   61 天前
    正常需求,直接跟公司开发部门沟通
    不是正常需求,那还是算了
    AX5N
        13
    AX5N   60 天前
    目测楼主是开发外挂的
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3818 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 07:51 · PVG 15:51 · LAX 00:51 · JFK 03:51
    ♥ Do have faith in what you're doing.