专业丰富的破解论坛技术交流,提供软件安全,病毒分析,脱壳破解,安卓破解,加密解密等,由无数热衷于软件爱好者共同维护
 
发新帖
楼主: 零五零八
查看: 802|回复: 0

[脱壳破解] 编译libc.so过time函数反调试

[复制链接]
零五零八 发表于 2020-11-19 20:12:39 | 显示全部楼层

那么本着娱乐的精神, 对于time()函数的反调试, 能不能用编译源码的方式解决一下?

首先, time()函数存在于libc.so中. 而android的libc.so, 源代码位于bionic/libc, 查看源代码,在android-4.4.4_r1/bionic/libc/unistd/time.c中发现了这个函数.


  1. #include <time.h>

  2. time_t
  3. time(time_t *t)
  4. {
  5.     struct timeval tt;
  6.     time_t ret;

  7.     if (gettimeofday(&tt, (struct timezone *)0) < 0)
  8.         ret = -1;
  9.     else
  10.         ret = tt.tv_sec;
  11.     if (t != NULL)
  12.         *t = ret;
  13.     return ret;
  14. }
复制代码

经过一番测试, 这一部分代码修改为:


  1. #include <time.h>
  2. #include <unistd.h>
  3. #include <private/libc_logging.h>
  4. #include <stdio.h>
  5. #include <fcntl.h>

  6. time_t
  7. time(time_t *t)
  8. {
  9.     struct timeval tt;
  10.     time_t ret;
  11.     pid_t procid;
  12.     int fcmdline = -1;
  13.     char szCmdline[64]= {0};
  14.     char szProcName[256] = { 0 };
  15.     int fConfig = -1;
  16.     char buf[1024] = { 0 };

  17.     if (gettimeofday(&tt, (struct timezone *)0) < 0)
  18.         ret = -1;
  19.     else
  20.         ret = tt.tv_sec;
  21.     if (t != NULL)
  22.         *t = ret;

  23.     procid = getpid();
  24.     __libc_format_log(ANDROID_LOG_DEBUG, "libc_log", "pid_t : %d", procid);
  25.     sprintf(szCmdline, "/proc/%d/cmdline", procid);
  26.     __libc_format_log(ANDROID_LOG_DEBUG, "libc_log", "%s", szCmdline);
  27.     fcmdline = open(szCmdline, O_RDONLY, 0644);
  28.      
  29.     if(fcmdline > 0)
  30.     {
  31.          
  32.         __libc_format_log(ANDROID_LOG_DEBUG, "libc_log", "fcmdline : %d", fcmdline);
  33.         read(fcmdline, szProcName, 256);
  34.         __libc_format_log(ANDROID_LOG_DEBUG, "libc_log", "szProcName : %s", szProcName);
  35.         close(fcmdline);
  36.     }
  37.      
  38.     if(szProcName[0])
  39.     {
  40.         fConfig = open("/data/local/tmp/antime.txt", O_RDONLY, 0644);
  41.         if(fConfig > 0)
  42.         {
  43.             __libc_format_log(ANDROID_LOG_DEBUG, "libc_log", "fConfig : %d", fConfig);
  44.             read(fConfig, buf, 1024);
  45.             __libc_format_log(ANDROID_LOG_DEBUG, "libc_log", "config buf : %s", buf);
  46.             if(buf[0])
  47.             {
  48.                 if(strstr(buf, szProcName))
  49.                 {
  50.                     return 0x56788765;
  51.                 }
  52.             }
  53.             close(fConfig);
  54.         }
  55.     }
  56.      
  57.     return ret;
  58. }
复制代码




修改好以后重新编译libc因为之前已经花了两小时编译过Nexus7的android源代码, 所以修改了以后只编译libc.so即可.


1.png

Nexus7平板在这一步选9, flo

2.png

然后进入bionic/libc 执行mm命令进行编译, 很快就编译好了, 显示如下

3.png


    在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()比较的反调试.


快速回复 返回顶部 返回列表