Androidmanifest文件加固和对抗

VSole2024-01-22 10:02:16

前言


恶意软件为了不让我们很容易反编译一个apk,会对androidmanifest文件进行魔改加固,本文探索androidmanifest加固的常见手法以及对抗方法。这里提供一个恶意样本的androidmanifest.xml文件,我们学完之后可以动手实践。


1、Androidmanifest文件组成


这里贴一张经典图,主要描述了androidmanifest的组成



androidmanifest文件头部仅仅占了8个字节,紧跟其后的是StringPoolType字符串常量池


(为了方便我们观察分析,可以先安装一下010editor的模板,详细见2、010editor模板)


Magic Number


这个值作为头部,是经常会被魔改的,需要重点关注


StylesStart


该值一般为0,也是经常会发现魔改



StringPool



​寻找一个字符串,如何计算?


1、获得字符串存放开放位置:0xac(172),此时的0xac是不带开头的8个字节


所以需要我们加上8,最终字符串在文件中的开始位置是:0xb4


2、获取第一个字符串的偏移,可以看到,偏移为0


3、计算字符串最终存储的地方: 0xb4 = 0xb4 + 0


读取字符串,以字节00结束



​读取到的字符为:theme


总结:


stringpool是紧跟在文件头后面的一块区域,用于存储文件所有用到的字符串


这个地方呢,也是经常发生魔改加固的,比如:将StringCount修改为0xFFFFFF无穷大


在经过我们的手动计算和分析后,我们对该区域有了更深的了解。


2、010editor模板


使用010editor工具打开,安装模板库


搜索:androidmanifest.bt



​安装完成且运行之后:


会发现完整的结构,帮助我们分析


3、使用AXMLPrinter2进行的排错和修复


用法十分简单:


java -jar AXMLPrinter2.jar AndroidManifest_origin.xml


会有一系列的报错,但是不要慌张,根据这些报错来对原androidmanifest.xml进行修复



​意思是:出乎意料的0x80003(正常读取的数据),此时却读取到:0x80000


按照小端序,正常的数据应该是: 03 00 08


使用 010editor 打开


将其修复



​保存,再次尝试运行AXMLPrinter2



​好家伙还有错误,这个-71304363,不方便我们分析,将其转换为python的hex数据


NegativeArraySizeException 表示在创建数组的时候,数组的大小出现了负数。


androidmanifest加固后文件与正常的androidmanifest文件对比之后就可以发现魔改的地方。



​将其修改回去



运行仍然报错,是个新错误:



​再次去分析:


stringoffsets如此离谱,并且数组的大小变为了0xff



根据报错的信息,尝试把FF修改为24



​再次运行



​成功拿到反编译后的androidmanifest.xml文件


总结:


这个例子有三个魔改点经常出现在androidmanifest.xml加固


恶意软件通过修改这些魔改点来对抗反编译

010editor
本作品采用《CC 协议》,转载必须注明作者和本文链接
巧解一道CTF Android题
2022-08-10 16:15:40
无须还原代码,穷举爆破。我们打开jeb工具,定位到当前activity。我们看一下saveSN方法,可以看到这是一个native方法。我们解包一下apk,获取到so文件。下面进入ida分析。导出函数并没有相关java的native方法,说明是动态注册。我们看下JNI_ONLOAD函数:jint JNI_OnLoad{ if ( !
请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。
红队人员拿到一台主机权限后首先会考虑将该机器作为一个持久化的据点,种植一个具备持久化的后门,就需要用到权限维持
Android 应用gl,使用了加固i,老版本的应用gl是js源码,新版本更新后,刚开始以为是加密了源码,分析后才知道是使用了Hermes优化引擎。Hermes优化的优化效果如下:优化前:优化后:二、前期准备2.1 绕过root检测应用gl使用了加固i,在被root 的手机上运行,闪退。绕过方法也很简单,在magisk的设置中,开启遵守排除列表,然后在配置排除列表中选择应用gl。
一款APP外壳原理分析
2023-07-26 10:09:20
跑工具重新生成了一份section后,ida已经可以正常的解析so了。暂时不去关心解密算法的实现,等.init方法运行结束后,直接dump内存,可以看到数据已经解密完成。混淆的简单处理ida识别寄存器跳转失败。解决办法就是帮助ida正确识别switch-case,具体可以参考这篇文章正确修复后,ida也就能正常反编译了。平坦化的处理代码的正常流程被switch-case打乱了。对于跳回def块的case块,则会通过条件执行来决定下一个要执行的case块。
恶意软件为了不让我们很容易反编译一个apk,会对androidmanifest文件进行魔改加固,本文探索androidmanifest加固的常见手法以及对抗方法。这里提供一个恶意样本的androidmanifest.xml文件,我们学完之后可以动手实践。
WeChatAppEx.exe 版本:2.0.6609.4以融智云考学生端为例。网上已经有关于微信小程序解密的非常优秀的文章,本着学习的目的便不参考相关内容。笔者水平实在有限,如发现纰漏,还请读者不吝赐教。拓展的,我们分别观察RSI与RDI指向的内存区域。事实上,这一部分解密过程与微信图片解密相同。目的是用int8类型的值a3填满rbp至8个字节,进行8个字节分组异或。至此,尾部部分解密告一段落。
..aaaagf,一共有260个宽字符。漏洞跟踪将构造好的U盘插入Windows 2000系统,在ollydbg中开启cmd.exe进程,如下图:在命令行窗口执行dir e:,进程出现异常。这里我用了污点数据追踪的方法来找程序的crash point,也就是说在堆栈区找到我们构造的污点数据aaaaaaaa…
VSole
网络安全专家