来自: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.如果认识大佬,当然是要抱紧大佬的大腿啊,多问问大佬,会让你事半功倍!

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

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

  1. 逆向入门分析实战(二)

    上次我们对主函数分析完成了,逆向入门分析实战(一)那么这次我们对子函数IsAlreadyRun进行分析. C语言代码 IsAlreadyRun函数的C语言代码如下图所示: 下面对其汇编代码进行分析: ...

  2. 逆向入门分析实战(三)

    之前两篇文章,针对恶意代码为了确保自身只有一个实例在运行进行了正向开发和逆向分析.逆向入门分析实战(一)逆向分析入门实战(二) 这种现象在恶意代码中非常常见,现在对上次的内容进行一个简要的回顾和扩展: ...

  3. 对某数藏app逆向安全分析

    目录 前言 分析 加密参数分析 webview调试 1.webviewdebughook调试 2.webviewpp调试 源码静态分析 x-request-id x-token sign: web端调 ...

  4. 【APP逆向-入门级】某直播APP逆向过程

    原文章逆向思路 重点:先向CSDN审核客服声明一下:本文仅仅是用于技术交流,甚至可以都算不上APP逆向,文章提到的截图已经全部打码.也没有提及是什么APP,希望审核人员可以通过本文章,谢谢. 这是一篇 ...

  5. 木马编程入门_逆向入门分析实战(一)

    原创xiaoyuer合天智汇 木马分析入门 大家好,我最近从Web安全开始学习二进制安全,分享一下自己学习过程的收获和心得体会.由于是入门的内容,所以对于二进制大佬来说这很简单,所以本文主要面向的对象 ...

  6. 逆向入门分析实战(一)

    本文作者:xiaoyuer 本文涉及知识点靶场练习--ARM汇编教程:该课程是后续<ARM漏洞利用技术>打基础的,我们在漏洞利用课程中会介绍使用ARM汇编编写shellcode等内容,所以 ...

  7. 贴捕鱼cocos2d逆向入门分析

    cocos2d-x 先clone git clone地址 https://github.com/cocos2d/cocos2d-x.git lua虚拟机相关代码在cocos2d-x\cocos\scr ...

  8. 地址:https://passport.jd.com/new/login.aspx 需求:模拟京东登陆请求参数

    京东登录请求参数包括: loginname: 登录名, 可以是用户名或者手机号码. nloginpwd: 登录密码. chkRememberMe: 是否记住登录状态, 值为"on" ...

  9. android开发入门与实践_我的新书《Android App开发入门与实战》已经出版

    前言 工作之余喜欢在CSDN平台上写一些技术文章,算下时间也有两三年了.写文章的目的一方面是自己对技术的总结,另一方面也是将平时遇到的问题和解决方案与大家分享,还有就是在这个平台上能和大家共同交流. ...

  10. 京东怎么做《IOS系统APP耗电量检测分析和优化》?

    耗电量不仅是衡量应用性能表现的一个重要指标,同时也是用户体验的重要组成部分.要做好⼀款APP,不仅仅是实现功能那么简单,我们需要考虑很多性能指标,让用户用的更爽.在开发过程中,要充分考虑到各项性能指标 ...

最新文章

  1. 学习Python开发培训有用吗
  2. java bitmap base64_Android Bitmap到Base64字符串
  3. “全能”选手—Django 1.10文档中文版Part2
  4. 别人的Linux私房菜(19)认识与分析日志文件
  5. mysql查询数据上一条_MySQL查询当前数据上一条和下一条的记录
  6. Web性能测试篇:AB 压力测试
  7. UVALive - 5713 最小生成树
  8. Android用户界面设计:布局基础
  9. Android中Parcelable和Serializable接口用法
  10. 页面定时跳转的js和php的代码实现和页面定时刷新
  11. 八皇后-韩顺平java
  12. h5/uni-app打开手机app,没有则跳转到商店下载
  13. 简单 申请 msn.com邮箱 @
  14. 树莓派x86Android,3种创客开发板走向专业-浅谈X86树莓派板型的UP系列
  15. unity 中是如何实现游戏人物换装的
  16. 【Linux】Ubuntu运行环境搭建
  17. 数据透视表:多重合并计算数据区域
  18. 远程服务器怎么能显示电脑u盘,怎样在远程服务器上看到u盘
  19. html图片缩放6,html img图片不变形等比例缩放,兼容ie6
  20. 跳槽加薪谋发展还是等公司配股?

热门文章

  1. c语言自学去视频,最适合自学的C语言自学视频
  2. 8 个经典的 HTML5 游戏及源码
  3. KVM 虚拟化技术 理论详解
  4. 如何卸载 think-cell?丨卸载教程丨卸载办法
  5. 程序员的数学【线性代数高级】
  6. Vue 下载文件需要token设置
  7. 取石子游戏,威佐夫博弈的推理
  8. MySQL体系结构图详解
  9. web前端面试题(必背面试题)
  10. 如何学好3D游戏引擎编程