App逆向1——油联合伙人

阅读本篇文章请先具备python爬虫、java、js逆向基础


变量值分析

下载油联合伙人:
https://www.wandoujia.com/apps/8051276
在模拟器中登录并抓包,发现被加密过
在这里插入图片描述
同时X-sign字段也一直在不断变化,所以我们需要逆向出X-sign和password的算法并用python去实现

反编译

password

1.安装jadx,将其编译出来:
在这里插入图片描述
2.通过搜索关键字定位到password
在这里插入图片描述
3.接着查找用例,定位到谁使用了它:
在这里插入图片描述
4.紧接着继续查找用例loginWithToken,分析定位到第二条:
在这里插入图片描述
ps:如果查找用例搜索不到,可以通过搜索功能搜索关键字定位:
在这里插入图片描述
5.最后定位到该位置,进行跳到声明,查看具体的算法:
在这里插入图片描述

6.最后跳转到的加密算法如下,分析得就是一个普通的MD5加密
在这里插入图片描述
7.使用python的MD5算法调用即可

from hashlib import md5

# 网上找一段md5加密的代码
def encrypt_md5(s):
    # 创建md5对象
    new_md5 = md5()
    # 这里必须用encode()函数对字符串进行编码,不然会报 TypeError: Unicode-objects must be encoded before hashing
    new_md5.update(s.encode(encoding='utf-8'))
    # 加密
    return new_md5.hexdigest()
print(encrypt_md5("123456"))

X-sign

1.通过搜索X-sign定位
在这里插入图片描述
2.再通过搜索X-sign定位出的值进行查找用例
在这里插入图片描述
3.查找用例定位到如下代码,发现该代码和Header请求体中的请求一样,所以就能大概确定是这个位置

在这里插入图片描述
4.分析this.sign的值为sb.toString()
在这里插入图片描述

4.而sb的值为从formBody,append了一个name和value
在这里插入图片描述
6.而这个name和value也就是我们请求包中对应的名字和值
在这里插入图片描述
7.所以分析出,sb.toString的值就是:phone=13333333333&password=5c2687a62a342e51e4a45ed62aaa714c
8.最后再定位到sign()这个函数的实现方法:
在这里插入图片描述
9.通过分析实现方法可以直接构造出python代码

from hashlib import md5

# 网上找一段md5加密的代码
def encrypt_md5(s):
    # 创建md5对象
    new_md5 = md5()
    # 这里必须用encode()函数对字符串进行编码,不然会报 TypeError: Unicode-objects must be encoded before hashing
    new_md5.update(s.encode(encoding='utf-8'))
    # 加密
    return new_md5.hexdigest()
# 定义sign所需要的值
token = ""  # 在包中可以看到token的值为空
reqTime = "1661661320955"  # 这里是时间戳,可以用代码自己生成,我这里图方便直接赋值
noncestr = "123456"  # 这里noncestr的值是代码中定义好的
noncestr_2 = noncestr[:2]  # 实现切片substring(2)
str = "phone=13333333333&password=5c2687a62a342e51e4a45ed62aaa714c"
def sign():
    res = f"{token}{reqTime}{noncestr_2}{str}"  # 这里的f类似于.formate
    return res
print(encrypt_md5(f"{sign()}"))

最终的代码

import requests
from hashlib import md5
phone="13333333333"
pwd="123456"
#逆向算法实现部分:
# 网上找一段md5加密的代码
def encrypt_md5(s):
    # 创建md5对象
    new_md5 = md5()
    # 这里必须用encode()函数对字符串进行编码,不然会报 TypeError: Unicode-objects must be encoded before hashing
    new_md5.update(s.encode(encoding='utf-8'))
    # 加密
    return new_md5.hexdigest()
# 定义sign所需要的值
token = ""  # 在包中可以看到token的值为空
reqTime = "1661669606606"  # 这里是时间戳,可以用代码自己生成,我这里图方便直接赋值
noncestr = "123456"  # 这里noncestr的值是代码中定义好的
noncestr_2 = noncestr[2:]  # 实现切片substring(2)
str = "phone=13333333333&password={pwd}".format(pwd=encrypt_md5(pwd))
def sign():
    res = f"{token}{reqTime}{noncestr_2}{str}"  # 这里的f类似于.formate
    return res
#爬虫部分:
url="http://chinayltx.com/app/api/v1/partnerLogin/login"
md5_pwd=encrypt_md5(pwd)
sign=encrypt_md5(f"{sign()}")
headers={
    "X-App": "native",
    "X-Noncestr": "123456",
    "X-Os": "partnerApp_android",
    "X-Req-Time": "1661669606606",
    "X-Sign": f"{sign}",
    "Content-Type": "application/x-www-form-urlencoded"

}
data={
    "phone":f"{phone}",
    "password":md5_pwd
}
res=requests.post(url,headers=headers,data=data)
print(res.text)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

向阳-Y.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值