最近工作需要開始研究hook,得益於http://blog.csdn.net/dinuliang/archive/2010/04/20/5509009.aspx 這篇文章,做出了些成果。
首先,這套hook的思路來源於linker的動態綁定,就是修改.rel表項所指向的該符號在映像(位於.got段)中的地址,可以看下面的代碼:
#include "linker.h"<br />void modifySymbol(void* handle, const char *name, void* new_addr){<br />if(!handle) return;<br />soinfo *si = (soinfo*)handle;<br />Elf32_Sym *symtab = si->symtab;<br /> const char *strtab = si->strtab;<br />Elf32_Rel *rel = si->rel;<br />unsigned count = si->rel_count;<br />unsigned idx;<br />for(idx=0; idx<count; idx++){<br />unsigned type = ELF32_R_TYPE(rel->r_info);<br />unsigned sym = ELF32_R_SYM(rel->r_info);<br />unsigned reloc = (unsigned)(rel->r_offset + si->base);<br />char *sym_name = (char *)(strtab + symtab[sym].st_name);<br />if(type==R_ARM_GLOB_DAT && strcmp(sym_name, name)==0){<br />*((unsigned*)reloc) = (Elf32_Addr)new_addr;<br />break;<br />}<br />rel++;<br />}<br />}
如果要hook xxx.so對malloc()的調用,只需要:
void* handle=dlopen("xxx.so", RTLD_NOW);<br />modifySymbol(handle, "malloc", (void*)fake_malloc);
這樣,這個庫對malloc的調用都會轉到fake_malloc()函數中
當然,也許符號是在.rel.plt表裡面,這種情況結合linker.h中的定義對modifySymbol()進行修改就可以了。