抓包分析PP助手IOS版,获取历史版本下载列表

原文发于本人小笔记 http://leanote.bitcode.tk:251/blog/post/sma11case/%E9%80%86%E5%90%91PP%E5%8A%A9%E6%89%8BIOS%E7%89%88%EF%BC%8C%E8%8E%B7%E5%8F%96%E5%8E%86%E5%8F%B2%E7%89%88%E6%9C%AC%E4%B8%8B%E8%BD%BD%E5%88%97%E8%A1%A8 此处做个备份,转载请保留此段文字,原文有结果结构解析详细方法以及已编译好的命令行版本下载。

抓包分析PP助手IOS版,获取历史版本下载列表


PP助手IOS版可以安装APP的历史版本,而Mac版没这功能,今天闲着无事抓包分析了对应接口。

抓包过程略过不表,由于此APP构造自定义数据结构进行通讯,因此需要分析数据构造,然后组装数据进行接口调用。

历史版本接口需要APPID,因此先通过Mac版抓包获取APP信息的接口(接口已写成脚本,方便调用)。

#!/bin/sh

JBCHANNEL='4262469664'
StoreChannel='4262469686'

type="$1"
KEYWORD="$2"

if [ '' = "${KEYWORD}" ]; then
    echo "usage: ipasearch.sh <store|jb> <keyword>"
    exit 0
fi

POST1='-d{"dcType":0, "keyword":"'
POST2='", "clFlag":1, "perCount":15, "page":0}'
POST="${POST1}${KEYWORD}${POST2}"

CHANNEL="${JBCHANNEL}"
if [ 'store' = "${CHANNEL}" ]; then
    CHANNEL="${StoreChannel}"
fi

curl -Lk 'http://jsondata.25pp.com/index.html' -H 'Content-Type: application/x-www-form-urlencoded' -H "Tunnel-Command: ${CHANNEL}" "${POST}"

exit 0

随便拿个APP开刀,比如微信,调用脚本 ppsearch.sh jb 微信(表示搜索越狱应用,关键字微信)得到如下信息,其中id便是APPID,获取历史版本需要用到。


    {
      "id": 620065,
      "itemId": 414478124,
      "price": 0,
      "package": 0,
      "buid": "com.tencent.xin",
      "version": "6.6.6",
      "downurl": "http://r11.25pp.com/soft/2018/04/02/20180402_24703_218980057839.ipa",
      "title": "微信",
      "fsize": "100.29MB",
      "dcType": 3,
      "thumb": "http://img.25pp.com/uploadfile/app/icon/20180402/1522646114148240_54x54.jpg",
      "desc": "微信是一款全方位的手机通讯应用,帮助你轻松连接全球好友。微信可以(通过SMS/MMS网络)发送短信、进行视频聊天、与好友一起玩游戏,以及分享自己的生活到朋友圈,让你感受耳目一新的移动生活方式。  为什",
      "stars": 60,
      "updatetime": 1523157809,
      "downloads": 301217387,
      "resType": 1
    }

贴上历史版本接口数据结构,其中unknow1应该是对应接口哪个功能,不用理会,直接填充为固定的即可,device_token填充为40长度的随机16进制字符串,plat_name为对应手机平台字符串,可通过uname()函数获得,一般写死即可,pkgId便是上面提到的APPID。

struct __attribute__ ((packed)) QueryInfo {
    char unknow1[0x10-1];    // 4b 00 00 00 14 00 e0 fd 01 7a 00 00 00 00 00
    char device_token[40+1]; // device token, length=40
    char plat_name[9+1];     // iPhone7,2
    char unknow2[5];         // 00 02 00 09 00
    int32_t pkgId;           // 21 76 09 00 ==> 620065
};
typedef struct QueryInfo QueryInfo;

调用实例(语言OC,仅贴关键代码,细节部分自行填充)

static NSString *const kQueryAppInfoUrl = @"http://mobileup.25pp.com/index.php";

static const unsigned char unknow1[] = { 0x4b, 0x00, 0x00, 0x00, 0x14, 0x00, 0xe0, 0xfd, 0x01, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00 };
static const unsigned char unknow2[] = { 0x00, 0x02, 0x00, 0x09, 0x00 };

    QueryInfo info = {0};
    memcpy(info.unknow1, unknow1, sizeof(unknow1));
    memcpy(info.unknow2, unknow2, sizeof(unknow2));
    strcpy(info.device_token, [NSString randomStringWithKeys:HexLowerCaseKeys length:40].UTF8String);
    strcpy(info.plat_name, "iPhone7,2");
    info.pkgId = 620065;
    
    NSData *post = [NSData dataWithBytes:&info length:sizeof(info)];
    NSDictionary *header = @{
//                             @"Cookie":@"UM_distinctid=16179b283d11f2-01c14a4f3-4c1e3b41-3d10d-16179b283d222",
                             @"User-Agent":@"PPHelperNS/122 CFNetwork/758.0.2 Darwin/15.0.0",
                             };

post数据和header通过POST方式提交到http://mobileup.25pp.com/index.php即可获得返回,header经测试不设置也是可以的,但设置一下防止被发现的伪造的包~~~

接口调用后返回的数据也是Binary结构,通过以下函数简单粗暴的转换为字符串。


inline static NSMutableArray *sc_parseData(const char *ptr, size_t len)
{
    NSMutableArray *res = NewMutableArray();
    
    NSMutableData *temp = nil;
    
    for (long a= 0; a < len; ++a)
    {
        unsigned char x = ptr[a];
        
        if (0 == x)
        {
            temp = nil;
            continue;
        }
        
        if (nil == temp)
        {
            temp = NewClass(NSMutableData);
            [res addObject:temp];
        }
        
        [temp appendBytes:&x length:sizeof(x)];
        BreakPointHere;
    }
    
    BreakPointHere;
    return res;
}

inline static NSMutableArray *sc_parseString(const char *ptr, size_t len)
{
    NSMutableArray *res = sc_parseData(ptr, len);
    NSMutableArray *sss = NewMutableArray();
    [res enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        id obj1 = [obj toUTF8String];
        if (obj1) [sss addObject:obj1];
    }];
    
    BreakPointHere;
    return sss;
}

把返回结果的NSData扔进sc_parseString()函数即可获得所有可见字符串,过滤一下需要的信息即可,码字不易,尽可能直接说中心,好心的看官可以点个赞或打赏个咖啡钱~~~(不点不打也没所谓 _

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容