簡體   English   中英

如何在 WinDbg 中引用不同腳本中定義的 JavaScript 函數?

[英]How do I refer to a JavaScript function defined in a different script in WinDbg?

我有幾個 JavaScript 腳本來容納我的函數(用於模塊化和重用)。 我從正在運行的 windbg 腳本加載它們。 在一個腳本中,如何調用另一個腳本中定義的函數?

該引擎似乎不支持瀏覽器采用的導入/ 導出功能。

在調試器腳本中,我必須使用@$scriptContents來訪問 JavaScript 函數。 如何從 JavaScript 函數之一中完成類似的操作?

實驗

我希望所有 JavaScript 函數都有某種全局命名空間,但似乎沒有。

考慮

// t1.js
function func1() {
    host.diagnostics.debugLog('func1()...\n');
}

// t2.js
function func2() {
    host.diagnostics.debugLog('func2()...\n');
    func1();
}

在我的 cdb 會話中

0:000> .load jsprovider.dll
0:000> .scriptload t1.js
JavaScript script successfully loaded from 't1.js'
0:000> .scriptload t2.js
JavaScript script successfully loaded from 't2.js'
0:000> dx @$scriptContents.func1()
func1()...
@$scriptContents.func1()
0:000> dx @$scriptContents.func2()
func2()...
Error: 'func1' is not defined [at t2 (line 3 col 5)]

編輯

根據@Mosè Raguzzini的評論和這個答案,我去尋找某種方法來引用“外部”函數。 我最終發現了這個

host.namespace.Debugger.State.DebuggerVariables.scriptContents

作為所有功能的容器。 這是在某處記錄的嗎? 沒有更簡單的方法可以到達那里嗎? (我意識到我可以只為該對象分配一個短變量;我只是懷疑這更像是一個后門,進入了一個非常簡單的前門,但我不知道前門在哪里。)

AFAIK 所有腳本都在全局范圍內導入,因此一旦加載所有腳本,您就可以將它們寫入單個文件中。

示例( 參考 blabb 答案

common.js 有一些通常可重用的函數,如 host.diagnostics.debugLog()

首先使用 .scriptload 加載它

然后在其他 js 文件中為這些函數創建一個 var 並使用它

通用功能文件的內容

C:\>cat c:\wdscr\common.js
function log(instr) {
    host.diagnostics.debugLog(instr + "\n");
}
function exec (cmdstr){
    return host.namespace.Debugger.Utility.Control.ExecuteCommand(cmdstr);
}

一個使用 common.js 函數的 js 文件

C:\>cat c:\wdscr\usecommon.js
function foo(){
    var commonlog = host.namespace.Debugger.State.Scripts.common.Contents.log
    var commonexec = host.namespace.Debugger.State.Scripts.common.Contents.exec
    commonlog("we are using the logging function from the common.js file")

    var blah = commonexec("lma @$exentry")
    for(var a of blah) {
        commonlog(a)
    }
}

實際使用

C:\>cdb calc
Microsoft (R) Windows Debugger Version 10.0.16299.15 X86

0:000> .load jsprovider

0:000> .scriptload c:\wdscr\common.js
JavaScript script successfully loaded from 'c:\wdscr\common.js'

0:000> .scriptload c:\wdscr\usecommon.js
JavaScript script successfully loaded from 'c:\wdscr\usecommon.js'

0:000> dx @$scriptContents.foo()

we are using the logging function from the common.js file 
start    end        module name
00f10000 00fd0000   calc       (deferred)
@$scriptContents.foo()
0:000>

好吧,您可以編寫一個 javascript 函數,該函數可以從任何目錄中的任何腳本調用任何函數

使用類似下面的東西(你可能需要調整它,POC 在我的機器上工作,用於返回一個字符串的 .js)

function runFuncFromAnyScript(dir,script,somefunc) {
    var unl = ".scriptunload " + script
    host.namespace.Debugger.Utility.Control.ExecuteCommand(unl)
    var pre = ".scriptload "
    var post = "dx @$scriptContents." + somefunc
    var cmd  = pre + dir + script 
    host.namespace.Debugger.Utility.Control.ExecuteCommand(cmd)
    return host.namespace.Debugger.Utility.Control.ExecuteCommand(post)
}

用過

0:000> dx @$scriptContents.runFuncFromAnyScript("f:\\zzzz\\wdscript\\","mojo.js","hola_mojo(\"executethis\")" )
@$scriptContents.runFuncFromAnyScript("f:\\zzzz\\wdscript\\","mojo.js","hola_mojo(\"executethis\")" )                
    [0x0]            : hola mojo this is javascript 
    [0x1]            : hello mojo this is the argument you sent to me for execution I have executed your executethis
    [0x2]            : @$scriptContents.hola_mojo("executethis")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM