2

I have a Windows program that uses awesomium to display a WebApp. This WebApp communicates in some way with the client program through some native calls. I found references to window.externalHost and window.native in the JS source, but it's build with YUI and has tens of thousand lines of code and single character variables and I can't quite figure out what exactly they are doing (static analysis).

I have injected Javascript into the WebApp to check those two objects:

try {
    document.write(JSON.stringify(window.externalHost, null, 4))
} catch (err) {
    document.write(err)
}

But window.externalHost is undefined and window.native is {}.

So my questions are:

  • How are native calls usually set up?
  • What interfaces do exist and how are they used? (Both directions)
  • Can I "detour"/"intercept" native calls to see what they are sending?
  • Are there any remote JS debug projects which I could inject to dynamically debug the complex WebApp?

update 1: I am confident that it uses window.native. Because of this Object {}. It seems likely that the communication is not implemented as window.externalHost.postMessage() based on what I have read on the awesomium wiki.

I now try to capture what methods are called on it. My idea was to overwrite window.onerror to capture all errors and set window.native = undefined; to capture exceptions like Cannot call aNativeCall() on undefined. Unfortunately it seems that windows.native can't be overwritten - it doesn't stay undefined.

Any other ideas?


update 2:

I came up with this javascript code to check some interesting Objects like window.external, etc...

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>");
    }
}

It became slowly more clear that it has to be window.native. This object has the following properties: 'on','isNative','scale','Emitter','call','register','_ready'

When I try to call window.native.call() the native program crashes. And the debug information shows that it crashed in a ProcessRequest function. So I found the right interface.

I now need to find out how exactly this interface is used. Unfortunately I can't overwrite window.native.call = function() { ... } to log the calls.

Anybody another idea?

samuirai
  • 3,079
  • 4
  • 23
  • 37

0 Answers0