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

2021-08-17 19:10:49 +08:00
 596164296

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

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

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

恳请有懂的大哥指点一二

2163 次点击
所在节点    Windows
13 条回复
xupefei
2021-08-17 19:18:31 +08:00
用 dx 画的画就去 hook dx api,gdi 画的就去 hook drawtext 或 createglyphoutline,哪儿有拿不到的道理。
ila
2021-08-17 19:59:11 +08:00
autoit
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
2021-08-17 20:26:00 +08:00
试一试 uia 模式,别用 win32 模式
ku9527
2021-08-17 20:34:40 +08:00
@xupefei hook 不了吧,有些自定义 UI,为了跨平台,并不调用 drawtext, 而是自己读字体的形状,画上去的
BeautifulSoap
2021-08-17 20:39:07 +08:00
等等,这程序是 lz 公司自己开发的话直接问问开发部门具体是怎么画上去的不就好了?然后根据画上去的方法找对应方法

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

实在不行的话我觉得直接在程序和服务器之间搞个中间人修改数据也比你做反向工程方便啊(当然像学习反向工程的话另当别论
levelworm
2021-08-17 20:42:25 +08:00
有加密吗?听起来应该是没有?
forgottencoast
2021-08-17 20:58:30 +08:00
@BeautifulSoap 总感觉楼主有点奇怪。
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
2021-08-17 22:30:26 +08:00
感觉像是搞黑产的
kerro1990
2021-08-17 22:36:13 +08:00
后台截图是最好的,然后 OCR 识别,然后鼠标点击特定的坐标
chenmobuys
2021-08-18 09:23:38 +08:00
正常需求,直接跟公司开发部门沟通
不是正常需求,那还是算了
AX5N
2021-08-18 20:59:10 +08:00
目测楼主是开发外挂的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/796391

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX