Русский
English
中文
RegisterAddr 方法
该方法通过函数的内存地址注册函数。其他参数与
Register 相同。
DWX.RegisterAddr(Address, "FuncName", "i=hwwu", "r=l");
RegisterCode 方法
该方法的第一个参数以十六进制字符串形式接受函数的机器码。其他参数与
Register 相同。
DWX = new ActiveXObject("DynamicWrapperX");
if (DWX.Bitness == 32) { // 该函数将其参数相乘并返回结果。
Code = "8B442404F76C2408C3"
}
else {
Code = "4889C8 48F7EA C3" // mov rax, rcx; imul rdx; ret
}
CodeAddr = DWX.RegisterCode(Code, "Multiply", "i=ll", "r=l");
WScript.Echo(DWX.Multiply(5, 4));
备注:
- 分配内存并以二进制形式将代码写入内存。之后,您可以通过第二个参数中指定的名称来调用它。该方法返回代码的地址。x86 和 x64 的机器码是不同的,因此需要检查进程的位数(通过检查 DynamicWrapperX
对象的位数)以确定要使用的代码版本。机器码功能的一种可能应用是处理大量数据,其中机器码的运行速度可能比脚本代码快数十甚至数百倍。
- 如果您希望按地址编写代码,而不创建新方法,则可以省略除第一个参数之外的所有参数。但请记住,为代码分配的内存仍然与对象相关联,并且当对象被释放后内存才会被释放。
- 十六进制字符串可以是连续的,也可以由空格、制表符或换行符分成几部分。您还可以在十六进制字符串中插入注释,用括号括起来。
Code = "4889C8 (mov rax, rcx) 48F7EA (imul rdx) C3 (ret)"
- 如果十六进制字符串是多行的,您可以用分号标记注释。
Code = "4889C8 ; mov rax,rcx \n" +
"48F7EA ; imul rdx \n" +
"C3 ; ret"
但请注意,在这种情况下,每一行(最后一行除外)的末尾必须有一个或多个换行符,因为它们被用作注释结束标记。