AirJD 焦点
AirJD

没有录音文件
00:00/00:00
加收藏

手机软件反分析 by 曾凡宇

发布者 security
发布于 1449709351659  浏览 5411 关键词 移动开发, 固件Firmware 
分享到

第1页

手机软件反分析

IDA篇



第2页

没有F5的日子

• 没有Hexrays, 还可以肉眼反编译啊 • 再加上没有Thumb2, 16bit指令包含的立即

数还有包含移位, GCC频繁使用EOR来生成有 效bit较多的立即数, 而不优先用text pool的 话



第3页

分析点参数是没问题的



第4页

分析逻辑就比较头大



第5页

Epi/prolog都诡异起来



第6页

鸡肋鸡肋食之无味

• 除非有很多自由时间的人, 或者睡不着觉的, 才会很开心地去手动分析

• 0x1234 可以分解为34|12<<8, 1010+0202+22, 看编译器们或者我们当时的心情



第7页

IDA的癖好

• BLX享有高优先级, 连data都无法幸免

• 只要POP列表含有PC, 优先当成函数末尾. 手 动定义函数末尾后Hexrays依然不认账



第8页

手动定义后的结局



第9页

IDA的癖好

• panic之类函数不手动标为noreturn的话,在 末尾调用这类函数的caller很容易保持散ß代 码状态, 不会识别为功能.

• 只要发生BL/BLX均认为r0~r3一定会丢失 • b一个blx r4/rx的指令, 会标记该指令为函数 • 不认可同一个函数内应该有ARM/Thumb状

态翻转 • 把一些公共调用认成function thunks而且在

反汇编状态下标记的参数偏移量会歪掉



第10页

IDA的癖好

• 堆栈配不平影响很多参数识别, 强行中途假 配平后Hexrays仍会出现问题

• 如果一个函数经过F5错误识别, 错误识别的 参数会享有比未识别前默认的正确参数更 高的优先权, 会影响到调用方的分析

• 关闭IDA前F5的某些函数, 打开IDA后会再次 F5一遍但是不显示结果.



第11页

仅仅针对IDA软件本身的变形

• 使用NEON的额外用法 (复制清空, 隐藏调用 参数, 隐藏字符串)

• 操作堆栈推入参数和返回地址后pop {r0, r1, pc}取代call

• 插入复杂的, 不改动r0~r3的函数, 调用后造 成F5中变量传递过程识别错误 (断链)

• 插入SVC, 同时干扰反汇编和反编译 • 用复杂的函数实现lo寄存器向hi寄存器的传

值, 调用后一举两得



第12页

接上页

• 调整LR的值到后继地址后, 调用B, 实现BL, 可 以造成Hexrays在调用处中断分析或者识别 为JMPOUT

• 在程序中嵌入优化版的memcpy/strcat等函 数, 在这些函数中识别LR, 对特定的调用完成 额外功能.

• 违规使用SP正偏移的caller区空间, 试图造成 无法配平干扰F5, 甚至被识别为function thunk无法单独F5.



第13页

验证下r0~r3和lo hi传值效果

• 演示效果 handle和index被弄混了, printf的 参数被空函数吸走了



第14页

用三条组合下

• 加多一个ADD LR, F5就强制认为到此结束了



第15页

针对IDA新手的变形

• 部分加壳 (ios上需要越狱环境, android不需) • 假导出函数 (dlopen时候填充caller的plt) • 抠系统函数 (SVC或者_internal) • 返回前篡改dyld/linker的寄存器



第16页

通过栈中linker的返回地址…

• 返回前操作R5, 操作寄存器LR, R4都可以实 现特殊操作.

• 收集所有linker来分析, 很好兼容



第17页

使用caller的栈空间

• push寄存器, 编译器分配局部变量, 分配调用 超过r0~r3可传范围的函数, 都会减sp来保护 后继操作不会动到大于sp的数据.

• 通过伪装可以在C级别让caller调整sp给子函 数使用, 子函数中对其写入和用来调用子子 函数. 如果留出足够余量, 在子函数中可以 add sp, 这样一来基本可以被识别为function thunk



第18页

正常子函数不会侵犯调用方栈



第19页

果然生成了function chunk



第20页

F5报错, 试试强行改SP?



第21页

强改SP后F5, 关键参数被合并丢了



第22页

保护的目的

• 不想特有的算法被逆向使用 • 不想自己的整个代码被对手抠出来用, 或者

被补丁后包装成自己的用 • 个人开发者, 秘密全在流程, 同行的一旦动态

跟踪一次, 甚至不用逆算法就可以仿出来 • 自己产品要访问隐私数据, 不愿被杀毒软件

拦截



第23页

一些难以发挥作用的保护

• 显式调用ptrace, DENY_ATTACH或者TRACEME 可以简单F5或者通过strace发现, 在android 下也受到debuggable的影响

• 某些用ndk做dex加密的方案, 虽然双进程三 进程互相调试, 仍可以attach线程而dump

• 检查文件句柄, android中已经有很多被打开 • 检查父进程命令行, 通常都是zygote



第24页

针对人工的防护

• 使用MIPS, 68000或者其他代码密度低的指 令集, 制作板级模拟

• 为其编写基础的guest ROM,设计一些外设的 IO, 可以通过IO和host交互

• host发放虚拟的keypad操作在ROM中人工输 入操作



第25页

windknown



支持文件格式:*.pdf
上传最后阶段需要进行在线转换,可能需要1~2分钟,请耐心等待。