0x0 前言
提到字符串混淆,就要解释下为什么要做字符串混淆,之前文章有介绍过基于smali的字符串混淆,但基于smali就必须先反编译,使用成本太大,而混淆往往用于开发层面,目前Android开发的主流语言还是Java(kotlin),使用NDK开发的偏少,如果编译时不进行处理,那么使用一些反编译工具反编译后就相当于在阅读源码,市面上主流的proguard混淆工具并没有提供字符串混淆功能,而其它混淆工具如DashO,Zelix,DexGuard,Allatori等等均属于收费工具,做字符串混淆的初衷主要是为了提高逆向门槛,或是从另一方面减少硬编码的危害。
0x1 介绍
看一例简单字符串混淆,如下示例:
对于对称算法来说,泄漏密钥则意味数据包可被篡改(此处未考虑数据包做了完整性校验),站在逆向的角度来说,对于数据包的逆向分析一般会从url地址、参数类型、猜测加密类型、堆栈跟踪等多个方面去寻找加解密方法,而前三种方式是用的较多的,比如http://helloworld.com/keyword=d3Fld3FlMTExc2QuLg==,反编译后则可以通过搜索keyword关键字去查找值内容的加密,亦或是通过猜测加密类型,如上述值内容其实仅做了个base64编码,在尝试解码后就可以拿到明文,当如果解码后依然是密文,一方面就可以通过查找函数引用,而我自己使用的方式直接去靠猜(= =),常规的加密方式无非是AES,DES,RSA(这三种是用的最多的),此处考虑的是加解密算法在Java层实现,较大型的app一般已经使用openssl在jni层实现了,这里不做讨论,通过搜索AES,DES,RSA关键字再稍加分析一般就可以找到真正的加解密函数。
字符串混淆就是为了增大直接搜索关键字的难度,逆向人员在遇到字符串混下后首先要解决的就是反混淆,可通过静态反混淆或是动态代码插桩查看明文,此处针对一项简单的字符串混淆介绍下反混淆。
这里每次会调用a类中的c方法对加密字符串进行解密,这里有两种还原方式,一种是借助jeb写脚本遍历c方法的引用进行还原,但不是永久性还原,另一种就是基于smali做反混淆,将app反编译smali后,上图的代码如下
可以看到在声明了一个const-string后紧接着就是解密方法,根据这个特性,写个方法遍历下所有包含这个特性的字符串进行还原然后编码回去即可,需要注意的就是smali里中文显示的是unicode形式。
0x2 实现
那么在处理过字符串后以字符串的形式编码是不可靠的,静态还原难度太低,于是有了以数组形式展现的方式,目前效果如下:
展示过效果图接下来就是介绍原理,本工具是基于StringFog进行的二次开发,无论是gradle插件还是jar包混淆,处理的对象都是class字节码,那这里就引用了著名的asm字节码工具,遍历每个class文件,通过重写ClassVisitor中的visitField、visitMethod、visitEnd方法,对于全局变量,需要考虑它的修饰符是否为static和final,在visitField时根据其不同的修饰区分出三种情形:
((access .) (access .) ) {
.add(ClassStringField(name, () value));
value ;
}
((access .) (access .) ) {
.add(ClassStringField(name, () value));
value ;
}
((access .) (access .) ) {
.add(ClassStringField(name, () value));
value ;
}
此处用于拿到Field的名称和值用于后面的加密,而在visitMethod时,需要对(static块),(构造方法)和普通方法进行分别判断,同时对上面获取到的变量进行判断,对非空值变量进行加密,对于方法内部的字符串在visitLdcInsn时进行判断是否为String类型和值是否为空,非空则进行加密,以下代码限于篇幅省略了一部分。
(.equals(name)) {
...
(ClassStringField mStaticFinalFields) {
(.value )&nbs【知识】9月28日 - 每日安全知识热点 阅读原文»
热点概要:一个介绍主流漏洞悬赏平台、安全书籍、常见安全工具及漏洞类型的CheatSheet、BypassD盾IIS防火墙SQL注入防御(多姿势)、一款智能家居设备的远程命令执行漏洞分析、Exe2Image:一个可以将exe转换为jpeg图像文件的小程序、Kingslayer - A supply chain attack、Netgear ReadyNAS监控未认证远程命令执行漏洞
国内热词(以下内容部分来自:http://www.solidot.org/ )
俄罗斯黑客利用 Google AMP 漏洞钓鱼
雅虎开源其搜索引擎 Vespa
中国 Android 应用利用 Dirty Cow 漏洞植入后门
技术类:
一个介绍主流漏洞悬赏平台、安全书籍、常见安全工具及漏洞类型的CheatSheet
https://github.com/EdOverflow/bugbounty-cheatsheet
BypassD盾IIS防火墙SQL注入防御(多姿势)
https://xianzhi.aliyun.com/forum/read/2173.html
Kingslayer - A supply chain attack -- Part 1
http://hackdog.me/article/Kingslayer-A_supply_chain_attack--Part_1.html
开源无效流量检测项目
NuCypher KMS开发路线图
https://medium.com/@NuCypher/nucypher-kms-development-roadmap-fed689b13dfa
参数特定XSS的故事
http://www.noob.ninja/2017/09/story-of-parameter-specific-xss.html
Phrack:虚拟机逃逸,QEMU 案例研究
https://www.exploit-db.com/papers/42883/
恶意文档利用新的反虚拟机和防沙盒技术
应用加密加固
https://bettercrypto.org/static/applied-crypto-hardening.pdf
看我如何利用隐藏的输入点入侵DePauw大学
https://hackernoon.com/how-i-hacked-depauw-university-using-hidden-inputs-79377c3dca7e
通过数据包端口号进行数据渗出:PacketKnockOut
https://n0where.net/data-exfiltration-via-packet-port-numbers-packetknockout/
c编程实例
回复删除使用指针计算浮点平均值