首页
论坛
专栏
课程

[原创]一个section加密的apk的分析

2018-5-31 17:15 3098

[原创]一个section加密的apk的分析

2018-5-31 17:15
3098
这个apk是去年参加某个CTF比赛时候的一道题,当时没做出来,这几天整理文件翻出来了,决定再做一做,写点笔记。
题目描述:某企业反馈其员工专用手机上,被安装了一个间谍软件,该软件会不定期自动连接一个疑似黑客控制的服务器,服务器的连接密码内嵌在该软件中。逆向分析此间谍软件,获取其服务器的连接密码。
首先安装运行一下。

拖到jadx里面,可以看到java层并没有什么核心功能,关键是导入了一个net库,用了里面的upload函数。

解压apk之后得到libnet.so,拖到IDA里面提示First Section must be SHT_NULL,很有可能section被加密了。

在IDA里面看到有个.init_proc和JNI_OnLoad,JNI_OnLoad的代码应该是被加密过的。

那么这个时候我们就只能动态调试了,动态调试的步骤网上一搜一大堆就不再详细写了,这里在linker下的断点, BLX  R4之后就进入了.init_proc。


直到执行完sub_2C5A之后发现libnet.so已经消失了,取而代之的是debug077,同时JNI_OnLoad也被解密了出来。


这里需要导入JNI,在IDA7.0以下的版本中通常是通过这篇文章中的方法导入JNI的。在IDA7.0及以上的版本中有一种更简单的方法。View->Open subviews->Type Libraries,按下Insert,选择android_arm(IDA6.8里面没有这个库所以不能用这个方法)。

打开Structures,按下Insert,选择Add standard structure,选择_JNIEnv和JNINativeMethod。

把变量的类型改成JNIEnv*,Force call type,现在看起来舒服多了。

这里在JNI_OnLoad中通过RegisterNatives注册了java层需要调用的native方法,我们到0x7579411C看看。

IDA没有识别出来这个结构体,我们手动添加一下。右键Structure,选择JNINativeMethod,函数名为Upload,地址为0x7578E30C,这个函数就是我们在java层看见的函数了,到这个地址看看。

右键Create Function,但是提示debug077:7578FBD0: The function has undefined instruction/data at the specified address。


直接按C,全部转成代码,就可以创建函数然后F5了。

这里两个异或非常可疑,写个脚本看看异或之后的值是多少。

#include <idc.idc>

static main()
{
	auto start,end,ptr;
	auto key;

	start=0x75794004;

	key=0;

	for(ptr=start;ptr<=start+11;ptr++)
	{
		Message("%c",Byte(ptr)^key);
		key++;
	}
	
	Message("\n");
	
	key=0;
	
	for(ptr=start+12;ptr<=start+20;ptr++)
	{
		Message("%c",Byte(ptr)^key);
		key++;
	}
	
}

解出来这两个字符串就应该是答案了。
总结一下:
1.一定还是要用真机调试,bug少点,nexus4就两三百块钱。我等屌丝还是应该搞android,比学ios/macos便宜多了。
2.关于IDA导入JNI
这个文章中已经说了有两种方法,IDA7.0以下的版本需要手动导入jni.h文件,IDA7.0及以上的版本可以使用内置的库。
3.关于程序的debuggable选项

这一点文章中没提,如果程序的debuggable选项未开启就直接jdb去attach的话是调试不了的,会出现下面这样的错误。


可以修改AndroidManifest.xml中的debuggable="true"然后签名重打包;或者修改系统属性将defalut.prop中ro.debuggable设置为1。这两种方法操作起来其实都很麻烦而且容易遇到各种各样的问题,所以我一般用的方法一个是riusksk的BDopener,一个是netsniffer优化的mprop。这两个工具更方便。如果还是报错的话可以打开DDMS,点一下你要调试的进程,点了之后会出现8700的端口和红色的虫子。这个时候再attach应该就没问题了,成功attach上去虫子会变成绿色。

4.关于让程序停在加载so文件之前
这一点文章中也没提, 其实也有几种方法,一个是在System.loadLibrary之前加入waitForDebugger的代码;一个是用am命令的-D参数以debug模式启动程序;一个是开启手机的开发者选项之后在选择调试应用中选择要调试的应用,并且勾选等待调试器选项。毫无疑问最后一种方法是最简单的。




[推荐]看雪企服平台,提供安全分析、定制项目开发、APP等级保护、渗透测试等安全服务!

最后于 2018-6-1 13:55 被houjingyi编辑 ,原因:
上传的附件:
上一主题 下一主题
最新回复 (10)
Lucaks 1 2018-5-31 18:01
2
0
铁人三项
houjingyi 8 2018-5-31 18:12
3
0
Lucaks 铁人三项[em_41]
兄弟可以的
Vn小帆 2018-6-1 08:37
4
0
直接做section修复不就好了么
seandong 2018-6-1 10:07
5
0
section修复  JNI_Onload还是加密状态
Zkeleven 2018-6-1 11:36
6
0
看样子是变种的upx
idlepeople 2018-6-2 07:37
7
0
谢谢分析和样本。好想试试
聖blue 2018-6-2 23:09
8
0
喂 那谁 2018-6-6 02:41
9
0
求能破加密狗的老师。付费
几维安全小编 2018-6-7 18:16
10
0
游客
登录 | 注册 方可回帖
返回