首页
社区
课程
招聘
[原创]360无线攻防第三题详细分析
发表于: 2014-6-7 18:29 38098

[原创]360无线攻防第三题详细分析

2014-6-7 18:29
38098

来看雪混了快一年了,由一年前的“不会汇编,不会android”的超级新手,慢慢变成了新手,这不得不感谢看雪各位大牛的无私分享!前几天偶然见到“风随雨行”大大的360无线攻防第三题粗解,很是手痒,就断断续续花了6天的时间进行了详细分析。处女贴,有什么不对的地方望大家指正!
    分析文档,代码和apk均在附件中。

360crackme分析

1 概述

该crackme的核心验证程序在libqihoo.so中。这个动态库经过了加密、清除elf文件的节区信息、花指令等处理,无法直接使用IDA进行静态分析。所以需要使用动态调试。不过如果仅仅使用动态跟踪的话,是很难分析出最后结果的。所以应当想法获得正确的libqihoo.so文件,然后结合动态调试、静态分析,最终分析出验证机制。

2 破解方法

2.1 获取较为正确的libqihoo.so文件

这里之所以使用较为正确,是因为我从内存dump出来的libqihoo.so文件并不完全正确,不过核心代码均有了,只是IDA没能自动识别出export函数(malloc,memset等),需要我们分析的时候自己加以判断,只要熟悉这些函数就很容易判断出来。

获取so文件的方法很简单:使用动态调试附加上crackme之后,运行几次确保so已经加载到内存,然后ctrl+s查看so在内存中的起始位置,再到hex-view窗口中dump出这段内存,另存为libqihoo.so,然后另起一个IDA静态分析即可。IDA分析后的可以发现在Function widows有了我们关心的JNI_OnLoad和verify函数:

如图所示:


2 开始分析

通过分析发现JNI_OnLoad函数将JAVA层的verify函数同so中的verify函数进行了关联。所以我们直接开始分析verify函数即可。Ps:方便大家查看,我将我分析过程中提取的关键代码也放出来,在360crackmeARMcode.c中,大家可以参照着看,那里面有详细注释。其中逻辑简单的我保留了汇编代码,逻辑复杂的就手工转换成了c代码。

2.1 JAVA层传递的参数

JAVA层传递三个参数username, emailaddr, serialNum。这三个参数均为String类型。

2.2 so文件的花指令模式

Libqihoo.so中加入了大量的花指令,这无疑增加了逆向分析的工作量。不过只要理清了它的花指令模式,我们完全可以一劳永逸地解决这个麻烦。它的花指令模式如下:

typedef struct inputInfo{
	char *username;
	char *emailaddr;
	char *serialNum;
}inputInfo;

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (38)
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持...
2014-6-7 21:41
0
雪    币: 35
活跃值: (139)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
围观....
2014-6-7 23:16
0
雪    币: 4769
活跃值: (4194)
能力值: ( LV8,RANK:138 )
在线值:
发帖
回帖
粉丝
4
膜拜………………
2014-6-8 00:54
0
雪    币: 29
活跃值: (499)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
哈哈,处女贴竟然得了个优秀,值了!
开始分析的时候还是很困难的,不过越到后面就越熟练,只要有耐心,大家都能破出来。
ps:话说,没有大牛帮忙解释下360是如何使得这个so无法进行ida分析的么?或者给个相关资料链接也行啊~
2014-6-8 10:57
0
雪    币: 188
活跃值: (631)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼主分析的不错,分析文档后面两个问题提的很到位。
2014-6-8 14:58
0
雪    币: 7
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢分享,学习下
2014-6-9 09:46
0
雪    币: 230
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
多谢分享!
2014-6-10 22:29
0
雪    币: 59
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
请问一下,里面的so是用什么工具动态调试的,我用ida6.1一直断不下来
2014-6-11 10:36
0
雪    币: 29
活跃值: (499)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
10
我使用的ida6.1加小米2s,动态调试完全没问题。你可以参考非虫大大的《Android软件安全于逆向分析》8.5.2中的介绍来操作。
2014-6-11 16:15
0
雪    币: 59
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
今天下午实验了一下,发现可以动态调试,只是在ida上寻找关键断点时,因为对设置ARM指令还是Thumb指令不是很清楚,断点没设置好,这方面还得学习一下。顺便想请教一下,在程序加载so文件以后,将所需so dump回来以后,是不是还得做一些还原的工作,才能恢复正常的elf文件,用以反汇编分析,这方面您是怎么做到呢
2014-6-11 21:20
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
赞,学习了
2014-7-8 13:47
0
雪    币: 250
活跃值: (251)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主分析解决了 最后的两个问题吗?
2014-7-15 18:10
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
前排支持
2014-7-15 18:12
0
雪    币: 230
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
看楼主这么卖力的,俺凑个热闹

先上个修复图,不明白的看下elf文件结构。



其实这个修不修复没啥影响。就未修复的来说,ida 静态加载虽然会弹错,但导出函数能正确识别,只是不能区分有些section。看jni_onload, verify就知道是被加密了,那前面肯定有个解密函数。翻翻ida能识别的代码,大概齐__gnu_armfini_26就是你想要的解密。

当然修复了更直观,直接可以看到 __gnu_armfini_26x 在.init_array section。

再说下另外一个问题,动态加载的时候根本木有还原。section header table没被破坏,所以加载器能够正确识别。
上传的附件:
2014-7-22 14:46
0
雪    币: 29
活跃值: (499)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
16
感谢指点。我先消化消化~
2014-7-22 23:24
0
雪    币: 181
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
高端 咱也学习学习 我竟然不知道IDA可以静态调试的~~~~~
2014-7-24 09:06
0
雪    币: 29
活跃值: (499)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
18
按照您的指点,成功修复了elf。也发现了so加密函数就在__gnu_armfini_26(init.array节中)。不过这部分代码过于复杂,静态分析起来难度太大,需要结合动态分析才能弄清它的加密算法。
现在问题又来了:鉴于init.array只有在so初次加载的时候执行,所以必须在so刚加载的时候就下断点,然后才能动态跟踪init.array中的函数。
大牛你看下能不能在init.array下断点。望告知方法,不胜感激!
ps:我也使用了am start -D这种方式,但IDA始终不能断在libraries load处。我的调试环境是小米2s和IDA6.1,不知是不是IDA的问题。
2014-7-24 10:12
0
雪    币: 29
活跃值: (499)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
19
额,我静态分析搞定部分了 ~~就是有点费时费力~ 不过还是跪求下断点方法~
2014-7-24 16:16
0
雪    币: 275
活跃值: (254)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
20
期待楼主脱壳!!!
2014-7-25 13:56
0
雪    币: 230
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
1, 还用am start, 换个新款的ida
2,patch so (p14) 替换原来的。
2014-7-26 18:09
0
雪    币: 29
活跃值: (499)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
22
[QUOTE=lasvegas;1303851]1, 还用am start, 换个新款的ida
2,patch so (p14) 替换原来的。[/QUOTE]
  新款IDA~等我肾长出来了再说吧~
2014-7-26 22:11
0
雪    币: 250
活跃值: (251)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
[QUOTE=lasvegas;1303851]1, 还用am start, 换个新款的ida
2,patch so (p14) 替换原来的。[/QUOTE]

6.4的可以断下来吗?
2014-7-30 11:35
0
雪    币: 188
活跃值: (167)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
24
至于最后一个问题: 节头信息和一些节名字符串是在elf文件中完全没有用的。完全可以抹掉。对于链接试图的文件中,linker是根据段进行加载的。section header是没有用处的
2014-8-5 19:52
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
lz知道它native函数是怎么注册的吗,感觉找到了注册的地方,调用了libvm.so中的方法,但原理不太明白
2014-8-21 20:27
0
游客
登录 | 注册 方可回帖
返回
//