接上节课内容
安卓逆向 -- 抓包环境设置(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