111
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
#include <functional>
|
||||
#include <list>
|
||||
#include <ffi.h>
|
||||
#include <keystone/keystone.h>
|
||||
|
||||
static SQInteger _file_releasehook(SQUserPointer p, SQInteger SQ_UNUSED_ARG(size))
|
||||
{
|
||||
@@ -54,6 +55,29 @@ static SQInteger PointerOperation(HSQUIRRELVM v)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static SQInteger PointerOperationPointer(HSQUIRRELVM v)
|
||||
{
|
||||
SQUserPointer Address;
|
||||
sq_getuserpointer(v, 2, &Address);
|
||||
SQUserPointer Address2;
|
||||
sq_getuserpointer(v, 3, &Address2);
|
||||
|
||||
const SQChar *TypecharBuf;
|
||||
sq_getstring(v, 4, &TypecharBuf);
|
||||
std::string Type(TypecharBuf);
|
||||
|
||||
if (Type == "+")
|
||||
{
|
||||
sq_pushuserpointer(v, (void *)((int)Address + (int)Address2));
|
||||
}
|
||||
else if (Type == "-")
|
||||
{
|
||||
sq_pushuserpointer(v, (void *)((int)Address - (int)Address2));
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
// 写字节数组
|
||||
static SQInteger Memory_WriteByteArr(HSQUIRRELVM v)
|
||||
{
|
||||
@@ -97,6 +121,53 @@ static SQInteger Memory_ReadString(HSQUIRRELVM v)
|
||||
return 1;
|
||||
}
|
||||
|
||||
// 将汇编代码字符串转为字节码
|
||||
static SQInteger Asmjit_Compile(HSQUIRRELVM v)
|
||||
{
|
||||
const SQChar *CharBuf;
|
||||
sq_getstring(v, 2, &CharBuf);
|
||||
std::string AsmCode(CharBuf);
|
||||
SQUserPointer Address = 0;
|
||||
if (sq_gettop(v) == 3)
|
||||
{
|
||||
sq_getuserpointer(v, 3, &Address);
|
||||
}
|
||||
|
||||
ks_engine *ks;
|
||||
ks_err err;
|
||||
size_t count;
|
||||
unsigned char *encode;
|
||||
size_t size;
|
||||
// 打开Keystone引擎,使用x86-64架构和Intel语法
|
||||
if (ks_open(KS_ARCH_X86, KS_MODE_32, &ks) != KS_ERR_OK)
|
||||
{
|
||||
// fprintf(stderr, "Failed to open Keystone\n");
|
||||
return -1;
|
||||
}
|
||||
// 可选:设置语法为Intel(默认已经是Intel,可省略)
|
||||
ks_option(ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_INTEL);
|
||||
// 汇编指令
|
||||
if (ks_asm(ks, AsmCode.c_str(), (uint64_t)Address, &encode, &size, &count) != KS_ERR_OK)
|
||||
{
|
||||
// fprintf(stderr, "Assembly error: %s\n", ks_strerror(ks_errno(ks)));
|
||||
ks_close(ks);
|
||||
return -1;
|
||||
}
|
||||
// 创建Squirrel数组
|
||||
sq_newarray(v, 0);
|
||||
// 将每个字节压入数组
|
||||
for (size_t i = 0; i < size; ++i)
|
||||
{
|
||||
sq_pushinteger(v, encode[i]); // 压入字节值
|
||||
sq_arrayappend(v, -2); // 添加到数组(-2是数组位置)
|
||||
}
|
||||
// 释放资源
|
||||
ks_free(encode);
|
||||
ks_close(ks);
|
||||
|
||||
return 1; // 返回1表示有返回值
|
||||
}
|
||||
|
||||
static SQInteger register_Memory_func(HSQUIRRELVM v, SQFUNCTION f, const char *fname)
|
||||
{
|
||||
sq_pushroottable(v);
|
||||
@@ -112,8 +183,11 @@ static void RegisterMemory(HSQUIRRELVM v)
|
||||
register_Memory_func(v, Register_Destruction, "Register_Destruction");
|
||||
// 运算
|
||||
register_Memory_func(v, PointerOperation, "Sq_PointerOperation");
|
||||
register_Memory_func(v, PointerOperationPointer, "Sq_PointerOperationPointer");
|
||||
// 写字节
|
||||
register_Memory_func(v, Memory_WriteByteArr, "Sq_Memory_WriteByteArr");
|
||||
// 读字符串
|
||||
register_Memory_func(v, Memory_ReadString, "Sq_Memory_ReadString");
|
||||
// 将汇编代码字符串转为字节码
|
||||
register_Memory_func(v, Asmjit_Compile, "Sq_Asmjit_Compile");
|
||||
}
|
||||
Reference in New Issue
Block a user