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));
Примечания
- Под код выделяется память, и он записывается туда уже в бинарном виде. После чего его можно вызывать по присвоенному ему во втором аргументе имени. Возвращаемое значение содержит адрес кода в памяти. Машинный код для 32 и 64 бит различен, отсюда необходимость проверки битности процесса (через проверку битности объекта DWX), чтобы определить, какой код использовать. В качестве возможного применения для такого кода можно привести обработку больших объёмов данных. Машинный код может работать в десятки или даже сотни раз быстрее скриптового.
- Если вы хотите использовать код по его адресу, без создания метода, можно опустить все аргументы кроме первого. Но имейте в виду, что выделенная под код память всё же связана с объектом и будет освобождена в случае его уничтожения.
- Хекс-строка может быть сплошной или содержать пробелы, табуляции и переводы строки.
- Комментарии можно поместить прямо в хекс-строку, обрамив их скобками.
Code = "4889C8 (mov rax,rcx) 48F7EA (imul rdx) C3 (ret)"
- Если хекс-строка является многострочным текстом, комментарии можно обозначать точкой с запятой.
Code = "4889C8 ; mov rax,rcx \n" +
"48F7EA ; imul rdx \n" +
"C3 ; ret"
Но учтите, что в этом случае каждая строка, кроме последней, должна иметь на конце перевод строки, т.к. он используется как признак конца комментария.