前沿
當(dāng)你爬取某app的數(shù)據(jù),發(fā)現(xiàn)所有接口中都有一個(gè)動(dòng)態(tài)改變的參數(shù),那么這個(gè)參數(shù)應(yīng)該就是簽名參數(shù),一般都是通過(guò)一些算法組裝生成的
1 連接越獄設(shè)備
frida-ps -Ua
屏幕快照 2019-04-20 下午3.03.51.png
2 找到目標(biāo)進(jìn)程
com.Xtone.ExpressionKingdom
3 IDA找到目標(biāo)函數(shù)
3.1 追蹤trace
frida-trace -U 9124 -m "+[NSURL URLWithString:]"
3.2 通過(guò)IDA找到目標(biāo)函數(shù),進(jìn)行追蹤
frida-trace -U 9124 -m "-[XTBaseRequest getWithURLString:parameters:success:failure:]"
frida-trace -U 9124 -m "-[XTBaseRequest addMustParamsToParams:]"
注意:
追蹤多個(gè)函數(shù)的寫法
frida-trace -U 9124 -m "+[NSURL URLWithString:]" -m "-[XTBaseRequest getWithURLString:parameters:success:failure:]"
執(zhí)行完命令,會(huì)在根目錄生成一個(gè)文件名為handlers 的文件
屏幕快照 2019-04-20 下午3.13.11.png
對(duì)應(yīng)的js文件,可以修改參數(shù),打印log
再次終端執(zhí)行追蹤
WechatIMG417.jpeg
目前已經(jīng)追蹤到關(guān)鍵函數(shù),回到IDA找到對(duì)應(yīng)函數(shù)的匯編代碼,進(jìn)行分析
WechatIMG414.jpeg
匯編分析
WechatIMG417.jpeg
sign算法還原:
python版
# coding=utf-8
import time
import hashlib
class testMd5():
timestamp = int(round(time.time() * 1000))
print('當(dāng)前時(shí)間戳 :' + timestamp)
# 待加密信息
str = 'bqmsapiv2' + str(timestamp)
# 創(chuàng)建md5對(duì)象
hl = hashlib.md5()
# 此處必須聲明encode
# 若寫法為hl.update(str) 報(bào)錯(cuò)為: Unicode-objects must be encoded before hashing
hl.update(str.encode(encoding='utf-8'))
print('MD5加密前為 :' + str)
OC版
- (NSString *)getSignCode{
//加鹽
NSString *str = @"bqmsapiv2";
//獲取當(dāng)前時(shí)間戳
NSString *timeStamp = [self currentTimeStr];
NSLog(@"timeStamp:%@",timeStamp);
//拼接
NSString *resultStr = [NSString stringWithFormat:@"%@%@",str,timeStamp];
//md5
NSString *md5Str = [self md5WithString:resultStr];
//lower
NSString *signStr = [md5Str lowercaseString];
return signStr;
}
//獲取當(dāng)前時(shí)間戳
- (NSString *)currentTimeStr{
NSDate* date = [NSDate dateWithTimeIntervalSinceNow:0];//獲取當(dāng)前時(shí)間0秒后的時(shí)間
NSTimeInterval time=[date timeIntervalSince1970]*1000;// *1000 是精確到毫秒,不乘就是精確到秒
NSString *timeString = [NSString stringWithFormat:@"%.0f", time];
return timeString;
}
- (NSString *) md5WithString:(NSString *) str{
const char *cStr = [str UTF8String];
// 設(shè)置字符加密后存儲(chǔ)的空間
unsigned char digest[CC_MD5_DIGEST_LENGTH];
// 參數(shù)三:編碼的加密機(jī)制
CC_MD5(cStr, (UInt32)strlen(cStr), digest);
NSMutableString *result = [[NSMutableString alloc] initWithCapacity:16];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i ++) {
[result appendFormat:@"%02x",digest[i]];
}
return result;
}