-
-
[讨论]仿fill-array-data-payload混淆尝试(失败)
-
发表于:
2014-4-18 12:32
6439
-
[讨论]仿fill-array-data-payload混淆尝试(失败)
http://dexlabs.org/blog/bytecode-obfuscation
老文了
文中提到利用的条件之一是长度不一定
查了下pseudo-instructions,发现还有:packed-switch和sparse-switch
测试用的是sparse-switch
ident ushort = 0x0200 // id
size ushort // case数
keys int[] // int case-values
targets // offsets
首先插smali:
const/4 v0, 0x0
if-ne v0, v0, :cond_START
sparse-switch v0, :sswitch_data_SOMEDATA
:sswitch_GOTO_BEGIN
goto :cond_START
:sswitch_data_SOMEDATA
.sparse-switch
0x0 -> :sswitch_GOTO_BEGIN
.end sparse-switch
nop
nop
nop
nop
:cond_START
我用了一个case,并预留了一段空位,相当于两个case
正常dex如下:
.short 0x200
.short 1
.int 0
.int 3
强制改成3个case
.short 3 //强制3位
.int 0, 3, 4 // 0是准备switch到的,1占的本来0跳转的位置,3占了一组nop nop
.int 0xF, 0x4206F, 0x106E0032
// 0xF占了一组nop nop,0xF*2是相对swtich语句的偏移,0x4206F, 0x106E0032实际是正常代码
最后配个图:虽然混淆了,但执行不过……
测试结果是失败 FC
我初步结论是,switch-case的跳转不能瞎跳,即使逻辑上走不到,系统也会检查跳转点……
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)