首页
社区
课程
招聘
[原创]编译libc.so过time函数反调试
2019-1-3 20:52 9789

[原创]编译libc.so过time函数反调试

2019-1-3 20:52
9789

根据论坛各位大神的文章,了解了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()比较的反调试.


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2019-1-3 20:55 被熊趴趴来编辑 ,原因:
收藏
点赞3
打赏
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  junkboy   +1.00 2019/01/04
最新回复 (12)
雪    币: 11716
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
junkboy 2019-1-4 00:09
2
1
支持
雪    币: 6571
活跃值: (3823)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
LowRebSwrd 4 2019-1-4 10:22
3
1
好思路!
雪    币: 2932
活跃值: (2577)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
小调调 2019-1-4 15:48
4
1
厉害啊,果然还是从源头上反调试最强
雪    币: 7074
活跃值: (3468)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
bxc 6 2019-1-4 17:42
5
1
骚操作!
雪    币: 12
活跃值: (168)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
EMSFROG 2019-1-5 10:56
6
1
hook 不能实现嘛,编译系统太麻烦
雪    币: 60
活跃值: (479)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
uvbs 2019-1-5 22:55
7
1
EMSFROG hook 不能实现嘛,编译系统太麻烦
hook 就得需要安装hook框架,最后又会变成检测hook框架bypass, 
雪    币: 183
活跃值: (998)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
yy大雄 2019-1-7 09:53
8
3
会影响程序的正常功能吧
雪    币: 1744
活跃值: (8728)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
你瞒我瞒 2019-1-10 13:54
9
0
熟悉源码就是好,还有会c++
雪    币: 21
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
windxiang 2019-1-11 17:37
10
0
这是一种思路。不知道Windows下有没有类似的方法。
雪    币: 3343
活跃值: (2922)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
D-t 2019-12-3 16:51
11
0
有没有编译好的谷歌5 可以购买
雪    币: 2330
活跃值: (1104)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
FraMeQ 2019-12-3 16:55
12
0
好了,我知道了,等会把代码改成时间差必须大于0(狗头)
最后于 2019-12-3 16:55 被FraMeQ编辑 ,原因:
雪    币: 2366
活跃值: (1755)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Lakitu 1 2019-12-5 10:06
13
0
这个方法不是很好,不灵活,可能会影响程序正常功能
游客
登录 | 注册 方可回帖
返回