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

来自:Python编程与实战(微信号:pthon1024)

前言:

前段时间做爬虫遇到一个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文件
反编译生成.jar文件
4. 生成.jar文件就是apk的源码了,我们使用jd_gui来查看源码
在这里插入图片描述
查看源码
查看源码
幸运的是这个app并没有加固,有app进行了加固,像腾讯乐固,360加固等等
在这里插入图片描述
腾讯加固
在这里插入图片描述
360加固
对于这种我们不能直接反编译,首先需要脱壳,然后再反编译

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

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

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

需要注意的是,反编译的代码非常混乱,错误很多,并且apk经过混淆,变量名都消失了,这时一定要有有耐心,仔细研究代码。
根据前面请求、响应参数去搜索,或者请求的 url 地址去搜索,而且经验很重要
在这里插入图片描述
搜索结果
在这里插入图片描述
然后根据这些搜索到的结果慢慢去找。我们主要找到发送请求的时候定义参数的代码,然后往上追溯,
在查找的过程中要尽可能的多尝试,大胆猜测

最后我根据keycode找到了登录响应参数的生成函数
在这里插入图片描述
登录响应参数

其中有下划线的地方,我们可以直接点进去
在这里插入图片描述

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

验证

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

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的生成代码

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呢

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,仔细看两者字母,数字基本都是一样的,感觉应该是对了,但还是有点差异!
再返回去看看源码,源码中最后将生成的加密数据再传给了某个函数再返回

 return c.a(str5);

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

public class c
{
  public static String a(String paramString)
  {
    return paramString.replaceAll("\+", "!");
  }
}

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

总结

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

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

  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
某flutter-app逆向分析是指对于一个使用flutter框架开发的应用进行逆向工程分析逆向工程是通过分析应用的代码、二进制文件等来了解其内部实现细节。 首先,我们需要获取该应用的安装包文件(APK或IPA文件),然后进行解包操作,将其转换为可读取的文件目录结构。 接下来,我们可以使用一些工具来提取应用的资源文件、代码文件等。对于flutter-app来说,可以提取出dart文件,这是flutter的主要代码文件,其中包含了应用的逻辑实现。 通过阅读dart文件,我们可以了解应用的代码结构、数据模型、界面设计等。可以分析应用的逻辑实现方法,包括各种函数、类、方法的调用关系。 同时,还可以通过分析相关配置文件、资源文件等来了解应用的各种设置、资源加载方式等。 在逆向过程中,还可以使用一些调试工具来进一步了解应用的运行机制。例如,hook工具可以拦截应用的函数调用,并捕获输入输出数据,用于进一步分析逆向分析的目的可以有很多,比如了解应用的工作原理、发现潜在的漏洞或安全问题、提供参考用于自己的开发等。 需要注意的是,逆向分析需要遵守法律规定。未经授权的逆向分析可能侵犯他人的知识产权,涉及到隐私等方面的问题。因此,在进行逆向分析之前,应该了解并遵守当地相关法律法规,避免产生法律纠纷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值