我有一个使用awesomium来显示 WebApp的 Windows 程序。这个 WebApp 通过一些本机调用以某种方式与客户端程序进行通信。我在 JS 源代码中找到了window.externalHost
和 的引用window.native
,但它是用YUI构建的,有数万行代码和单个字符变量,我不太清楚它们到底在做什么(静态分析)。
我已将 Javascript 注入 WebApp 以检查这两个对象:
try {
document.write(JSON.stringify(window.externalHost, null, 4))
} catch (err) {
document.write(err)
}
但是window.externalHost
是undefined
并且window.native
是{}
。
所以我的问题是:
- 本地调用通常如何设置?
- 存在哪些接口以及如何使用它们?(两个方向)
- 我可以“绕道”/“拦截”本机调用以查看它们发送的内容吗?
- 是否有任何我可以注入的远程 JS 调试项目来动态调试复杂的 WebApp?
更新 1:我相信它使用window.native
. 因为这个 Object {}
。window.externalHost.postMessage()
根据我在awesomium wiki上阅读的内容,似乎没有实现通信。
我现在尝试捕获对其调用的方法。我的想法是覆盖window.onerror
以捕获所有错误并设置window.native = undefined;
为捕获异常,例如Cannot call aNativeCall() on undefined
. 不幸的是,它似乎windows.native
无法被覆盖 - 它不会保持未定义状态。
还有其他想法吗?
更新2:
我想出了这个 javascript 代码来检查一些有趣的对象,比如window.external
,等等......
obj = ['external', 'externalHost', 'native', 'Y', ['Y','native'],['Y','Native'], ['Y','external'], ['Y','externalHost']];
for(i=0; i< obj.length; ++i) {
try {
if(obj[i] instanceof Array) {
var tmp = window[obj[i][0]];
for(j=1; j<obj[i].length; ++j) {
tmp = tmp[obj[i][j]]
}
document.write(obj[i]+" | <b>"+Object.getOwnPropertyNames(tmp)+"</b><br>");
} else {
document.write(obj[i]+" | <b>"+Object.getOwnPropertyNames(window[obj[i]])+"</b><br>");
}
} catch(err) {
document.write(obj[i]+" | <i>Error: "+err+"</i><br>");
}
}
它变得越来越清楚,它必须是window.native
。该对象具有以下属性:'on'、'isNative'、'scale'、'Emitter'、'call'、'register'、'_ready'
当我尝试调用window.native.call()
本机程序时崩溃。并且调试信息显示它在一个ProcessRequest
函数中崩溃了。所以我找到了正确的界面。
我现在需要找出这个接口是如何使用的。不幸的是,我无法覆盖window.native.call = function() { ... }
以记录通话。
有人有别的想法吗?