
HOOK就是传说中的钩子,用于劫持消息,在windows中是这样的,因为win32程序是以消息机制为基础的,比如你点击鼠标,会给窗口传递一个消息,移动鼠标,会给窗口一个消息,用钩子可以比你的窗口先检测到这个消息,从而得到这个消息进行处理,你的窗口可能就处理不到这个消息了,要看你的钩子处理程序是否把这个消息传给窗口,具体看WIN32应用程序开发吧。
随着Android设备上的隐私安全问题越来越被公众重视,恶意软件对用户隐私,尤其是对电话、短信等私密信息的威胁日益突出,各大主流安全软件均推出了自己的隐私行为监控功能,在root情况下能有效防止恶意软件对用户隐私的窃取,那么这背后的技术原理是什么?我带着疑问开始一步步探索,如果要拦截恶意软件对电话、短信等API的调用,在Java或者Dalvik层面是不好进行的,因为这些层面都没有提供Hook的手段,而在Native层面,我认为可行的方案是对电话、短信的运行库so进行Hook(比如系统运行库systemliblibreference-ril.so或systemliblibril.so),如果注入自己的so到上述进程后,并通过dlopen()和dlsym()获取原有API地址,替换原有API地址为自己so中的API地址就可以达到Hook的目的。
Hook的前提是进程注入,而Linux下最便捷的进程注入手段——ptrace,是大名鼎鼎的调试工具GDB的关键技术点;本文参考自Pradeep Padala于2002年的博文(国内很多博客有这篇文章的译文,不过本着获取“一手”知识的想法,还是细读了原版英文,确实发现了一些翻译得不够到位的地方,在此还是推荐各位能读原文就不要读译文),由于02年时还是ia32(32位Intel Architecture)时代,时至今日,在我ia64也就是x64的机器已经无法运行了,所以自己动手实现了x64版本。代码主要功能是注入子进程的地址空间,Hook住子进程执行系统调用时的参数,并反转其参数,从而逆序输出ls命令的结果。
代码如下:
1 /*
2 ptrace3.c
3 author: pengyiming
4 description:
5 1, child process need be traced by father process
6 2, father process reserve the result of "ls" command which executed by child process
7 */
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <sys/ptrace.h>
13 #include <sys/types.h>
14 #include <sys/wait.h>
15 #include <sys/reg.h>
16 #include <sys/user.h>
17 #include <sys/syscall.h>
18 #include <unistd.h>
19
20 #ifdef __x86_64__
21
22 #define OFFSET_UNIT 8
23
24 #else
25
26 #define OFFSET_UNIT 4
27
28 #endif
29
30 // converter long to char[]
31 union
32 {
33 long rawData;
34 char strData[sizeof(long)];
35 } converter;
36
37 void getData(pid_t child, unsigned long long dataAddr, unsigned long long dataLen, char * const p_data)
38 {
39 // PEEKDATA counter
40 int counter = 0;
41 // PEEKDATA max count
42 int maxCount = dataLen / sizeof(long);
43 if (dataLen % sizeof(long) != 0)
44 {
45 maxCount++;
46 }
47 // moving pointer
48 void * p_moving = p_data;
49
50 while (counter < maxCount)
51 {
52 memset(&converter, 0, sizeof(long));
53 converter.rawData = ptrace(PTRACE_PEEKDATA, child, dataAddr + counter * sizeof(long), NULL);
54 if (converter.rawData < 0)
55 {
56 perror("ptrace peek data error : ");
57 }
58
59 memcpy(p_moving, converter.strData, sizeof(long));
60 p_moving += sizeof(long);
61 counter++;
62 }
63 p_data[dataLen] = ' ';
64 }
65
66 void setData(pid_t child, unsigned long long dataAddr, unsigned long long dataLen, char * const p_data
本文发布于:2024-02-03 06:30:57,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170691305549259.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
| 留言与评论(共有 0 条评论) |