2023安卓逆向 -- 某合伙apk登录加密分析

接上节课内容

​安卓逆向 -- 抓包环境设置(Charles+Postern)​

一、分析登录的数据包,加密的数值是登录的密码,看着想md5加密,请求头中,x-sign也是加密的,看着也像md5。

POST /app/api/v1/partnerLogin/login HTTP/1.1
X-App: native
X-Noncestr: 123456
X-OS: partnerApp_android
X-Req-Time: 1685179539206
X-Sign: d5ff872d834ad9988d95ea8031b48107
X-Token: 
X-UserID: 
Content-Type: application/x-www-form-urlencoded
Content-Length: 59
Host: chinayltx.com
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.10.0


phone=15836353612&password=a2a07143c28b527f39cc4b1a9b41f639

二、反编译该apk

1、打开jadx,将apk拖进去分析,后台回复:课件666,获取

2、点击搜索,搜索数据包的部分url,这里搜索“partnerLogin/login”

3、双击进入第三个,这段代码的意思就是,通过submitLogin函数发起了一个POST请求

4、右击该函数,查找谁调用了submitLogin,双击进入该调用函数

5、 loginWithToken函数调用了submitLogin函数,我们继续查找谁调用了loginWithToken

6、看着下面出现了name和pwd,进入下面的调用

public class LoginUseCase extends UseCase<HttpResult<LoginInfo>> {
    private Repository mRepository;
    private String name;
    private String pwd;


    public String getName() {
        return this.name;
    }


    public void setName(String str) {
        this.name = str;
    }


    public String getPwd() {
        return this.pwd;
    }


    public void setPwd(String str) {
        this.pwd = str;
    }


    @Inject
    public LoginUseCase(Repository repository) {
        this.mRepository = repository;
    }


    @Override // com.yltx.oil.partner.mvp.domain.UseCase
    protected Observable<HttpResult<LoginInfo>> buildObservable() {
        return this.mRepository.loginWithToken(this.name, this.pwd);
    }
}

7、分析上面的代码,可以看到有个setPwd函数,这个就是加密函数,继续查看谁调用了该函数,进入一个md5的加密代码

8、继续搜索X-sign,双击进入该行代码

9、这行代码的意思就是将"X-Sign"赋值给PARAM_SIGN,并把他设置成了静态变量

private static final String PARAM_SIGN = "X-Sign";

10、局部搜索PARAM_SIGN,发现this.sign赋值给了PARAM_SIGN,而this.sign=sign(sb.toString())

11、按着ctrl键,点击上面a.b,进入到下面代码,代表一个&符号,requestBody请求体,初步判断sb.toString就是

phone=15836353612&password=a2a07143c28b527f39cc4b1a9b41f639

12、继续搜索sign函数,会看到下面一段声明代码

private String sign(String str) {
        return Md5.md5(this.token + this.reqTime + 
        this.noncestr.substring(2) + str).toLowerCase();
    }

12 、通过数据包发现token是空,reqTime是时间戳,noncestr是132456,最终就是将这些值进行md5处理。

13、验证代码

import hashlib
# md5加密=hashlib.md5()
# 密码="aiyou123"
# md5加密.update(密码.encode("utf8"))
# pwd=md5加密.hexdigest()
# print(pwd)


token=""
reqTime="1685346660611"
nnotallow="123456"[2:]
str="phnotallow=15836353612&password=a2a07143c28b527f39cc4b1a9b41f639"




md5加密=hashlib.md5()
要加密的字符串=f'{token}{reqTime}{non}{str}'
md5加密.update(要加密的字符串.encode("utf8"))
pwd=md5加密.hexdigest()
print(pwd)


运行结果:
9970affbcb8ee0d04eeb25d9020b3704

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web安全工具库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值