首页 > 编程语言 >安卓逆向 -- 自吐算法(DES)

安卓逆向 -- 自吐算法(DES)

时间:2022-12-26 19:06:07浏览次数:41  
标签:逆向 String -- 安卓 DES param new byte Log


一、DES算法源码

DESKeySpec deskey = new DESKeySpec("123456789".getBytes(StandardCharsets.UTF_8));//将密钥实例化
SecretKeyFactory key = SecretKeyFactory.getInstance("DES");//加密算法
SecretKey secretKey = key.generateSecret(deskey);//处理成系统可识别的密钥
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");//加密方式
cipher.init(1,secretKey);//1是加密,2是解密,初始化加密
byte[] desres = cipher.doFinal(bs.getBytes());
System.out.println("DES加密(字节):"+Arrays.toString(desres));
System.out.println("DES加密(Hex):"+bytes2HexString(desres));
System.out.println("DES加密(Base64):"+Base64.getEncoder().encodeToString(desres));
cipher.init(2,secretKey);//初始化解密
byte[] jmdesres = cipher.doFinal(Base64.getDecoder().decode("R7R5cToMh5QxnyoH/32OQw==".getBytes(StandardCharsets.UTF_8)));
System.out.println("DES解密(Base64):"+new String(jmdesres));
byte[] deshexbyte =hexString2Bytes("47B479713A0C8794319F2A07FF7D8E43");
jmdesres=cipher.doFinal(deshexbyte);
System.out.println("DES解密(Hex):"+new String(jmdesres));

二、分析源码,需hook的内容

1、hook的类:javax.crypto.spec.DESKeySpec,javax.crypto.spec.IvParameterSpec,javax.crypto.Cipher

2、hook的方法:key,IV,doFinal

三、hook源码

XposedBridge.hookAllConstructors(XposedHelpers.findClass(
"javax.crypto.spec.DESKeySpec",
loadPackageParam.classLoader),
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
Log.e("逆向有你", "Stack:", new Throwable("stack dump"));
byte[] keybyte = new byte[8];
int offset = 0;
if (param.args.length != 1) {
offset = ((Integer) param.args[1]).intValue();
}
System.arraycopy((byte[])param.args[0], offset, keybyte, 0, 8);
String keyHex = b2s(keybyte);
String keyB64 = Base64.encodeToString(keybyte, 0);
Log.d("逆向有你", "DESKey:" + new String(keybyte));
Log.d("逆向有你", "DESKeyHex:" + keyHex);
Log.d("逆向有你", "DESKeyB64:" + keyB64);
Log.d("逆向有你", "=============DES密钥================");
}
});
XposedBridge.hookAllConstructors(XposedHelpers.findClass(
"javax.crypto.spec.IvParameterSpec",
loadPackageParam.classLoader),
new XC_MethodHook() {
/* access modifiers changed from: protected */
public void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
Log.e("逆向有你", "Stack:", new Throwable("stack dump"));
byte[] ivParameter = (byte[]) param.args[0];
int offset = 0;
int size = 0;
if (param.args.length != 1) {
offset = ((Integer) param.args[1]).intValue();
size = ((Integer) param.args[2]).intValue();
} else {
size = ivParameter.length;
}
byte[] ivbyte = new byte[size];
System.arraycopy(ivParameter, offset, ivbyte, 0, size);
String ivHex = b2s(ivbyte);
String ivB64 = Base64.encodeToString(ivbyte, 0);
Log.d("逆向有你", "ivParameter:" + new String(ivbyte));
Log.d("逆向有你", "ivParameterHex:" + ivHex);
Log.d("逆向有你", "ivParameterB64:" + ivB64);
Log.d("逆向有你", "======================IV向量===============================");
}
});
XposedBridge.hookAllMethods(XposedHelpers.findClass(
"javax.crypto.Cipher",
loadPackageParam.classLoader),
"doFinal",
new XC_MethodHook() {
public void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
Log.e("逆向有你", "Stack:", new Throwable("stack dump"));
if (param.args.length == 0 || param.args.length == 1 || param.args.length == 3) {
Cipher cip = (Cipher) param.thisObject;
String Algorithm = cip.getAlgorithm();
byte[] dataAll = (byte[]) param.args[0];
if (param.args.length == 3) {
int offset = ((Integer) param.args[1]).intValue();
int size = ((Integer) param.args[2]).intValue();
byte[] databyte = new byte[size];
System.arraycopy(dataAll, offset, databyte, 0, size);
Log.d("逆向有你", Algorithm + "Data" + new String(databyte));
String data = new String(databyte);
String dataHex = b2s(databyte);
String dataB64 = Base64.encodeToString(databyte, 0);
Log.d("逆向有你", String.valueOf(Algorithm) + " Data:\n" + data);
Log.d("逆向有你", String.valueOf(Algorithm) + " DataHex:\n" + dataHex);
Log.d("逆向有你", String.valueOf(Algorithm) + " DataB64:\n" + dataB64);
} else if (param.args.length == 1) {
String data2 = new String(dataAll);
String dataHex2 = b2s(dataAll);
String dataB642 = Base64.encodeToString(dataAll, 0);
Log.d("逆向有你", String.valueOf(Algorithm) + " Data:\n" + data2);
Log.d("逆向有你", String.valueOf(Algorithm) + " DataHex:\n" + dataHex2);
Log.d("逆向有你", String.valueOf(Algorithm) + " DataB64:\n" + dataB642);
}
byte[] res = (byte[]) param.getResult();
String resHex = b2s(res);
String resB64 = Base64.encodeToString(res, 0);
Log.d("逆向有你", String.valueOf(Algorithm) + " resultHex: " + resHex);
Log.d("逆向有你", String.valueOf(Algorithm) + " resultB64: " + resB64);
Log.d("逆向有你", "================Cipher=============================");
}
}
});

四、运行结果

安卓逆向 -- 自吐算法(DES)_xposed模块

禁止非法,后果自负

欢迎关注公众号:逆向有你


安卓逆向 -- 自吐算法(DES)_算法_02

标签:逆向,String,--,安卓,DES,param,new,byte,Log
From: https://blog.51cto.com/u_15288375/5970388

相关文章

  • 火山中文编程 -- 温度转换
    例子:有人用温度计测量出用华氏温度98°F,现在要求用火山中文编程实现,把它转换为以摄氏法表示的温度。分析:摄氏度=(5/9)*(华氏度-32)一、新建MFC窗口,设置好布局二、编写代码三、运......
  • 软件工程——软件测试(黑盒测试、白盒测试、测试分析报告)
    经过前面软件测编码阶段,是不是我们就可以把软件发布出去供用户使用了呢?不是的,为了确保软件不会出现不必要的差错,还需要经过重重测试的。目录​​软件测试的目的​​​​软件......
  • UML——类图
    目录​​类​​​​类图是什么?​​​​什么时候产生类图?​​​​为什么用例图之后是画类图,这样做的目的是什么?​​​​类图的关系​​​​如何画类图呢?​​​​第一次机房中......
  • UML——用例图(Use case diagrams)
    目录​​什么是用例图?​​​​用例图帮我们做什么?​​​​用例图的基本元素有哪些?​​​​第一次机房收费系统用例图​​​​总结​​       一、什么是用例图......
  • UML——概述(什么是UML?UML有什么作用?面向对象技术)
    目录​​什么是UML?​​​​UML能帮我们做什么?​​​​什么是建模?​​​​为什么要建模?​​​​为什么要可视化建模?​​​​建模的原理(原则)​​​​UML的基本构造块​​​​U......
  • Microsoft 365 开发:使用PnP Powershell连接SharePoint Online失败
    Blog链接:​​https://blog.51cto.com/13969817​​​今天小伙伴使用PnPPowershell连接SharePointOnline时,遇到如下错误:ADSTS65001:Theuseroradministratorhasnotco......
  • UML——面向对象技术
    目录 ​​UML中为什么要使用面向对象技术?​​​​面向对象的基本原则有哪些?​​​​面向对象有哪些基本内容?​​​​类和对象的之间的关系是怎样的?​​​​究竟继承的是什......
  • 软件工程——文档篇
    何为软件工程?就是客户和开发人员提前定好相关需求,并形成文字材料,开发人员通过这个需求来开发软件,为了软件能够更适用,并进行相关的维护测试等方面的一个过程。简单来说就是开......
  • UML——包图
               为什么会产生包?对复杂系统进行建模时,经常需要处理大量的类、接口、组件、节点和图,这时就有必要将这些元素进行分组,把那些语义相近并倾向于......
  • UML——行为图(活动图、状态图)
    状态图是做什么的?描述了一个具体对象的可能状态以及它们之间的转换。展现一个对象拥有的状态,还可以说明时间(如消息的接收、错误、条件变更等)如何随着时间的推移来影响这些状......