read time out解决方法_编译libc.so过time函数反调试

本文介绍了如何通过修改 Android 内核源码和 libc.so 来规避基于 time() 函数的反调试机制。作者详细展示了如何在 Nexus7 平板上重新编译 libc.so,使其在特定应用运行时返回固定值,从而绕过时间比较的反调试检查。这种方法涉及到 Linux 内核、进程信息读取以及文件系统操作。
摘要由CSDN通过智能技术生成

c29824399690fc5bdaaa10dfbe2fbfc7.png

根据论坛各位大神的文章,了解了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。

3b68cc9800540c3b1ab93a6953bb318a.png

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

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

原文作者: 熊趴趴来

原文链接:https://bbs.pediy.com/thread-248800.htm

转载请注明:转自看雪学院

更多阅读:

  • 加载内存对话框数据
  • VxPack 开源加壳软件---0.98,20周年纪念版
  • lz77压缩软件vs2015可编译源码
  • 010Editor 9.0注册机算法分析和爆破版(免注册机版)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值