文章目录

  • 0x0 前言
  • 0x1 界面分析
  • 0x2 反编译
  • 0x3 破解

0x0 前言

此软件为练习用Crackme.apk 仅有验证逻辑
此软件不同于普通的Android软件, 是由Mono for Android编写的, 主逻辑的语言为C#, 在尝试破解这款软件的时候花费了我大量功夫, 特此记录

0x1 界面分析

首先打开软件有一个输入注册码的输入框, 随便输入一串注册码点击验证

随后显示: 操作失败, 验证码不正确, 尝试抓包, 发现请求

说明此软件为网络验证, 有了这些信息准备开始逆向

0x2 反编译

首先将apk扔进Android Killer(下面简称AK)里进行分析, 发现此软件并不同于普通的软件

发现其只有一个Activity, 且都以md5命名, 怀疑加壳, 使用查壳工具进行验证

发现并没有加壳, 只能手动进行分析, 只有一个Activity肯定不正常, 首先检查assetslib查看是否有线索

lib文件里发现猫腻, 有几个libmono开头的.so文件, 还有libmonodroid_bundle_app.so, 经过百度, 此Android程序并非传统的Android程序, 而是Mono for Android, 使用C#写的.

检查MainActivity代码, 发现大量native代码, 说明Java层全是代理方法, 没有主逻辑, 现在应该寻找C#代码藏在哪里

网上查询得知, 所有的C#代码都藏在libmonodroid_bundle_app.so内, 且是个千层饼结构, 尝试使用binwalk检查, 发现大量压缩包

不过一个一个解压是要死的, 于是上GitHub寻找工具, 找到mono_unbundle这款工具
使用命令mono_unbundle libmonodroid_bundle_app.so dlls/解包, 获得dll文件一堆

根据mono for android结构, 主逻辑在<appname>.dll内, 使用dnSpy进行反编译

查找其页面控制, 根据Android开发习惯, 重点寻找ViewModel, 于是在AutoR.ViewModel内寻找到重点函数OnCDKCommandExecuted()

分析其代码, 可以梳理出其逻辑大概是这样的

  1. 将注册码发送出去, 返回数据分为三段, 分别为 登录成功|剩余时间|CDKToken
  2. 然后CDKToken拿去进行验证, 拼接字符串CDKToken|时间戳, 然后与123C7E5E875FBF0EEE2583F8AF3DDFF9进行循环与非运算

  3. 将加密的数据发送给服务器, 服务器进行某种运算后返回一个Base64
  4. 客户端对Base64与时间戳进行运算, 最终能变成字符串PASS, 说明验证成功

0x3 破解

这里有两种思路

  1. 直接修改C#代码并回编译
  2. 通过代理拦截验证函数, 使其返回正常

由于选择第一种后我不会将dll打包回so文件, 我这里选择第二种方法
首先通过Fiddler进行拦截, 返回固定数据, 伪造第一个数据包

可以发现软件发出了第二个数据包, 数据为NTA0MDMyOzo1NjY6OjIzMTIzfzIxMDc2NTQ7OjM=, base64解码后为504032;:566::231232107654;:3

返回的数据包经过一定的运算后, 最终变成PASS, 尝试进行反向运算

import base64def login4(data_in: str):input_bytes = list(base64.b64decode(data_in))key_byte = list("123C7E5E875FBF0EEE2583F8AF3DDFF9".encode())for i in range(len(input_bytes) - 1, -1, -1):for j in range(len(key_byte) - 1, -1, -1):input_bytes[i] ^= key_byte[j]ok, token = bytes(input_bytes).decode().split("|")print(ok, token)ok_bytes = list(ok.encode())final_data = list("PASS".encode())for i in range(len(final_data) - 1, -1, -1):for j in range(len(ok) - 1, -1, -1):final_data[i] ^= ok_bytes[j]return base64.b64encode(bytes(final_data)).decode()def verify():ok = "637301896559910210"array2 = list(base64.b64decode(login4("NTA0MDMyOzo1NjY6OjIzMTIzfzIxMDc2NTQ7OjM=")))ok_bytes = list(ok.encode())for i in range(len(array2)):for j in range(len(ok_bytes)):array2[i] ^= ok_bytes[j]return bytes(array2).decode()if __name__ == "__main__":print(verify())

其中login4()是接受软件请求验证的数据, verify()模拟软件发送验证, 随后编写代理服务器

from flask import Flask, request
import base64app = Flask(__name__)@app.route('/api/cd694e62ba74089c8df7aefb324c7910')
def hello_world():data = request.args.get("login4")if data:return login4(data)else:return "登录成功|999999|1234567890"def login4(data_in: str):input_bytes = list(base64.b64decode(data_in))key_byte = list("123C7E5E875FBF0EEE2583F8AF3DDFF9".encode())for i in range(len(input_bytes) - 1, -1, -1):for j in range(len(key_byte) - 1, -1, -1):input_bytes[i] ^= key_byte[j]ok, token = bytes(input_bytes).decode().split("|")print(ok, token)ok_bytes = list(ok.encode())final_data = list("PASS".encode())for i in range(len(final_data) - 1, -1, -1):for j in range(len(ok) - 1, -1, -1):final_data[i] ^= ok_bytes[j]return base64.b64encode(bytes(final_data)).decode()app.run()

然后通过Fiddler的重定向功能进行测试

验证结果



这个软件就此就破解完成了

Android逆向笔记(二) -- 破解AutoR的注册码验证相关推荐

  1. Android 逆向笔记 —— 一个简单 CrackMe 的逆向总结

    温馨提示 请拖动到文章末尾,长按识别「抽奖」小程序. 在我的印象中,懂逆向的,都是大牛,让我们一起来看看下面这位大牛的学习心得. 无意中在看雪看到一个简单的 CrackMe 应用,正好就着这个例子总结 ...

  2. Android逆向笔记-大部分内购游戏破解思路

    最近出了几个Android逆向的笔记,CSDN审核不通过,在此不再做详细的笔记,仅是记录下思路,免得CSDN审核不通过. 这里以单机游戏为例,大部分是单机内购游戏. 2020-07-05 10:35: ...

  3. 《教我兄弟学Android逆向07 IDAPro破解第一个so》

    上一篇 < 教我兄弟学Android逆向06 用AndroidStudio编写第一个so>我带你用AS编写了第一个so 现在回顾一下 首先我创建了一个myJNI类 里面包含一个Native ...

  4. 第一行代码 Android读书笔记(二)

    第一行代码 Android读书笔记 第三章 软件也要拼脸蛋-UI开发的点点滴滴 常用控件的使用方法 详解4种基本布局 自定义控件 最常用和最难用的控件-ListView 更加强大的滚动控件-Recyc ...

  5. Android逆向笔记-使用Android Studio调试Smali代码(方式二)

    这里我使用Android Studio写了这样的一个程序: 这里我使用Android Studio写了这样的一个程序: 然后点下BUTTON后: 下面写下如何调试这种程序. 开发环境: win 10: ...

  6. Android逆向笔记-4种方式破解下例中的smali代码

    原始的代码如下: 这里可以直接看到,用户名是hfdcxy,密码是1234. 如何破解,提供4个思路: 改法一: 将40行和48行的if-eqz改为if-nez:如果为0就跳转改为如果不为0就跳转,也就 ...

  7. Android逆向笔记-破解自己编写的Android应用程序(开发及破解)

    这里开发使用的Android studio,使用的模拟器为: Pixel 2 API 22也就是Android 5的系统. 这里演示下开发的程序: 这里模拟了下激活程序,用户名是用户自己输入的,密码是 ...

  8. 【android逆向笔记】(二)滚动的天空逆向

    对滚动的天空游戏APP进行逆向 效果:可以无限购买. ps:参考教程 https://www.52pojie.cn/thread-632178-1-2.html 因为是初学,所以对一些代码方面就会笔记 ...

  9. Android逆向笔记-破解某APP签名摘要算法

    这里科普几个摘要算法,散列算法(签名算法)有:MD5.SHA1.HMAC 用途:主要用于验证,防止信息被修.具体用途如:文件校验.数字签名.鉴权协议 MD5:MD5是一种不可逆的加密算法,目前是最牢靠 ...

最新文章

  1. 哲学是什么?(选自:苏菲的世界)
  2. 使用 icon 字体图标出现小方块问题
  3. BZOJ 1977: [BeiJing2010组队]次小生成树(Kruskal+树上倍增)
  4. Dataset:数据集集合(CV方向数据集)-常见的计算机视觉图像数据集大集合包括表面缺陷检测数据集(持续更新)
  5. 海南大学计算机科学与技术专业考研,2021年海南大学计算机科学与技术(081200)硕士研究生招生信息_考研招生计划和招生人数 - 学途吧...
  6. 5种ASP.NET页面间传递参数实例代码
  7. SQL2005转2000
  8. 小程序入门到精通(二):了解小程序开发4个重要文件
  9. Reactor模型和Proactor模型:同步IO与异步IO
  10. Nginx——反向代理多个服务器
  11. Linux经常使用到的操作
  12. STM32 IWDG时间计算方法
  13. XP系统无法远程桌面
  14. 用python画滑稽表情_用Python画QQ表情中的滑稽脸
  15. core dump的诡异事件
  16. 《麻省理工学院公开课:人工智能》笔记四
  17. iphone申请AppleID后无法登陆App Store
  18. ASP的技术特点与使用方法
  19. mac录屏快捷键 - mac截图截屏快捷键 - 自带录屏软件QuickTime Player如何使用
  20. 不想周末被工作提醒打扰?你需要这个手机便签消息免打扰设置

热门文章

  1. Hough Transform Tutorial
  2. 什么是istp?istp收录
  3. Linux Mint18分区方案
  4. 三星GT-S7572换屏幕教程
  5. python 图像等比例缩放
  6. 肖博高中数学高考数学二轮复习方法三角函数的图象与性质策略,附例题解析!
  7. 全网最全Python项目体系练习500例(附源代码),练完可就业
  8. ChatGPT:那些让美国伟大的俄罗斯人
  9. 个人上网行为安全保护解决方案
  10. 游戏推广怎么做比较好?做游戏推广时如何选取靠谱的宣传机构