出题人博客:https://blog.csdn.net/u011247544
- cygwin可运行linux程序如readlef来查看elf文件。
- 还配置了开源项目LIEF用py解析elf
出题人写的got表hook:https://blog.csdn.net/u011247544/article/details/78564564
有续
经解析在init_array中被指向。
且type为E
但是这里的elf被破坏了.
但是加载elf用的是progrem header,section无用,因此查看elf信息可以直接查看progrem header中的dynamic段,内部为一个一个项,以type区分用途,其中就包含init、got等
但是用cygwin+readelf查看ph:
找到0x34cd0处ida打开:
此时含有大量垃圾指令,需要动态调试。断在init的方法:
http://www.blogfshare.com/linker-load-so.html
pull出system/bin/linker 在ida中分析出”[ Calling %s (size %zd) @ %p for ‘%s’ ]”处:
_dl_ZL13call_functionPKcPFviPPcS2ES0((int)”function”, (char **)(v4 + 4 i), v5):
((void (__fastcall *)(int, int, int))v3)(_dl_g_argc, _dl_g_argv, _dl_g_envp);就是调用init_array init_proc
的地方。
其中的函数开启线程检测/proc/self/status反调试。hook jni_load函数。
mprotect调用了两次,第一次修改JNI_OnLoad的偏移,由0x8205修改为0xA260 ,jni_onload中FindClass与RegisterNatives注册native函数0xAC98。
第二次mprotect调用就是解密0xAC98处的验证函数。分析验证即可。
不要随意在jni_load直接下断点,可能会检测是否更改这俩处。而且hook 符号表了后不会走jni_onload符号处的函数?不是一次性读取完符号表的么?还是init之后读?。
2018.6.28:
由于无法断在jni_load处,(没找到libdvm.so,经询问得知5.0后全是art执行….)无法得知真正的jni_onload内容。
5.0后在libart.so中调用,这里变动较大,需要分析8.0源码。
只能动调init那几个函数分析关键调用了,因为hook与解密,反调试等操作肯定会用到几个系统调用:pthread_create,mprotect与_NR_openat。在这里作者存了几个关键函数(各种非正常调用系统调用的方式?):
|
|
发现自己所欠缺:密码学,ida脚本dump,android系统源码知识(源码中8.0下apk执行流程)、linux系统知识。反调试与混淆法不熟悉