如何引用 WinDbg 中不同脚本中定义的 JavaScript 函数?
How do I refer to a JavaScript function defined in a different script in WinDbg?
我有几个 JavaScript 脚本来存放我的函数(为了模块化和重用)。我从我 运行 的 windbg 脚本加载它们。如何从一个脚本中调用另一个脚本中定义的函数?
此引擎似乎不支持浏览器使用的 import/export 功能。
在调试器脚本中,我必须使用 @$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's comment and this answer,我一直在寻找一些方法来引用 "foreign" 函数。
我终于发现了这个
host.namespace.Debugger.State.DebuggerVariables.scriptContents
作为所有功能的容器。这在某处记录了吗?有没有更简单的方法到达那里? (我知道我可以为那个对象分配一个短变量;我只是怀疑这更像是一个后门,进入一个非常简单的前门,但我不知道前门在哪里。)
据我所知,所有脚本都在全局范围内导入,因此一旦所有脚本都加载完毕,您就可以将它们写在一个文件中。
示例 (REF to blabb answer)
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")
我有几个 JavaScript 脚本来存放我的函数(为了模块化和重用)。我从我 运行 的 windbg 脚本加载它们。如何从一个脚本中调用另一个脚本中定义的函数?
此引擎似乎不支持浏览器使用的 import/export 功能。
在调试器脚本中,我必须使用 @$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's comment and this answer,我一直在寻找一些方法来引用 "foreign" 函数。 我终于发现了这个
host.namespace.Debugger.State.DebuggerVariables.scriptContents
作为所有功能的容器。这在某处记录了吗?有没有更简单的方法到达那里? (我知道我可以为那个对象分配一个短变量;我只是怀疑这更像是一个后门,进入一个非常简单的前门,但我不知道前门在哪里。)
据我所知,所有脚本都在全局范围内导入,因此一旦所有脚本都加载完毕,您就可以将它们写在一个文件中。
示例 (REF to blabb answer)
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")