LuaとBfdのインタフェースが出来たので、これを利用していろんなことができる。
Luaインタフェースで、関数のシンボルからエントリポイントを探索する。
Luaで次のようなインタフェースを実装した。
get_addr (cpu, symbol)
インスタンスCPUに対して、関数のエントリポイントsymbolを探索する。 例えば、
get_addr (cpu, "main")
とすると、main関数のアドレス位置を返す。
実装
Luaインタフェースでこの関数が呼ばれたときは、関数ヘッダ位置のリストを探索し、該当するエントリポイントが見つかると、そのアドレスを返す。
int Lua_GetAddr (lua_State *L) { // Getting Arguments #ifdef ARCH_MIPS MipsEnv *env = static_cast<MipsEnv *>(lua_touserdata (L, 1)); #else // ARCH_MIPS #ifdef ARCH_RISCV RiscvEnv *env = static_cast<RiscvEnv *>(lua_touserdata (L, 1)); #endif // ARCH_RISCV #endif // ARCH_MIPS std::string symbol = lua_tostring (L, 2); Addr_t addr; if (env->FindFuncAddr (&addr, symbol) == true) { lua_pushinteger (L, addr); } else if (env->FindGVarAddr (&addr, symbol) == true) { lua_pushinteger (L, addr); } else { lua_pushinteger (L, -1); } return 1; } ... bool EnvBase::FindFuncAddr (Addr_t *addr, std::string symbol) { FunctionTable::iterator it = m_func_table->begin (); while (it != m_func_table->end ()) { if ((*it)->symbol == symbol) { *addr = (*it)->addr; return true; } it++; } return false; }
mips = make_core ("mips") print(string.format("Function Addr = %08x\n", get_addr (mips, "main"))) run (mips)
以下のように、mainのアドレスを取得することができる。
Function Addr = 80002254