我最近发现有很多小伙伴拿我上一次写的博客的东西进行盈利,就。。。。以后不写大厂的吧。

本文只涉及 静态分析,建议无基础的同学,自行补足Java 基础,不要盲目的跳高,更不可眼高手低。  附APP样本例子 点我下载

1 抓包这里不进行过多的阐述,直接把我自己抓包的参数附上, 如有兴趣,自行抓包

userPassword 3253df239d242895b7e5e9b9f29c85dc
userAccount a2501162
confirmPwd 3253df239d242895b7e5e9b9f29c85dc
token cb5f6fa7dfc101f39e81ecc7788ab297

这里进行补充一下,userAccount 是一个明文,账号名,是因为我们要用得到

下面进入正题!!!!

  1. 祭出神器 Jadx 
  2. 尝试直接搜索关键字段的名字, "userPassword"/"confirmPwd"/"token" 这里我们发现,其实 userPassword 与 confirmPwd  是一样的参数  所以 搜索哪个都可以
  3. 还有一个非常有趣的事情,有一些小伙伴问我,为什么我搜索的字段和你搜索字段 都是一样的 但是结果不一样,那就是要注意,中英文引号的问题///

通过 检索 我们搜索的关键字符串,我们发现 有两处 有关 MD5 的地方

    public static HashMap<String, Object> creatRegistMap(RegistParamBean registParamBean, Context mContext) {String registerSourceName = LoginUtil.getPackageName(mContext);HashMap<String, Object> map = new HashMap<>();String userAccount = registParamBean.getUserAccount();if (userAccount != null) {map.put("userAccount", userAccount);String token = appMD5(userAccount.toLowerCase());registParamBean.setToken(token);}String userPassword = registParamBean.getUserPassword();if (userPassword != null) {map.put("userPassword", pwdMD5(userPassword));}
private void modifyPwd(String oldUserPassword, String userPassword, String confrimUserPassword) {Map<String, String> map = new HashMap<>();map.put("oldUserPassword", UserEncrype.pwdMD5(oldUserPassword));map.put("userPassword", UserEncrype.pwdMD5(userPassword));map.put("confrimUserPassword", UserEncrype.pwdMD5(confrimUserPassword));

反正参数只有两个,干脆我们都跟进去看一看 都是怎么加密的 ,在这里 我也没有用firda 进行 插桩分析,都是静态分析,我也只能用笨方法 干脆都看一遍

在这里 我们在关键调用函数的地方 双击跳转更过去 或者 按住 Ctrl+单击 进行 追踪

public class UserEncrype {static final /* synthetic */ boolean $assertionsDisabled = false;public static String pwdMD5(String pwd) {if (TextUtils.isEmpty(pwd)) {return "";}String first = Md5(pwd);String firstPwd = Md5(first);StringBuilder builder = new StringBuilder();builder.append(reverse(firstPwd.substring(0, firstPwd.length() / 2)));builder.append(reverse(firstPwd.substring(firstPwd.length() / 2)));builder.append(builder.substring(0, 3));String result = Md5(builder.toString());return result;}
    public static String pwdMD5(String pwd) {if (TextUtils.isEmpty(pwd)) {return "";}String first = Md5(pwd);String firstPwd = Md5(first);StringBuilder builder = new StringBuilder();builder.append(reverse(firstPwd.substring(0, firstPwd.length() / 2)));builder.append(reverse(firstPwd.substring(firstPwd.length() / 2)));builder.append(builder.substring(0, 3));String result = Md5(builder.toString());return result;}
///我们对这一段代码进行逐句翻译

这下 真的省时间,我们发现 其实加密的步骤都是一样的 ,那我们就挑出来一段进行 逐句的翻译

public static String pwdMD5(String pwd) {if (TextUtils.isEmpty(pwd)) {return "";}

这一段代码就是 传进去一个 string 类型 的 参数 这个参数代表 密码 pwd 然后 后面没什么营养 接着往下走

        String first = Md5(pwd);String firstPwd = Md5(first);StringBuilder builder = new StringBuilder();builder.append(reverse(firstPwd.substring(0, firstPwd.length() / 2)));builder.append(reverse(firstPwd.substring(firstPwd.length() / 2)));builder.append(builder.substring(0, 3));String result = Md5(builder.toString());return result;
  1. 这里就是关键的加密点了,可以看到 其实就是来回的标准MD5
  2. 第一步 对传入的明文密码 进行一次MD5 得到 first
  3. 对 first 再进行一次 MD5 得到 firstpwd
  4. new 一个 StringBuilder  StringBuilder 其实实际上就是一个字符串的容器 我们就是可以理解为 往里面加东西 把字符串拼接起来  注意 4 5 两个步骤 里面都有一个 reverse() 实际上就是一个反转 
    String resp = reverse("沈听白");这里如果输出的话 实际上 resp 就是  白听沈
  5. StringBuilder 这个容器 加入 第一个内容  取 firstpwd 的前16位  其实 MD5就是一个32位的字符串,(0,first.length()/2)实际上 就是 (0,32/2)
  6. StringBuilder 加入第二个参数,firsrpwd 取后16位   substring(0,16)///  substring(16)的区别 可以自己百度搜索语法 这里贴出来 一个 简单的展示图

是不是就非常清晰了~~~~ 其实 说到这里 APP逆向 本身就不是那么的困难 只不过是 缺一个带路人而已。你的带路人可以是面向百度编程 也可以是 自己找人教

接着继续下一个参数

 builder.append(builder.substring(0, 3));

这个参数 不妨自己动脑 想一想 是取的什么呢,????

答案其实非常简单---------------------------------------------------------------------------------------------------------

我刚才说了,StringBuilder 实际上就是 一个字符串容器 你可以简单的把它理解为 一个 不断拼接字符串的过程 每一次的 append() 都是加入一个新的 字符串

再举一个非常简单的例子

        StringBuilder builder = new StringBuilder();builder.append("沈");builder.append("听");builder.append("白");String result =builder.toString();

所以 这里 你们就能猜到了  这个 result 的 结果 就是 "沈听白"  是不是非常的简单容易理解

继续回归正题

builder.substring(0,3) 实际上 就是对已经加入的两个字符串 取他们的 substing(0,3)的内容

最后 对 结果 再进行一次 MD5  就得到了 最终的加密密文 

这里并没有再对其他的参数进行分析,token参数也是这么一个道理,小伙伴可以自己去分析一下,根据我一步一步的讲解自己去试着理解这些东西, 如果你能理解 恭喜你,你实际上已经对APP逆向 安卓逆向 这个领域 吹响第一次的 冲锋号!!!

点个赞不过分吧~~~~~~~~ 

这里 附上 易语言 还原的源码  很久没有用过易语言了 如果 哪个地方不小心写错了 欢迎支持 我没有测试。。。

.版本 2
.支持库 dp1.子程序 GetToken, 文本型
.参数 username, 文本型
.局部变量 t, 文本型
.局部变量 n, 文本型
.局部变量 a, 文本型
.局部变量 i, 文本型
.局部变量 b, 文本型
.局部变量 d, 文本型
.局部变量 r, 文本型
.局部变量 h, 文本型
.局部变量 z, 文本型t = 取数据摘要 (到字节集 (取数据摘要 (到字节集 (到小写 (username)))))
n = 取文本左边 (t, 16)
a = 取文本右边 (t, 16)
b = 到文本 (字节集_反转 (到字节集 (n)))
d = 到文本 (字节集_反转 (到字节集 (a)))
i = b + d
h = 取文本中间 (i, 0, 3)
r = i + h
z = 取数据摘要 (到字节集 (r))
返回 (z)

谢谢支持!!!

最后 学习交流 可以私信本人 欢迎喜欢学习的小伙伴在一起进行交流。

安卓逆向例子--某菠菜APP token pwd 参数相关推荐

  1. 安卓逆向(x车app,登录token)

    一.抓包分析 随便输入个手机号之后点击登录,通过抓包可以看到这个token值是加密的,那么接下来就找这个token的生成地方 二.静态分析代码 打开jadx(没有的可以去github找找),把apk拖 ...

  2. 安卓逆向 - sekiro实战某app

    文章旨在学习和记录,若有侵权,请联系删除 文章目录 前言 一.抓包 二.逆向 1. 定位接口 2. 分析请求 3. 模拟请求 1.建立sekiro连接 2.完善Handler 2.1 构造接口请求 2 ...

  3. Android逆向—苏宁金融app的data参数分析

    一.用工具抓包 二.分析apk是否加壳 没有加壳,直接用jadx打开分析 查找data=参数 文件:su_ning_jin_rong.js Java.perform(function () {var ...

  4. app安卓逆向x-sign,x-sgext,x_mini_wua,x_umt加密参数解析

    安卓逆向某生鲜平台app 本文仅作为学习交流,禁止用于商业使用 1.背景 阿里系当前采用的加密版本是6.3,6.2版本的大家几乎都解决了,6.3的网上资料很少,这里讲讲6.3的解密过程 1.阿里系通用 ...

  5. 安卓逆向小案例——阿里系某电影票务APP加密参数还原-Unidbg篇

    安卓逆向小案例--阿里系某电影票务APP加密参数还原-Unidbg篇 一.前期准备 使用unidbg还原参数时,首先需要找到指定的native方法和对应的so文件.而锁定生成加密参数的native方法 ...

  6. 安卓逆向Xposed HOOK TB直播APP的x-sign参数

    最近学习安卓逆向,接触一下TB系的APP,了解大厂APP是做数据安全的,这篇文章主要介绍某宝直播APP的签名参数x-sign的HOOK过程,当然,其他的参数也是可以HOOK的.本文只用于学习交流,请勿 ...

  7. Web逆向、软件逆向、安卓逆向、APP逆向,关于网络安全这些你必须懂

    逆向工程是网络安全行业里面一项很重要的技术. 先解释下逆向工程是什么. 逆向是一个相对正向而言的解释,相对正向来说,对一个程序来讲,正向就是开发的过程,从0到1. 就是在一个软件诞生的整个生命周期中的 ...

  8. 文章向大家介绍安卓逆向,解决app抓包抓不到的问题,主要包括安卓逆向,解决app抓包抓不到的问题使用实例、应用技巧

    本文章向大家介绍安卓逆向,解决app抓包抓不到的问题,主要包括安卓逆向,解决app抓包抓不到的问题使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下. 有时候 ...

  9. 安卓逆向之去除app游戏入口广告

    安卓逆向学习群692903341 首先来看一下app游戏入口界面广告 接下来使用捕获当前活动界面信息命令:adb shell dumpsys activity top来获取广告界面(com.mosad ...

最新文章

  1. ADOQuery代替ClientDataSet做3-Tier系统
  2. 虽然你没有考入清华大学,但是如果你有对于计算机的向往!!!请看过来
  3. 【C++深度剖析教程18】逗号操作符的分析
  4. python之websocket
  5. __clone class php_「PHP 技巧」 不要直接克隆对象,请使用深拷贝
  6. 剑指offer(C++)-JZ6:从尾到头打印链表(数据结构-链表)
  7. android MySQL servlet_使用MySQL和Servlet编写Android接口样例
  8. 容器技术Docker K8s 3 容器技术基础-Docker
  9. 前端es6文档大全,你想要的这都有
  10. 黑客工具之NBSI介绍
  11. 锂电池容量下降怎么办?锂电池容量下降修复方法
  12. 磁盘阵列RAID技术详解
  13. outlook从服务器中恢复已删除项目,Outlook 邮件误删,请问能否恢复?谢谢
  14. 决策树一一CART算法(第三部分)
  15. DNA 4. SCI 文章中基因组的突变信号(maftools)
  16. 高频DCDC电源减小EMI的布局技巧
  17. 一图看懂《百年孤独》人物关系
  18. 通过智能网关搭建智慧杆可视对讲系统
  19. 精密单点定位技术(PPP)和RTK技术有什么区别
  20. 左手万事达、右手支付宝,被“逼上梁山”的美团支付该何去何从?

热门文章

  1. unity中的2D虚拟摇杆和3D虚拟摇杆
  2. CAS的ABA问题,ABA问题会导致什么后果?
  3. TreeView的图标个性化和动态数据加载
  4. 工业相机——选型及参数
  5. 杰西.利弗莫尔 行情记录规则注释
  6. 由113号元素鉨114号元素夫115号元素镆元素汞银金等元素构成的超导体
  7. Python pip源
  8. https://www.jianshu.com/p/43d04d8baaf7
  9. UPC 维修栅栏(基本状态转移)
  10. Snipaste 截图贴图