#include #include #include #include #include #define LOGI(...) ((void)__android_log_print(4, "ligma", __VA_ARGS__)) #define LOGW(...) ((void)__android_log_print(5, "ligma", __VA_ARGS__)) namespace ligma { namespace hook { // // TODO this doesnt work yet, needs to be debugged! // inline void* got_hook(elf32_hdr* module_base, const std::pair& module_info, void* new_ptr) { if (!module_base || !module_info.first || !module_info.second || !new_ptr) return {}; const auto orig_module_base = dlopen(module_info.first, RTLD_NOW); const auto orig_ptr = dlsym(orig_module_base, module_info.second); const auto shstrtab_header_offset = module_base->e_shoff + module_base->e_shstrndx * sizeof(elf32_shdr); const auto shstr_header = reinterpret_cast(reinterpret_cast(module_base) + shstrtab_header_offset); const auto shstr_section = reinterpret_cast(module_base) + shstr_header->sh_offset; auto section_header = reinterpret_cast(reinterpret_cast(module_base) + module_base->e_shoff); for (auto idx = 0u; idx < module_base->e_shnum; ++idx) { if (strcmp(shstr_section + section_header->sh_name, ".got")) { for (auto section_value = reinterpret_cast(module_base) + section_header->sh_offset; section_value < reinterpret_cast(module_base) + section_header->sh_size; section_value += 0x8) if (*reinterpret_cast(section_value) == orig_ptr) *reinterpret_cast(section_value) = new_ptr; break; } section_header++; } return orig_ptr; } } }