据统计90%查看本帖的人,都已经注册本站了哦
您需要 登录 才可以下载或查看,没有账号?立即注册
×
第一次分析绑绑加固,我并不是想脱壳只是想看看他怎么反调试的,这里记录下分析的过程。语言组织不好如果有需要的同学将就看看吧。在调试的时候开始还是很痛苦的我也不知道他加了什么混淆反正乱七八糟的流程没法看,只能一路F8,碰到函数调用就看看是什么函数,调用完后看看返回值。在分析的过程中看到他读取.cache目录下的文件,有点怀疑这里面有个是加密的dex文件,但是我没分析不知道是不是。其中我记录了下java层Helper.attach函数对应的jni层函数pC06BEE7ED252466C74DFD6BA9BB3761D。当前分析的这个某银行apk,我没有完全过掉反调试,其中他检查xposed的代码我没找到,我有点怀疑是某银行apk自带的检查,可以正常单步pC06BEE7ED252466C74DFD6BA9BB3761D这个函数了是不是绑绑的反调试已经过了呢?为了验证这点我特意找了个绑绑免费版的来测试把反调试挂起后可以正常启动apk并且调试器能单步(其实我心里也没底不知道这个检查xposed是不是绑绑的),下面开始记录下分析过程。 用JEB打开后发现就这么几个类,肯定是已经加固,下面看看是什么加固 打开manifest文件查看Application中android:name=”com.secneo.apkwrapper.ApplicationWrapper” 看到这个包名我也不知道是什么加固,好吧百度下发现是绑绑加固。 分析ApplicationWrapper类基本上没什么值得看的,我唯一就看到DexHelper这个so,其中还有个Helper.attach这个本地函数。 一、静态分析DexHelper.so 双击查看.fini_array节,跟反调试无关,这个函数应该是默认就有的 双击.init_array节就两个函数,看了下和反调试也无关 搜索函数名也没找到一个带java开头的jni_onload也没有找到。 二、定位android 5.1.1调用.init_array和jni_onload函数位置 5.1和4.x的定位init_array和jni_onload函数时函数名不一样,这里又去分析了下5.1的安卓源码,最后得到如下结果。 库名称:linker.so 库中函数:__dl__ZN6soinfo12CallFunctionEPKcPFvvE 或者搜CallFunc 定位函数:init、init_array 这里是一个循环调用init和init_array里面的函数 库名称:Libart.so 库中函数:LoadNativeLibrary 定位函数:JNI_OnLoad
三、动态调试 上次ida服务端并修改权限(如果是android 5.1.1执行下setenforce 0)并启动服务端 打开ddms PC端执行:adb forward tcp:23946 tcp:23946 调试模式启动样本 IDA勾选三个选项 1、搜索linker 2、双击linker后搜索callf字符,搜索到一条函数,双击进入在BLX R4位置下断点 等到ida断下来后在搜索DexHelper 双击libDexHelper.so然后搜索反调试启动函数pC581A42EFB2AAD3B6AF364A8F62E12C1 分析:Anti_thread_of_process_debug函数 此函数中就开启一个反调试线程,线程的工作函数是anti_thread_body函数 分析:anti_thread_body 此函数中是两个真正反调试函数 函数名:check_process_stopped 检查方式:读取/proc/pid/status 关闭调试器:在此函数返回结果如果为1就关闭调试器 函数名: scan_process_threads 检查方式:/proc/%ld/task/%ld/status 发现调试处理方式:关闭自己进程 p9E564BF70FB6A12645A2B50089E954*F函数关闭进程或者线程 分析创建文件监控线程:pC426CE2D6B3F9A9FE75F1D256DFFD221 分析线程工作函数:p6754DFD410A22891F26AFD5F3F382337 此函数调用inotify_ini创建一个文件监控并把以下文件添加到监控列表中 // 添加监控文件/proc/pid/mem // 添加监控文件/proc/pid/pagemap // 添加监控文件/proc/pid/task/tid/mem.map // 添加监控文件/proc/pid/task/tid/pagemap 文件监控响应函数:pBC302C2BE60951E2155CBFB5225953BC 这个函数里面不知道干什么,没看到有关闭调试器进程,也没看到有关闭自己进程,都是修改一些值,难道是防止内存dump?或者是单步的时候修改了指令?没有时间去分析这个函数,有分析过的大神求解答。 四、挂起反调试线程过掉反调试 4-1:IDA调试开启后等待DexHelper加载进来 4-2:搜索libc库双击打开在搜索pthread_create函数 4-3:在pthread_create函数开始位置下断点 在这里断下来后R2是线程执行的代码,GO到R2的代码处(如果不是函数的样子就按p键)在函数的开始位置下好断点。 当前PC是在libc中,需要回到调用创建线程的位置处在下一个断点 Ida直接F9会在cmp这里断下来,这个时候会多出一个线程,一般排在最下面,把它挂起。
这个是创建文件监控线程,把它也挂起,挂起步骤和挂起上一个线程一样。 如果之前在java层Helper.attach对应的jni层函数(pC06BEE7ED252466C74DFD6BA9BB3761D)下好断点的话,IDA直接F9就会断在这个函数中,这个函数会被调用两次,看java层刚好在两个函数中调用。
|