0x00 前言

小伙伴给我发来一道android题,涉及花指令,记录一下去除花指令和算法还原的过程。

样本

强网杯 flower.apk

0x01 花指令

花指令是企图隐藏掉不想被逆向工程的代码块(或其它功能)的一种方法,在真实代码中插入一些垃圾代码的同时还保证原有程序的正确执行,而程序无法很好地反编译, 难以理解程序内容,达到混淆视听的效果。

主要目的加大静态分析难度

1、不可执行的花指令

运行是不执行的汇编指令,会对反汇编造成影响,影响静态分析(如ida无法f5)

2、可执行的花指令

可执行花指令一般都是无意义的汇编指令,会被反汇编正常识别

参考:

http://dyf.ink/reverse/windows/anti-debug/junk-code/

https://www.anquanke.com/post/id/208682

0x02 算法还原

1、样本分析

(1) java层

d8b5952a7f086ea498ac741fab8194ec.png

(2) native层sub_F34

sub_F8E

0b5cc010dffc742d2d2ea4f5e69e0193.png

sub_FD0

a74591b422059bee6bb8c06327baede1.png

遇到JUMPOUT要进行path修复

JUMPOUT修复参考:https://bbs.pediy.com/thread-259062.htm

修复 sub_F8E

根据ida的提示sub_F8E应该跳转的位置是 0xFA4 = 0xF98 + 0xC

patch脚本

path之后要重建函数(神奇的P键)

5655dc9ea3cadefd2fe5d0f2bd3393a6.png

修复前

1b309232f00a79e596167b0090a8bfe3.png

44f731d8ad75b6592ac960db987b3b53.png

26dd6a394f90334f9dae8bbe6455a8b3.png

修复后

2d5977e24b46323b0cb2191087848ccc.png

e01fac7bef7761389e183be78f4f612e.png

702e19374986b37130f7b0ee7daed90d.png

使用如上方法对sub_FD0可以进行函数重建,让ida识别成功后可以使用F5.

2、去花指令

动态调试可以发现不可以执行的花指令

6199f3df3b11a733d48cc6680656b51c.png

经过分析可以将可以执行的花指令识别出来

将以上替换成

去花指令之前

5de35f54fc044df1632041956b21ccaf.png

去花指令之后(函数重建之后ida识别成功)

56b47c6b90c4fd235c55c9e51da4049e.png

去花指令之前伪代码

去花指令之后伪代码

3、算法还原

(1) 动态调试

根据伪代码结合动态调试进行算法还原

82abebb0ea25d125d35b3d2d2e2998bd.png

这里需要动态调试获取值

27f8931f602d198521c54370a44eadca.png

调试的时候断点参考 loc_11B0 loc_10AA

(2) 加密算法

加密过程

1、输入字符串

2、按首字符填充长度为首字符10进制长度 + 字符串长度 + 尾字符填充 = 128长度

3、循环128位字符 先与data1和data2进行异或,再循环 28x16(1-7 6-0) 次 进行高/低四位保留(0xf0 0xf 与运算),最后异或0x88

4、结果与data3进行比较

(3) 算法还原

加密

解密

运行结果:

f1cbe010d9440422c583e9546319136f.png

0x03 总结

1、识别花指令

2、对Jumpout进行修复

3、动态调试

4、算法还原

最后于 2020-9-19 11:56

被neilwu编辑

,原因:

上传的附件:

libnative.so

(17.58kb,26次下载)

libnative.so.idb

(322.23kb,18次下载)

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐