那么本着娱乐的精神, 对于time()函数的反调试, 能不能用编译源码的方式解决一下?
首先, time()函数存在于libc.so中. 而android的libc.so, 源代码位于bionic/libc, 查看源代码,在android-4.4.4_r1/bionic/libc/unistd/time.c中发现了这个函数.
- #include <time.h>
-
- time_t
- time(time_t *t)
- {
- struct timeval tt;
- time_t ret;
-
- if (gettimeofday(&tt, (struct timezone *)0) < 0)
- ret = -1;
- else
- ret = tt.tv_sec;
- if (t != NULL)
- *t = ret;
- return ret;
- }
复制代码
经过一番测试, 这一部分代码修改为:
- #include <time.h>
- #include <unistd.h>
- #include <private/libc_logging.h>
- #include <stdio.h>
- #include <fcntl.h>
-
- time_t
- time(time_t *t)
- {
- struct timeval tt;
- time_t ret;
- pid_t procid;
- int fcmdline = -1;
- char szCmdline[64]= {0};
- char szProcName[256] = { 0 };
- int fConfig = -1;
- char buf[1024] = { 0 };
-
- if (gettimeofday(&tt, (struct timezone *)0) < 0)
- ret = -1;
- else
- ret = tt.tv_sec;
- if (t != NULL)
- *t = ret;
-
- procid = getpid();
- __libc_format_log(ANDROID_LOG_DEBUG, "libc_log", "pid_t : %d", procid);
- sprintf(szCmdline, "/proc/%d/cmdline", procid);
- __libc_format_log(ANDROID_LOG_DEBUG, "libc_log", "%s", szCmdline);
- fcmdline = open(szCmdline, O_RDONLY, 0644);
-
- if(fcmdline > 0)
- {
-
- __libc_format_log(ANDROID_LOG_DEBUG, "libc_log", "fcmdline : %d", fcmdline);
- read(fcmdline, szProcName, 256);
- __libc_format_log(ANDROID_LOG_DEBUG, "libc_log", "szProcName : %s", szProcName);
- close(fcmdline);
- }
-
- if(szProcName[0])
- {
- fConfig = open("/data/local/tmp/antime.txt", O_RDONLY, 0644);
- if(fConfig > 0)
- {
- __libc_format_log(ANDROID_LOG_DEBUG, "libc_log", "fConfig : %d", fConfig);
- read(fConfig, buf, 1024);
- __libc_format_log(ANDROID_LOG_DEBUG, "libc_log", "config buf : %s", buf);
- if(buf[0])
- {
- if(strstr(buf, szProcName))
- {
- return 0x56788765;
- }
- }
- close(fConfig);
- }
- }
-
- return ret;
- }
复制代码
修改好以后重新编译libc因为之前已经花了两小时编译过Nexus7的android源代码, 所以修改了以后只编译libc.so即可.
Nexus7平板在这一步选9, flo
然后进入bionic/libc 执行mm命令进行编译, 很快就编译好了, 显示如下
在Nexus7的/data/local/tmp目录下建立一个文本文件,里面写入需要让time函数返回固定值的apk的包名, 如com.abc.dosth. 把out/target/product/flo/system/lib/libc.so push到/data/local/tmp目录下,然后重启进入第三方的recovery如TWRP, 挂载system分区, 把libc.so复制到Nexus7的system/lib目录下.以后在运行com.abc.dosth这个apk的时候, 调用time()返回的总是一个固定值0x56788765.从而可以过掉两次time()比较的反调试.
|