安卓逆向学习之DES加密算法

安卓逆向学习之DES加密算法

DES 算法简介

DES(Data Encryption Standard)是目前最为流行的加密算法之一。DES 是对称的,也就是说它使用同一个密钥来加密和解密数据。

DES 还是一种分组加密算法,该算法每次处理固定长度的数据段,称之为分组。DES 分组的大小是 64 位,如果加密的数据长度不是 64 位的倍数,可以按照某种具体的规则来填充位。

从本质上来说,DES 的安全性依赖于虚假表象,从密码学的术语来讲就是依赖于“混乱和扩散”的原则。混乱的目的是为隐藏任何明文同密文、或者密钥之间的关系,而扩散的目的是使明文中的有效位和密钥一起组成尽可能多的密文。两者结合到一起就使得安全性变得相对较高。

DES 算法具体通过对明文进行一系列的排列和替换操作来将其加密。过程的关键就是从给定的初始密钥中得到 16 个子密钥的函数。要加密一组明文,每个子密钥按照顺序(1-16)以一系列的位操作施加于数据上,每个子密钥一次,一共重复 16 次。每一次迭代称之为一轮。要对密文进行解密可以采用同样的步骤,只是子密钥是按照逆向的顺序(16-1)对密文进行处理。

DES 算法框架

以下是 DES 的算法框架

image-20220623145732624

从这个图中我们可以看到

明文传入 IP 进行置换 进行 16 次迭代 将 R16 与 L16 拼接 IP 逆置换 生成密文

  1. 从 64-bit 的主钥匙里面选取特定的 56 位,其余的位就没用了。于是我们现在手上有了一个 56 位的布尔数组。把它分成左、右两个半密钥,它们都是 28-bit 的布尔数组。
  2. 左、右两个半密钥都左旋(也就是循环左移。整个数组往左移,左边弹出去了的东西补到最右边去)一定位数,这个左移的位数也是指定的。有些轮次是 1 位,有些轮次是 2 位。
  3. 把左、右半密钥拼起来,再做一个置换,就得到了这一轮生成的子密钥。这个置换是从 56-bit 的数组里面选取指定的 48 位。所以现在每一轮都可以生成一个 48 位的子密钥。(注意,步骤 3 并不改变左右半密钥)。
  4. 重复 步骤 2、步骤 3 一共 16 次,于是得到了 16 个 48-bit 的子密钥。
阅读更多
【实战】某习通app逆向分析(二)发包参数加密分析、解密和数据采集
安卓逆向学习之Objection-Hook自吐请求抓包与辅助分析

安卓逆向学习之Objection-Hook自吐请求抓包与辅助分析

前言

证书校验

在许多业务非常聚焦比如行业应用、银行、公共交通、游戏等行业,C/S 架构中服务器高度集中,对应用的版本控制非常严格,这时候就会在服务器上部署对 app 内置证书的校验代码。
抓包出现如下提示时,我们确定出此 APP 为服务器校验 app 客户端证书

APP测试之安全机制问题及Bypass - 先知社区

阅读更多

安卓逆向学习之objection基础用法

0x1 介绍&安装 Objection

objection 是基于 frida 的命令行 hook 工具, 可以让你不写代码, 敲几句命令就可以对 java 函数的高颗粒度 hook, 还支持 RPC 调用

目前只支持 Java 层的 hook, 但是 objection 有提供插件接口, 可以自己写 frida 脚本去定义接口

比如葫芦娃大佬的脱壳插件, 实名推荐: FRIDA-DEXDump

官方仓库: objection

阅读更多
【实战】某习通app逆向分析(一)检测切屏、拍照、上传

【实战】某习通app逆向分析(一)检测切屏、拍照、上传

前言

Android 上的应用安装文件是 apk 格式,这个 apk 文件其实就是个归档文件压缩包,把应用相关的源码、资源文件、配置文件等乱七八糟的东西都简单粗暴的归档打包,其包内文件结构大体如下:

文件或目录 作用
META-INF/ 存放签名信息,用来保证 apk 包的完整性和系统的安全。
res/ 存放资源文件的目录
libs/ 若存在,则存放的是 ndk 编译出来的 so 文件库
AndroidManifest.xml 程序全局配置文件
classes.dex 最终生成的 dalvik 字节码
resources.ars 编译后的二进制资源文件。通常本地化、汉化资源存储在该文件文件中。

因此,我们将 apk 后缀改成 zip 压缩格式并直接解压就能得到 app 的 dalvik 指令集 dex 文件,然后再将其反编译为 smali 文件,还可以再反编译为 java 代码文件,这样就几乎等同于拿到了 app 就能拿到可读性还蛮清晰的源码,导致逆向破解的门槛几乎很低;没有做防范措施的 app 几乎等同于在裸奔,因此后来演变出来一些保护措施,让 apk 被反编译后获取的代码难理解。

阅读更多
安卓逆向学习之Frida-RPC远程调用与主动调用

安卓逆向学习之Frida-RPC远程调用与主动调用

准备阶段

Android 应用开发

image-20220614231424074

先准备一个工程,编写以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package cn.mineseb.rpc;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

private String total = "codecat";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

while (true){
try {
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
}

}

void fun(int x,int y){
Log.d("r0ysue.com",String.valueOf(x+y));
}
String fun(String x){
return x.toLowerCase();
}
void secret(){
total += "cool!!!";
Log.d("secret","this is secret func");
}
static void staticSecret(){
Log.d("staticSecret","this is static secret func");
}
}

将模拟器 adb 链接 studio 并且点击开始按钮后 出现 成功

image-20220615000228762

阅读更多
安卓逆向学习之RSA加密算法

安卓逆向学习之RSA加密算法

RAS 算法简介

它是又罗纳德.李维斯特、阿迪.萨莫尔和伦纳德.阿德曼在 1977 年提出,当时他们三人在麻省理工学院工作,RSA 就是他们三大姓开头字母拼在一起组成的。

RSA 是最流行的非对称加密算法之一,也被称之为公钥加密。

阅读更多

【实战】人人直播 password 加密分析

分析

搜索 password

jadx 搜索 “password”

找到地点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
private void aCv() {
SettingManager.bmC().m16156rl("");
SettingManager.bmC().m16124tV(-1);
RSA.init();
aBB();
Variables.account = this.fgV.getText().toString().trim();
Variables.password = this.fgU.getText().toString().trim();
if (Variables.account == null || Variables.account.length() == 0) {
Toast.makeText(getActivity(), RenrenApplication.getContext().getResources().getString(C4591R.C4595string.v5_0_1_guide_register_account_no_null), 1).show();
} else if (Variables.password == null || Variables.password.length() == 0) {
Toast.makeText(getActivity(), RenrenApplication.getContext().getResources().getString(C4591R.C4595string.v5_0_1_guide_register_password_no_null), 1).show();
} else if (Methods.m13910tM(Variables.account)) {
Methods.showToast((CharSequence) getResources().getString(C4591R.C4595string.v5_0_1_guide_register_not_have_china), false);
} else if (Methods.m13910tM(Variables.password)) {
Methods.showToast((CharSequence) getResources().getString(C4591R.C4595string.v5_0_1_guide_register_pwd_have_china), false);
} else {
deY = RSA.bNv();
this.f14991n = RSA.bNx();
this.f14990e = RSA.bNw();
if (deY != null) {
try {
Variables.password = RSA.m10340P(Variables.password, this.f14991n, this.f14990e);
RSA.kJi = 1;
} catch (Exception e) {
e.printStackTrace();
}
} else {
Variables.password = Md5.toMD5(Variables.password);
RSA.kJi = 2;
}
if (Variables.account == null || Variables.account.length() <= 0 || Variables.password == null || Variables.password.length() <= 0) {
return;
}
if (this.fha == null) {
try {
this.fha = new Dialog(getActivity());
this.fha.setContentView(C4591R.layout.login_dialog);
((ImageView) this.fha.findViewById(C4591R.C4593id.image)).startAnimation(AnimationUtils.loadAnimation(getActivity(), C4591R.anim.login_dialog_scale));
} catch (Exception unused) {
}
}
this.fha.show();
if (RSA.kJi != 1) {
deY = null;
}
C12919ServiceProvider.m_RSA_login(Variables.account, Variables.password, 1, "", deY, getActivity(), this.dfg);
}
}


阅读更多

安卓逆向学习之frida基础用法

frida 是一款方便并且易用的跨平台 Hook 工具,使用它不仅可以 Hook Java 写的应用程序,而且还可以 Hook 原生的应用程序。

frida 分客户端环境和服务端环境。在客户端我们可以编写 Python 代码,用于连接远程设备,提交要注入的代码到远程,接受服务端的发来的消息等。在服务端,我们需要用 Javascript 代码注入到目标进程,操作内存数据,给客户端发送消息等操作。我们也可以把客户端理解成控制端,服务端理解成被控端。
假如我们要用 PC 来对 Android 设备上的某个进程进行操作,那么 PC 就是客户端,而 Android 设备就是服务端。

阅读更多
安卓逆向学习之 FRIDA HOOK AES DES RSA 自吐算法