分享早期写过的基于Android的Got Hook

基于学习和分享的目的,你可以自行下载,随意进行更改,但需要注明出处,版权属于我个人所有。

实现原理和思路:

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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值