android native hook简介

(一)简介

android中的 native Hook是一个吸引人的技术点,诱使和带来很多特别精彩的想法和体验,在调试和其他场景中有很多应用。

本文代码基本都来自github上的源码,只做了适当的编辑和修改,主要是为了验证和测试,基本技术细节未变。

关于具体的技术细节,本文不做阐述,有想法的人和行动派总是在实践中找到自我和快感,所有的技术细节,请自行探讨。

工程代码:点击下载

(二)测试

64位hooktest文件源码:

#include <stdio.h>#include "And64InlineHook.h"typedef int (*ptr_old_puts)(const char *);ptr_old_puts old_puts = 0;int new_puts(const char *string)
{return old_puts("inlineHook success");
}int hook()
{A64HookFunction((void*const)puts,(void*const)new_puts,(void **)&old_puts);return 0;
}int main()
{puts("test");hook();puts("test");return 0;
}

32位hooktest代码:

#include <stdio.h>
#include <errno.h>#include "inlineHook.h"int (*old_puts)(const char *) = NULL;int new_puts(const char *string)
{return old_puts("inlineHook 32 success");
}int hook()
{if (registerInlineHook((uint32_t) puts, (uint32_t) new_puts, (uint32_t **) &old_puts) != ELE7EN_OK) {printf("registerInlineHook error:%d\r\n",errno);return -1;}if (inlineHook((uint32_t) puts) != ELE7EN_OK) {printf("inlineHook error:%d\r\n",errno);return -1;}printf("hook ok\r\n");return 0;
}int unHook()
{if (inlineUnHook((uint32_t) puts) != ELE7EN_OK) {printf("inlineUnHook error:%d\r\n",errno);return -1;}return 0;
}int main()
{puts("test0");getchar();hook();puts("test1");getchar();unHook();puts("test2");
}

测试步骤:

  1. adb push hooktest /data/local/tmp
  2. 切换到adb shell,cd /data/local/tmp后,执行chmod 777 ./hooktest
  3. ./hooktest

注意细节:

  1. 先执行puts在再hook,是因为linux上的延迟记载,若函数没有调用,执行hook时可能因为找不到puts函数而失败
  2. . old_puts是函数指针,也就是说是它是一个二级指针

32位hook测试结果截图:

64位hook测试输出截图:

本文链接:https://my.lmcjl.com/post/13976.html

展开阅读全文

4 评论

留下您的评论.