前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >app逆向入门分析——破解某APP登陆请求参数

app逆向入门分析——破解某APP登陆请求参数

作者头像
Python编程与实战
发布于 2019-12-03 05:29:43
发布于 2019-12-03 05:29:43
2.4K00
代码可运行
举报
运行总次数:0
代码可运行

前言:

前段时间做爬虫遇到一个app,里面的数据需要登录之后才能拿到,而且登录不能用密码,只能通过验证码登录。 这不是明摆着欺负人么,按赵四哥那句话来说就是:

生死看淡,不服就干!

所以接下来手把手带大家就某个app登陆请求的加密参数进行分析破解, 从而实现从网络抓包的密文到明文的转换。

环境配置:

Python Java dex2jar(将apk反编译成java源码) jd_gui(源码查看) jadx 已root的手机或者安卓模拟器 fiddler

PS:公众号后台回复 "反编译" 即可获取反编译工具包

分析:

首先我们用fiddler抓包工具对app的登陆进行抓包,这个app抓包需要开启全局代理,不然会抓不到数据。

如果还不会使用全局代理抓包的朋友,可以看下前面一篇文章,里面有详细的抓包教程。

抓包的数据如下:

发送验证码请求参数

我们可以看到有个 token 的参数,有经验的朋友知道,这是服务器后台生成的,而且在发送登陆验证码请求之前并没有其它的数据交换!

登录请求参数

这时候我们就要去看 app 源码找到这个参数的加密方式,然后用转换成 Python 代码生成。

接下来就带大家就一步一步来破解这个参数。

破解过程:

我们要获取app源码,就要对app进行反编译,反编译方式很简单,直接用工具搞定。 有两种反编译方式可供选择,反编译过程如下:

1.将安卓app的后缀更改为可解密的包,并解压

解压生产.dex

2.将解压后生成的后缀为 .dex 复制到 dex2jar 安装目录中

解压生产.dex

3.DOS命令行进入此文件夹,然后执行命令:dex2jar.bat classes.dex

这个app有两个 *.dex *文件,所以两个* .dex* 文件都需要执行

执行完之后会生成两个对应的 .jar 文件,效果如下:

反编译生成.jar文件

4. 生成.jar文件就是apk的源码了,我们使用 jd_gui 来查看源码

查看源码

幸运的是这个app并没有加固,有app进行了加固,像腾讯乐固360加固等等

腾讯加固

360加固

对于这种我们不能直接反编译,首先需要脱壳,然后再反编译

5.第二种反编译的方法是直接使用工具 jadx 打开 .apk 文件

剩下的事就是仔细阅读代码,分析其中的逻辑了。

6.根据请求或响应的参数去源码中搜索加密方式

需要注意的是,反编译的代码非常混乱,错误很多,并且apk经过混淆,变量名都消失了,这时一定要有有耐心,仔细研究代码。 根据前面请求、响应参数去搜索,或者请求的 url 地址去搜索,而且经验很重要

搜索结果

然后根据这些搜索到的结果慢慢去找。我们主要找到发送请求的时候定义参数的代码,然后往上追溯, 在查找的过程中要尽可能的多尝试,大胆猜测

最后我根据 keycode 找到了登录响应参数的生成函数

登录响应参数 其中有下划线的地方,我们可以直接点进去

加密方法

这部分代码就是加密的方法!

验证

我们把源码拷贝出来,分析加密参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private String c(String paramString)
  {
    Date localDate = new Date();
    Locale localLocale1 = Locale.CHINA;
    String str1 = new SimpleDateFormat("yyyyMMdd", localLocale1).format(localDate);
    Locale localLocale2 = Locale.CHINA;
    String str2 = new SimpleDateFormat("MMdd", localLocale2).format(localDate);
    StringBuilder localStringBuilder1 = new StringBuilder();
    String str3 = paramString.substring(7);
    StringBuilder localStringBuilder2 = localStringBuilder1.append(str3);
    StringBuilder localStringBuilder3 = localStringBuilder1.append(str2);
    String str4 = localStringBuilder1.toString();
    StringBuilder localStringBuilder4 = new StringBuilder();
    StringBuilder localStringBuilder5 = localStringBuilder4.append(paramString);
    StringBuilder localStringBuilder6 = localStringBuilder4.append("|");
    StringBuilder localStringBuilder7 = localStringBuilder4.append(str1);
    String str5 = localStringBuilder4.toString();
    try
    {
      str5 = zxw.data.c.b.a(str5, str4);
    }
    catch (Exception localException)
    {
      localException.printStackTrace();
      str5 = null;
    }
    return c.a(str5);
  }

其中生成了两个参数 str5, str4 传到加密函数。 下面是 str5 的生成代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String str1 = new SimpleDateFormat("yyyyMMdd", localLocale1).format(localDate);
StringBuilder localStringBuilder4 = new StringBuilder();
StringBuilder localStringBuilder5 = localStringBuilder4.append(paramString);
StringBuilder localStringBuilder6 = localStringBuilder4.append("|");
StringBuilder localStringBuilder7 = localStringBuilder4.append(str1);
String str5 = localStringBuilder4.toString();

str1 = 20190319,也就是今天的日期 str5 = 传过来的参数 + '|' + '20190319' 那么 str4

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String str2 = new SimpleDateFormat("MMdd", localLocale2).format(localDate);
StringBuilder localStringBuilder1 = new StringBuilder();
String str3 = paramString.substring(7);
StringBuilder localStringBuilder2 = localStringBuilder1.append(str3);
StringBuilder localStringBuilder3 = localStringBuilder1.append(str2);
String str4 = localStringBuilder1.toString();

java的 substring() 方法类似 python中的字符串切片,只是 substring() 方法返回字符串的子字符串。

那么我们可以推测,paramString 是一个长度大于7的字符串。这里大胆的猜测是我们提交的那个手机号码,因为我们请求的时候只提交了这个参数。

所以 str4 = '手机号码后四位' + 0319 如果不知道生成的方式,就用 java运行一波,将这两个参数打印出来,是最方便快捷的方法~~

既然知道加密参数了,接下来就是验证了 源码加密的方法如下:

源码加密

下面是用 python 代码改造后的加密

python改造的加密

运行之后的结果为 False,仔细看两者字母,数字基本都是一样的,感觉应该是对了,但还是有点差异! 再返回去看看源码,源码中最后将生成的加密数据再传给了某个函数再返回

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 return c.a(str5);

下面是这个 *c.a *的函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class c
{
  public static String a(String paramString)
  {
    return paramString.replaceAll("\\+", "!");
  }
}

原来是将 "+" 替换成了 "!" 所以我们将之前运行出来的结果中的 "+" 替换成 "!" 就是完全正确了! so, 我们就将这个 token 参数给破解了!

总结

1.对于app加密的要有耐心,尤其是在根据参数在源码中寻找加密方式的时候,更加需要耐心。 2.善于利用搜索引擎,碰到看不懂的方法,就去网上多搜索。 3.如果认识大佬,当然是要抱紧大佬的大腿啊,多问问大佬,会让你事半功倍!

当你解决的问题那一刻,你就会发现之前受的苦都是值得的!


公众号:Python编程与实战

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python编程与实战 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
某教务管理系统APP逆向分析之协议漏洞
某大学在使用的一款教务管理系统手机app,为了方便学生查询成绩和选课。我在一次偶然逆向中找到严重漏洞,现在把整个分析流程记录下来。
安恒网络空间安全讲武堂
2019/09/29
1.1K0
通过反编译深入理解Java String及intern
  字符串在我们平时的编码工作中其实用的非常多,并且用起来也比较简单,所以很少有人对其做特别深入的研究。倒是面试或者笔试的时候,往往会涉及比较深入和难度大一点的问题。我在招聘的时候也偶尔会问应聘者相关的问题,倒不是说一定要回答的特别正确和深入,通常问这些问题的目的有两个,第一是考察对 JAVA 基础知识的了解程度,第二是考察应聘者对技术的态度。
用户2140019
2022/05/09
2610
通过反编译深入理解Java String及intern
高效拼接字符串,你会用 “+” 还是StringBuilder.append?
在《阿里java开发手册(泰山版)》(提取码:hb6i)中,对于Java字符串的拼接有一条规则如下:
陈哈哈
2020/07/03
4.8K0
Java String的探讨
以前一直想要好好总结一下String的相关的知识点,苦于没有时间,终于在今天有一个闲暇的时间来好好总结一下,也希望这文章能够加深我对于String相关内容的理解(ps:在我看来,学习某些知识点的时候把学到的想到的都记录下一方面能够加深自己学习印象,二者能够锻炼锻炼我的文笔)
w4ngzhen
2023/10/16
1970
Java学习笔记——Java常用类
String是一个final类,代表不可变的字符序列,底层使用char[]存放。一个字符串对象一旦被配置,其内容是不可变的。
梦飞
2022/06/23
4490
[Java 基础]字符串
静默虚空
2018/01/05
5290
JDK8中String的intern()方法详细解读【内存图解+多种例子+1.1w字长文】
String字符串在我们日常开发中最常用的,当然还有他的两个兄弟StringBuilder和StringBuilder。他三个的区别也是面试中经常问到的,大家如果不知道,就要先去看看了哈!最近也是看周志明老师的深入JVM一书中写到关于intern()方法的介绍,小编也是以前没在开发中用到。但是面试题还是很多的,所以特意研究了一天,写下来记录一下自己的收获,希望也可以帮助到大家!!
掉发的小王
2022/07/11
6400
JDK8中String的intern()方法详细解读【内存图解+多种例子+1.1w字长文】
String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么不可变
String是Java中的一个内置类,Immutable不可变,即一旦创建String对象,它的值就不能被更改。对String对象的replace、subString、toLowerCase等操作都会返回一个新String对象,故每次操作String时 性能较低、浪费内存空间
寻求出路的程序媛
2024/04/21
3360
String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么不可变
深入理解Java中的String
想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码:
lyb-geek
2019/01/08
6500
【逆向&编程实战】Metasploit安卓载荷运行流程分析_复现meterpreter模块接管shell
MainActivity在向MainService类的startService方法传入了Context后立刻结束掉了当前类
重生信息安全
2020/04/26
1.1K0
【逆向&编程实战】Metasploit安卓载荷运行流程分析_复现meterpreter模块接管shell
携程一面:String 类型的变量和常量做“+”运算时发生了什么?
因为,比较 String 字符串的值是否相等,可以使用 equals() 方法。String 中的 equals 方法是被重写过的。Object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是字符串的值是否相等。
Java技术江湖
2021/09/10
6230
携程一面:String 类型的变量和常量做“+”运算时发生了什么?
Java:String类再回顾
原因在于实例中的 s 只是一个 String 对象的引用,并不是对象本身,当执行 s = “BBBB”; 创建了一个新的对象 “BBBB”,而原来的 “AAAA” 还存在于内存中。
鲲志说
2025/04/07
510
Java:String类再回顾
Java常用类
补充: 与 StringBuffer、StringBuilder 之间的转换 String === 》 StringBuffer、StringBuilder:调用 StringBuffer、StringBuilder 构造器; StringBuffer、StringBuilder ===》 String: ① 调用 String 构造器 ② StringBuffer、StringBuilder 的 toString();
OY
2022/02/21
1.5K0
Java常用类
深入理解String类
String是java中的字符串。String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。String不属于8种基本数据类型,String是一个对象。本文主要具体介绍一下String。
栋先生
2018/09/29
4650
深入理解String类
java面试题:new String("abc")创建几个对象;String a="abc",String b=new String("abc")区别
还记得String、StringBuilder、StringBuffer区别、String底层原理、实例化、拼接、比较吗?如果忘记可以到这里重温复习String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么不可变
寻求出路的程序媛
2024/04/21
5150
java面试题:new String("abc")创建几个对象;String a="abc",String b=new String("abc")区别
浅谈android hook技术浅谈android hook技术-- coding:utf-8 --print jscode author = 'gaohe'-- coding:utf-8 --pri
您当前的位置: 安全博客 > 技术研究 > 浅谈android hook技术 浅谈android hook技术 2017年03月17日 10:06 1249 前言 在测试android过程中,能对函数进行hook能帮助更加深入的进行测试,本文简单介绍了hook框架xposed和frida,从简单的小例子做了简单的演示,算是自己的学习的过程,是个入门的过程。
一个会写诗的程序员
2018/08/20
2K0
Java String &StringUtils
1、首先String 是一个final类(不能被继承,可以理解为最终的,防止继承使用),里面维护了一个字节数组。 我们经常使用String 一般都是 String str1 = "2333”; 这种的叫做字面量,还有一种是String str2 = new String(“2333”); 然后还有配合Builder 及 Buffer使用的。 这些方式存在什么差异呢:可以试着去运行这个例子
邹志全
2019/10/13
4840
【Java基础】面试官:Java 对象是值传递还是引用传递?
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
Lorin 洛林
2023/11/09
3050
【Java基础】面试官:Java 对象是值传递还是引用传递?
Crack App | 某新闻 app 参数 sn 加密逻辑分析
aHR0cHM6Ly93d3cud2FuZG91amlhLmNvbS9hcHBzLzQwMzYz
咸鱼学Python
2022/06/24
9190
Crack App | 某新闻 app 参数 sn 加密逻辑分析
java_String类、StringBuilder类、Arrays类、Math类的使用
java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如 "abc" )都可以被看作是实现此类的实例
咕咕星
2020/08/19
1.2K0
java_String类、StringBuilder类、Arrays类、Math类的使用
推荐阅读
相关推荐
某教务管理系统APP逆向分析之协议漏洞
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验