1625-5 王子昂 总结《2018年3月9日》 【连续第524天总结】
A. AndroidSection加密题目 (2)
B.
注意点
adb的冲突
以前当DDMS开启时,cmd中的adb就会被终止
而再开启cmd中的adb的话,DDMS又会被终止
使得我以为adb和DDMS是冲突的
但是查询发现调试JNI_Onload必须在开启DDMS的状态下,又用IDA附加,说明两者是可以同时进行的
另外一条关键性的证据是cmd启动adb时会报一个错
adb server version (32) doesn’t match this client (36); killing…
说明DDMS中也启动了一个adb,而关键在于这两个adb不兼容
查询了一下,发现电脑里有无数个adb,包括Android-sdk、夜神(NOX)都附赠了adb.exe,以前用的时候是随便拖了一个放进Path中的
那么只要使cmd中的adb与DDMS中的adb是同一个就行了
查询DDMS启动的adb是哪个呢?我在它的根目录下找了没有发现,而父目录中的platform-tools\adb.exe虽然同属一个工具包,但是也不是同版本
最后想到用任务管理器来查找该进程的路径:
成功抓住,原来是在SysWOW64中的adb啊
复制到system32中覆盖原来的adb即可同时使用了
JNI_Onload的调试
注意DDMS是已经开启的,否则在jdb启动时会报致命错误 附加JVM失败
之前调试so的时候没有需要断JNI_Onload的情况,所以一直都是adb直接启动android_server,然后IDA附加
这次有需求了,因为解密过程在JNI_Onload之前,应该是.init_array中进行的
首先执行
adb shell am start -D -n com.tencent.demo.cracknet/.MainActivity
将进程以调试模式启动,然后它会在开始之前等待着被附加
此时将IDA附加上去,断在libc.so后要设置debugger option中的中断
如果不设置的话,将会导致
- 找不到libnet.so
- libnet.so中没有导出符号
原因是本程序运行后将会删除(除名?)具有X(可执行)权限的libnet.so区段,使得IDA没有发现JNI_Onload的存在痕迹
如果断到了这个区段,之后会存在一个debug096的区段来取代它,upload函数和JNI_Onload都存在该区段中
查询发现debug区段的意思是
通常,这些是在调试过程中分配的区域。有些与堆相关,有些与操作系统的实现有关,有些可能是由与您交互的另一个进程分配的页面。他们在那里是因为IDA需要为您提供一个接口来查看内存,因为它实际上是在内存中布局的,就像任何其他调试器一样。
将它们与IDA的内置细分设施集成,可以更轻松地与其他组件和第三方插件配合使用。
它们被复制,.debug???因为这些段是可执行文件调试环境的一部分。这些数字只是顺序的,并没有真正的意义。
PS有关这些内容的暗示:IDA不会不断更新它们,并且有时可能需要IDA重新扫描调试过程的内存以确保查看最近的内存快照。至少在IDA 6.6的情况下,情况可能已经改变。
设置完成后在cmd中输入
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
使中断的进程恢复运行,即可断在模块加载的linker上了
第一个断住的就是libnet.so,可以看到此时的符号已经有了
双击JNI_Onload可以跳转到该地址去,但是此时还未解密,只是一堆不可读的数据
理论上来说找到linker的dlopen后,就能找到.init_array加载、解密的地方了
留待明天实践吧233
总之断住以后再运行即可找到libnet和其中的JNI_Onload了
C. 明日计划
Android