android加固系列—5.加固前先学会破解,hook(钩子)jni层系统api
【版权所有,转载请注明出处。出处:http://www.cnblogs.com/joey-hua/p/5138585.html】
crackme项目jni的关键代码(项目地址见文章底部),获取当前程序的包名com.example.shelldemo和com.example.nocrack对比,正常运行结果是this app is illegal,这里的破解内容是hook strcmp函数来修改函数返回值来改变程序走向以达到running successfully。
1.工具介绍
Eclipse + ndk,编译jni源码
cmd窗口
2.准备工作
手机root。
在编译以下的c文件之前有个地方需要你自行修改,mystrcmp.c下的
com.example.crackme-2有可能是com.example.crackme-1
A.编译inject.c并传输
在Android.mk中输入,并编译生成inject:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := inject LOCAL_SRC_FILES := inject.c LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog include $(BUILD_EXECUTABLE)
然后打开cmd命令窗口进入到文件的目录下并输入:
adb push inject /data/local/tmp
将文件inject推送到手机的/data/local/tmp目录下
B.编译mystrcmp.c并传输
在Android.mk中输入,并编译生成libmystrcmp.so:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog -lEGL LOCAL_MODULE := mystrcmp LOCAL_SRC_FILES := mystrcmp.c include $(BUILD_SHARED_LIBRARY)
然后在命令窗口输入:
adb push libmystrcmp.so /data/local/tmp
3.开始hook
首先在手机上启动crackme,然后在pc端打开一个新的命令窗口,并输入:
adb shell
su
cd /data/local/tmp
chmod 777 *
ps | grep com.example.crackme
./inject 3166(这里对应的是你进程的pid)
这时候观察eclipse的logcat的INJECT标签就会发现
观察com.example.crackme
表明注入成功了,并且找到了strcmp函数,完整的意思就是已经把我们的libstrcmp.so注入到进程com.example.crackme里了。并且把我们自己新写的strcmp函数的地址替换掉了系统的strcmp函数地址,请看关键代码:
got_item = *(uint32_t *)(out_addr + i); if (got_item == old_strcmp) { LOGD("Found strcmp in got\n"); got_found = 1; uint32_t page_size = getpagesize(); uint32_t entry_page_start = (out_addr + i) & (~(page_size - 1)); mprotect((uint32_t *)entry_page_start, page_size, PROT_READ | PROT_WRITE); *(uint32_t *)(out_addr + i) = new_strcmp;
现在其实已经成功了,那么就来运行吧,首先在命令窗口按回车
然后在手机上点击按钮“检测是否被crack”
这时调用了我们自定义的strcmp,并获得了传递过来的两个字符串参数,并且始终返回成功0,见关键代码:
至此程序已破解。
【Hook项目地址】