程序界面,点击按钮"爬一层楼"则已爬的楼层+1按钮"爬到了,看FLAG"无法点击 1.分析清单文件,获取包名,以及入口类 2.分析入口类 3.AndroidKill修改并重新编译 此时,重新安卓编译后的APK,点击一次已爬楼层按钮后,则能够点击出现FLAG了虽然此时已经告破,但是想研究一下so层的反调试和so层的方法具体做了什么
1.发现不是静态加载方法,那么应该是JNI_onLoad动态注册;发现在JNI_onLoad前还有_init函数,所以分析顺序:_init->初始化数组->JNI_onLoad->注册方法 2.分析_init 2.1但是奇怪了,动态调试了好几次,都在fork()后就出错了,提示:got SIGCHLD signal (Child status has changed)
3.接下来就能够断在JNI_onLoad函数 3.1通过动态调试JNI_onLoad的注册方法的参数,获得注册方法位置是0xF90 分析传入参数,通过算法便能计算除FLAG
3.1但是很奇怪,找到注册方法后,并且下了断点,放开程序运行,结果加载失败,程序并不会运行起来,而是就卡在那,但是IDA动态调试页面却又是运行状态3.2是否是在_init的时候nop那句fork出现了问题?导致无法加载成功?3.3分析_init具体是如何反调试的呢?
上传示例apk,以上几个问题还望有大神能够解惑!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
可以用frida hook (需要设置frida为spawn模式启动,可以绕过ptrace反调)
android.widget.Button.setClickable()
修改参数为true即可
启动参数:frida -U -f com.ctf.test.ctf_100 -l palouti.js
脚本如下
function hookSetVisibility() { Java.perform(function () { let Button = Java.use("android.widget.Button"); Button.setClickable.implementation = function (arg) { console.log("button clicked"); return this.setClickable(true); } }) } setImmediate(hookSetVisibility)