【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 ...
随机推荐
- [转帖]Kafka关键参数设置
https://www.cnblogs.com/wwcom123/p/11181680.html 生产环境中使用Kafka,参数调优非常重要,而Kafka参数众多,我们的java的Configurat ...
- [转帖]深入理解mysql-第十章 mysql查询优化-Explain 详解(上)
目录 一.初识Explain 二.执行计划-table属性 三.执行计划-id属性 四.执行计划-select_type属性 一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一 ...
- 【转帖】【漏洞提示】MySQL8.0.29因重大bug官网已下架
前阵子,MySQL官网已经将 MySQL 8.0.29版本下架.据悉下架原因是由于MySQL 8.0.29 存在关于InnoDB解释器的重大Bug.而最新版本 8.0.30及以上的版本已修复此漏洞.各 ...
- 【转帖】关于网卡特性TSO、UFO、GSO、LRO、GRO
https://www.cnblogs.com/larrypeng/p/12496810.html 我们来看下关于网卡特性的解释,不过记住GSO和GRO两个特性就好. TSO(TCP Segmenta ...
- [转帖]Nacos的版本支持情况
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E 由于 Spring ...
- [转帖]AMD第四代宵龙 9174F 亮眼
https://www.amd.com/zh-hans/processors/epyc-9004-series#%E8%A7%84%E6%A0%BC 型号规格 型号 CPU 核心数量 线程数量 最 ...
- [转帖]SYSTEMD 配置文件
https://www.cnblogs.com/xiexun/p/13643952.html [Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系 ...
- Spring缓存是如何实现的?如何扩展使其支持过期删除功能?
前言:在我们的应用中,有一些数据是通过rpc获取的远端数据,该数据不会经常变化,允许客户端在本地缓存一定时间. 该场景逻辑简单,缓存数据较小,不需要持久化,所以不希望引入其他第三方缓存工具加重应用负担 ...
- webservice 发布与使用
WebService,即Web服务,能使得运行在不同机器上的不同应用无须借助,专门的第三方软件或硬件,就可相互交换数据或集成. 第一次选择WebService,是为了替代数据库远程连接.我们都知道当S ...
- Git 简单实用教程
相关链接: 码云(gitee)配置SSH密钥 码云gitee创建仓库并用git上传文件 git 上传错误This oplation equires one of the flowi vrsionsot ...