查看原文
其他

编译libc.so过time函数反调试

熊趴趴来 看雪学院 2019-05-25

根据论坛各位大神的文章,了解了Android的各种反调试机制,如tracerpid, time。


其中的tracepid, 大神们说可以通过修改源码重新编译内核实现Anti反调试。在我的Nexus 7平板上, 根据百度来的教程,修改了linux内核源码后体验了一下,可以过掉这种反调试。


那么本着娱乐的精神,对于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()比较的反调试。




- End -


看雪ID: 熊趴趴来                          

https://bbs.pediy.com/user-307313.htm


本文由 熊趴趴来 原创

转载请注明来自看雪社区



长按识别下方图中的二维码,为Ta投票!




热门图书推荐:

立即购买!




热门技术文章:        




公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存