unicorn engine でホストの c 関数で計算を行って エミュレーションのコードに値を返すサンプル
解決したいこと
以下のコードで、host_function
が呼ばれない(ように見える)のを解決したい。
以下のコードは、ChatGPT に「unicorn engine でホストの c 関数で計算を行って エミュレーションのコードに値を返すサンプルを書いて」とお願いして書いてもらったコードです。
#include <unicorn/unicorn.h>
#include <iostream>
// ホストのC関数
int host_function(uc_engine* uc, void* user_data) {
// Unicornエミュレーションコンテキストからデータを取得
uint64_t arg1, arg2;
uc_reg_read(uc, UC_X86_REG_RDI, &arg1);
uc_reg_read(uc, UC_X86_REG_RSI, &arg2);
// ホスト関数で計算
uint64_t result = arg1 + arg2;
std::cout << "arg1:" << arg1 << std::endl;
std::cout << "arg2:" << arg2 << std::endl;
std::cout << "result:" << result << std::endl;
// 結果をUnicornエミュレーションコンテキストに書き込む
uc_reg_write(uc, UC_X86_REG_RAX, &result);
return 0;
}
int main() {
// Unicornエミュレーションエンジンの初期化
uc_engine* uc;
uc_err err = uc_open(UC_ARCH_X86, UC_MODE_64, &uc);
if (err != UC_ERR_OK) {
printf("uc_open() failed with error: %s\n", uc_strerror(err));
return -1;
}
// メモリを割り当ててエミュレーションコードをロード
uint64_t code_address = 0x1000;
uint8_t code[] = {
0x48, 0xC7, 0xC6, 0x05, 0x00, 0x00, 0x00, // mov rsi, 5
0x48, 0xC7, 0xC7, 0x03, 0x00, 0x00, 0x00, // mov rdi, 3
0xE8, 0x00, 0x00, 0x00, 0x00, // call host_function
0xC3 // ret
};
uc_mem_map(uc, code_address, sizeof(code), UC_PROT_ALL);
uc_mem_write(uc, code_address, code, sizeof(code));
// ホスト関数をUnicornエミュレーションコンテキストに登録
uc_hook hook;
uc_hook_add(uc, &hook, UC_HOOK_INSN, (void*)host_function, NULL, code_address, code_address + sizeof(code));
// エミュレーションを開始
uc_reg_write(uc, UC_X86_REG_RSP, &code_address); // スタックの初期化
uc_emu_start(uc, code_address, code_address + sizeof(code), 0, 0);
// 結果を取得
uint64_t result;
uc_reg_read(uc, UC_X86_REG_RAX, &result);
printf("Emulation result: %lu\n", result);
// Unicornエミュレーションエンジンをクローズ
uc_close(uc);
return 0;
}
発生している問題・エラー
$ g++ host-calc.cpp -lunicorn -static
$ ./a.exe
Emulation result: 0
0