【Android逆向】算法还原2
这题比较简单
1. app-release.apk 安装至手机
提示需要输入账号和密码
2. jadx 打开看看
public native boolean check(byte[] bArr, byte[] bArr2);
static {
System.loadLibrary("native-lib");
}
/* JADX INFO: Access modifiers changed from: protected */
@Override // androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.Activity
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
this.edt_username = (EditText) findViewById(R.id.edt_username);
this.edt_code = (EditText) findViewById(R.id.edt_code);
Button button = (Button) findViewById(R.id.btn_check);
this.btn_check = button;
button.setOnClickListener(this);
}
@Override // android.view.View.OnClickListener
public void onClick(View view) {
if (view.getId() != R.id.btn_check) {
return;
}
String obj = this.edt_username.getText().toString();
String obj2 = this.edt_code.getText().toString();
if (obj.length() == 0 || obj2.length() == 0) {
Toast.makeText(this, "输入不完整!", 1).show();
} else if (check(obj.getBytes(), obj2.getBytes())) {
Toast.makeText(this, "验证通过!", 1).show();
congratulation();
} else {
Toast.makeText(this, "验证失败!", 1).show();
}
}
private void congratulation() {
startActivity(new Intent(this, Congratulation.class));
finish();
}
check 在native层
2. so 使用IDA打开看看
bool __fastcall Java_com_r0ysue_crackme_MainActivity_check(JNIEnv *env, jobject object, int username, int password)
{
int v7; // r11
jbyte *v8; // r10
jbyte *password_chars; // r5
jsize v10; // r6
int v11; // r5
int v12; // r0
int v13; // r0
int v14; // r4
char *t_passwd_chars; // [sp+8h] [bp-100h]
int v17; // [sp+Ch] [bp-FCh] BYREF
int v18; // [sp+10h] [bp-F8h] BYREF
int v19; // [sp+14h] [bp-F4h] BYREF
char v20[104]; // [sp+18h] [bp-F0h] BYREF
char v21[104]; // [sp+80h] [bp-88h] BYREF
v7 = 0;
v8 = (*env)->GetByteArrayElements(env, username, 0);
password_chars = (*env)->GetByteArrayElements(env, password, 0);
v10 = (*env)->GetArrayLength(env, (jarray)username);
if ( (unsigned int)(v10 - 6) <= 0xE )
{
t_passwd_chars = password_chars;
v11 = EVP_CIPHER_CTX_new();
v12 = EVP_CIPHER_CTX_set_padding(v11, 1);
v13 = EVP_aes_128_ecb(v12);
EVP_EncryptInit(v11, v13, "kanxuenbkanxuenb", 0);
memset(v21, 0, 0x64u);
v18 = 0;
v19 = 0;
EVP_EncryptUpdate(v11, v21, &v19, v8, v10);
EVP_EncryptFinal(v11, &v21[v19], &v18);
EVP_CIPHER_CTX_free(v11);
v18 += v19;
v14 = EVP_ENCODE_CTX_new();
EVP_EncodeInit();
memset(v20, 0, 0x64u);
v17 = 0;
EVP_EncodeUpdate(v14, v20, &v17, v21, v18);
EVP_EncodeFinal(v14, &v20[v17], &v17);
return strncmp(t_passwd_chars, v20, v17 - 1) == 0;
}
return v7;
}
直接搜 EVP_CIPHER_CTX_new 和 EVP_EncodeInit ,发现是Openssl 的标准实现,那么猜测是先进行AES加密 , 再进行base64 encode
直接打开 https://gchq.github.io/CyberChef/ 验证猜想,发现还真是的
3. 编写注册机
from Crypto.Cipher import AES
from base64 import b64encode
key = b"kanxuenbkanxuenb"
mode = AES.MODE_ECB
bs = 16
PADDING = lambda s: s + (bs - len(s) % bs) * chr(bs - len(s) % bs)
# 在这里输入username
text = "helloworld"
generator = AES.new(key, mode)
crypt = generator.encrypt(PADDING(text).encode())
b64 = b64encode(crypt)
print("username --> " + "helloworld")
print("code --> " + b64.decode())
日志
# python lesson202111.py
username --> helloworld
code --> TyjG/EYaUC8EXxz7/sXiCA==
手机上输入,验证ok,没毛病
【Android逆向】算法还原2的更多相关文章
- android逆向学习小结--CrackMe_1
断断续续的总算的把android开发和逆向的这两本书看完了,虽然没有java,和android开发的基础,但总体感觉起来还是比较能接收的,毕竟都是触类旁通的.当然要深入的话还需要对这门语言的细节特性和 ...
- Android逆向之so的半自动化逆向
因为工作需要,转型干android逆向,有几个月了.不过对于so的逆向,任然停留在,难难难的阶段,虽然上次自己还是逆向了一个15k左右的小so文件,但是,那个基本是靠,一步一步跟代码,查看堆栈信息来自 ...
- Android逆向学习资料
Android逆向基础之Dalvik虚拟机: https://lyxw.github.io/archivers/Android%E9%80%86%E5%90%91%E5%9F%BA%E7%A1%80% ...
- [置顶]
Android逆向从未如此简单
哈,又标题党了..不过我一定竭尽所能,写一篇最亲民的入门文章. 本文仅供学习交流之用,切勿用于非法用途,读者若运用所学知识,进行非法任何商业目的或者非法牟利,一切责任由操作者自行承担,与本人无关.希望 ...
- Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/jiangwei0910410003/article/details/51 ...
- 2021年正确的Android逆向开发学习之路
2021年正确的Android逆向开发学习之路 说明 文章首发于HURUWO的博客小站,本平台做同步备份发布.如有浏览或访问异常或者相关疑问可前往原博客下评论浏览. 原文链接 2021年正确的Andr ...
- Ratel:一直站在Android逆向巅峰的平头哥
本文来源:带动行业内卷,渣总义不容辞 字越少事儿越大,请关注github(可以点击阅读原文): https://github.com/virjarRatel 平头哥(ratel)是一个Android逆 ...
- [转]Android逆向之动态调试总结
一.在SO中关键函数上下断点 刚学逆向调试时.大多都满足于在SO中某关键函数上下断点.然后通过操作应用程序,去触发这个断点,然后进行调试 详细的步骤可以参见非虫大大的<Android软件安全与逆 ...
- Android逆向破解表单注册程序
Android逆向破解表单注册程序 Android开发 ADT: android studio(as) 程序界面如下,注册码为6位随机数字,注册成功时弹出通知注册成功,注册失败时弹出通知注册失败. 布 ...
- Android逆向破解表单登录程序
Android逆向破解表单登录程序 Android开发 ADT: android studio(as) 程序界面如下,登录成功时弹出通知登录成功,登录失败时弹出通知登录失败. 布局代码 <?xm ...
随机推荐
- Harbor的逻辑备份与学习
Harbor的逻辑备份与学习 背景 一直想处理一下一个有网络冲突的Harbor镜像服务器 但是因为网络层自己水平一直是不是非常自信 加上Harbor容器使用的compose的玩法, 自己不敢直接处理. ...
- [转帖]Kafka—配置SASL/PLAIN认证客户端及常用命令
https://www.jianshu.com/p/c1a02fb1779f 介绍 SASL/PLAIN 是一种简单的 username/password安全认证机制,本文主要总结服务端开启该认证 ...
- [转帖]spec2017 安装和使用
https://zhuanlan.zhihu.com/p/534205632 SPEC成立于1988年,SPEC基准广泛用于评估计算机系统的性能.SPEC CPU套件通过测量几个程序(例如编译器GCC ...
- [转帖]Ubuntu Server安装图形界面
最早接触到的Linux系统是Ubuntu 10.04,当时在自己的一台Win7笔记本电脑上安装的Win/Ubuntu双系统,Ubuntu简洁的操作界面给我留下了深刻的印象. 后来开始做一些服务器开发, ...
- CentOS8 解决 yum元数据下载失败的方法
背景 最近同事反馈CentOS的机器无法再现安装 rpm包了. 提示信息主要是下载源数据失败. 今天上午抽时间进行了一下简单验证, 晚上进行一下总结. 避免遗忘. 认为与Redhat被IBM收购之后, ...
- vue插件实现表格拖拽 sortable 遇见的坑
下载插件 npm install sortable.js --save (下载的时候一定要这样去下载,不要去下载 npm install sortable--save ) 因为sortable.js和 ...
- vuex中action中发送数据
state: { actionData: "", }, mutations: { actioncomAPi: (state, data) => { state.actionD ...
- linux如何配置ssh密钥登录
为什么要用ssh密钥登录 购买的服务器设置密码很容易被暴力破解,用密钥登录安全很多.root用户新建的用户也要用密钥登录更安全,如果一直su - 用户名登录 不方便 用xftp等服务上传文件到用户使用 ...
- 栈:数据结构中的后进先出(LIFO)容器
栈是一种基本的数据结构,广泛应用于计算机科学和编程中,用于管理数据的存储和访问.栈遵循后进先出(Last In, First Out,LIFO)原则,即最后放入栈的元素首先被取出.这种数据结构模拟了物 ...
- 安装Visual Studio的详细流程
本文介绍Visual Studio 2022软件Community(社区版)的下载.安装.运行与使用方法. 首先需要提一句,本文介绍的是Visual Studio 2022软件的下载:而其它版 ...