Android简单静态分析
安卓逆向会涉及一些java的常用函数,这里整理了一些wiki上的例题中出现的函数。
CTF Wiki总结
- 基本方法:通过对Java层或原生层的代码进行静态分析和动态调试,分析程序的功能。
- 关键代码在.xml 文件中。
Java层
- this.myDataBase.:意思是进行了数据库的访问。
获取数据库文件的指令:adb pull 数据库路径/数据库名称
- getCrc(): 返回未压缩条目数据的 CRC-32 校验和;如果未知,则返回 -1。
- Smali,Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种.dex格式文件的汇编器,反汇编器。可以利用 smali.jar 将 smali 汇编为 dex 文件:
dex文件:Android平台上可执行文件的类型,包含应用程序的全部操作指令以及运行时数据。java -jar smali.jar assemble src.smali -o src.dex
dex文件的产生途径:当java程序编译成class后,使用dex工具将所有的class文件整合到一个dex文件。
(附上一篇dex文件的解说,内含dex文件的结构、内容)
因此对dex文件进行反编译,能得到原java代码各个class的信息。(wiki上使用的是jadx工具)
原生层
基本思路:提取so文件-> ida反编译so文件->结合java层的代码进行分析
- so 文件:动态链接库,是二进制文件,即ELF文件。
内外都有接口,导入IDA中能查看到Exports窗口(导出表,方便Java层能调用SO层的函数)
和Imports窗口(导入表,方便SO层调用Java层的函数)。 - apk的主活动在“activity”标签上。
- RegisterNatives:通过动态注册来绑定native函数。
System.loadLibrary(“native-lib”):加载这个动态链接库(将代码加载入内存中)。
JNINativeMethod结构体有三个成员,第一个是java层的方法名,第二个是方法签名(括号内是参数类型括号后是返回类型),第三个是C函数指针。这样三个参数就便成了一组注册信息。
(直接查看第三个参数即可得到具体的注册信息)
(这个函数的实现我还没看懂,先附上篇解说的文章,看懂后再更新…)
攻防世界例题
app2
首先用android逆向工具(该工具安装比JEB简单多了,附上下载链接,墙裂推荐)提取其中的dex文件
再将生成的dex文件转成jar文件(生成后会自动用JD-GUI打开):
查看MainActivity,发现其调用了SecondActivity
在SecondActivity中它又调用了doRawData函数
点进去跟进一下,发现它用了loadLibrary函数,就是之前说的将代码加载到内存中。这时就需要去看so文件了。
将其中一个so文件拖进ida中查看(这里我拖的是libJNIEncrypt.so),找到doRawData函数。
按下tab键查看汇编语言,可知AES加密的密钥是 “thisisatestkey==”
拿这个密钥去解SecondActivity中的"VEIzd/V2UPYNdn/bxH3Xig==",解出来的是aimagetencent
没啥头绪。看过一些wp里面的不同方法,有的是把apk文件放到安卓系统上,拿这个解出来的字符串当账号密码登录,不行;有的是访问aimage/tencent网站,也不行。实际上解得的这串字符没有意义…
但是在看回class文件,会发现有个FileDataActivity没有调用过。点击查看,有个“setText”函数:
拿这一串字符串再去解密,就解出来了。