杂七杂八

static

c 语言中 static 关键字 代表只能在模块中访问,比如静态函数,静态变量名。在android中,static声明的函数是直接变成内联函数。
static 变量,如果初始化了,会放在.data段,如果没有初始化,会放在.bss段

关于hook

常见的是got hook ,inline hook ,还有java的method hook .

got hook 只能针对 导入函数,这个其实也是一个got 相关的问题,什么函数会进入到got 表。 这个是他的局限
调用导入函数的时候先进plt,plt 里执行一个jmp 操作 ,第一次跳转到got.plt ,但是got.plt 存的是plt的下一条指令,然后把重定位的offset push 到栈,然后调用_dl_runtime_resolve 解析函数的名字,然后搜索符号地址,最后给got.plt 赋新的地址,下一次就直接进去

inline hook 修改函数头几个字节,然后跳转到hook函数,但是对字节数偏少的函数处理比较麻烦

java hook ,常见的框架是去修改method artmethod 的函数指针达到效果的

关于反ollvm

通过阅读源码 以及 quarkslab 的文章,可以发现通过匹配可以直接去掉ollvm ,但是这里有个问题是对应字修改过的ollvm ,如何找一个通用的方法去对抗sub fla bcf

调用约定

ATPCS 函数调用约定

a+b

clang
mov -0x4(%rbp),%edx
add -0x8(%rbp),%edx

gcc

mov -0x1c(%rbp),%edx
mov -0x18(%rbp),%eax
add %edx,%ea

调用已移除api

Android sdk 29 的时候移除了一个api 的调用,如果compilesdk 设置为29 就会报错找不多符号,但是28不会报错。既然29中没有了,那么直接在项目里移除是最方便的,但是为了兼容,查了官方的一些邮件,说这个api 有bug所以才移除的,如果还是想用的话,就只能通过反射去调用。

binary data 16

Binary data 16 is incorrect, maximum possible value is 0. Do you want to continue with the new value?

ida 分析android so的时候 会出现上面的弹窗,主要是文件格式上出了问题,他会优先读取section的信。解法很简单,直接把sh_off 置位0就行。