基于学习和分享的目的,你可以自行下载,随意进行更改,但需要注明出处,版权属于我个人所有。
实现原理和思路:
1、必须完全了解Android linker加载和解析so过程
2、仿照linker解析过程解析要进行hook的so
3、修改GOT条目对于segment属性为可写,替换GOT条目,修改回为原属性
该版本为很早以前版本,可能仅支持4.4和5.0,想支持更高版本,应该稍作修改就可以了。
///
头文件
/*
*
* Android Got Hook
*
* Author : sp00f
* Version 0.1
*/
#ifndef GOTHOOK_H_
#define GOTHOOK_H_
#include <android/log.h>
#define ALOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "LOG", __VA_ARGS__))
/**
* Function : GotHook
* @param libName - will got hook 's so name
* @param symbol - will hook import method symbol
* @param oldAddr - the method addr before hooked
* @param newAddr - will replace the new addr of the method
*
* @return success true ,else false
*/
bool gotHook(const char* libName, const char* symbol, void* oldAddr, void* newAddr);
#endif /* GOTHOOK_H_ */
实现源码:
/*
*
* Android Got Hook
*
* Author : sp00f
* Version 0.1
*/
#include "GotHook.h"
#include <fcntl.h>
#include <dlfcn.h>
#include <string.h>
#include <types.h>
#include <errno.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/exec_elf.h>
#include <elf.h>
#ifndef MAYBE_MAP_FLAG
#define MAYBE_MAP_FLAG(x,from,to) (((x) & (from)) ? (to) : 0)
#endif
#ifndef PFLAGS_TO_PROT
#define PFLAGS_TO_PROT(x) (MAYBE_MAP_FLAG((x), PF_X, PROT_EXEC) | \
MAYBE_MAP_FLAG((x), PF_R, PROT_READ) | \
MAYBE_MAP_FLAG((x), PF_W, PROT_WRITE))
#endif
#ifndef PAGE_START
#define PAGE_START(x) ((x) & PAGE_MASK)
#endif
#ifndef PAGE_OFFSET
#define PAGE_OFFSET(x) ((x) & ~PAGE_MASK)
#endif
#ifndef PAGE_END
#define PAGE_END(x) PAGE_START((x) + (PAGE_SIZE-1))
#endif
#ifndef SOINFO_NAME_LEN
#define SOINFO_NAME_LEN 128
#endif
#ifndef MAYBE_MAP_FLAG
#define MAYBE_MAP_FLAG(x,from,to) (((x) & (from)) ? (to) : 0)
#endif
#ifndef PFLAGS_TO_PROT
#define PFLAGS_TO_PROT(x) (MAYBE_MAP_FLAG((x), PF_X, PROT_EXEC) | \
MAYBE_MAP_FLAG((x), PF_R, PROT_READ) | \
MAYBE_MAP_FLAG((x), PF_W, PROT_WRITE))
#endif
#ifndef PAGE_START
#define PAGE_START(x) ((x) & PAGE_MASK)
#endif
#ifndef PAGE_OFFSET
#define PAGE_OFFSET(x) ((x) & ~PAGE_MASK)