第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