android libc 有哪些函数_[原创]编译libc.so过time函数反调试

本文介绍了如何通过修改Android内核源码中的libc.so,规避time()函数的反调试机制。作者详细展示了如何在Nexus7设备上,找到并修改time()函数的源代码,添加检查进程名称的逻辑,当检测到特定应用时返回固定值,以绕过反调试。最后,作者说明了重新编译libc.so并替换系统库的步骤,成功实现了对特定应用的time()函数篡改。
摘要由CSDN通过智能技术生成

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

time(time_t *t)

{

struct timeval tt;

time_t ret;

if (gettimeofday(&tt, (struct timezone *)0) 

ret = -1;

else

ret = tt.tv_sec;

if (t != NULL)

*t = ret;

return ret;

}

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

#include 

#include 

#include 

#include 

#include 

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) 

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即可.

54b337f314aec893a32c377b58e3a1c0.png

Nexus7平板在这一步选9, flo

2b8f2575da784785dfc707fd28c8613d.png

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

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

最后于 2019-1-3 20:55

被熊趴趴来编辑

,原因:

JNI(Java Native Interface)是Java和C/C++等本地代码进行交互的一个接口。在JNI中使用C++标准库(libc++)中的函数,需要完成以下步骤: 1. 首先确保你的系统中已经安装了C++标准库,并且能够找到`libc++_shared.so`文件。通常这个文件位于`/vendor/lib64`目录下。 2. 在Java代码中声明native方法。这可以通过在Java类中使用`native`关键字来标记一个方法来实现,如下所示: ```java public class MyClass { static { System.loadLibrary("mylibrary"); // mylibrary是你的本地库的名称,不包含前缀"lib"和后缀".so" } public native void myNativeMethod(); // 声明native方法 } ``` 3. 使用`javac`编译你的Java代码。 4. 使用`javah`生成头文件。这一步将为你的Java类中的native方法生成C/C++的头文件,这个头文件将用于创建本地方法的实现。由于CSDN开发的"C知道"是在类ChatGPT模式下运行,可能不支持直接执行命令,所以你可以手动使用如下命令行: ```shell javah MyClass ``` 这会生成`MyClass.h`文件。 5. 实现本地方法。使用C++编写代码实现Java中声明的native方法,并包含上一步生成的头文件。在实现中,你需要包含`jni.h`以访问JNI函数,并使用`std`命名空间中的函数。例如: ```cpp #include <jni.h> #include <iostream> #include "MyClass.h" using namespace std; JNIEXPORT void JNICALL Java_MyClass_myNativeMethod(JNIEnv *env, jobject obj) { // 在这里使用std命名空间下的函数 cout << "Hello from C++" << endl; } ``` 6. 构建你的本地库(.so文件)。这一步你需要使用适当的构建工具,比如`ndk-build`或者CMake,来编译你的C++代码并生成`.so`文件。 7. 确保你的应用程序能够加载这个库。在Java代码中,你可以使用`System.loadLibrary("mylibrary")`来加载你的本地库。 8. 调用Java中的native方法。一旦加载了本地库,你就可以在Java代码中调用声明的native方法了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值