APK的 Manifest 组件信息反查样本查询
接口说明
对 APK 样本提取出 Manifest 文件,解析其中的一些组件信息, 并入库存储,接口提供基于组件信息 的反查样本文件 APK 的功能。
推荐应用场景
样本聚合
请求地址
https://api.f.360.cn/files/apk/v1/mf_component
请求方法
POST
请求参数
| 参数名 | 类型 | 位置 | 是否必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| mf_activity_count | number | body | 是 | 22 | Manifest 文件中包含的activity数量 |
| mf_app_name | string | body | 是 | im.pbunumiypf.messenger.ApplicationLoader | Manifest 文件中app name |
| mf_metadata_count | number | body | 否 | 2 | Manifest 文件中包含的metadata数量 |
| mf_permission_count | number | body | 否 | 67 | Manifest 文件中包含的权限数量 |
| mf_provider_count | number | body | 否 | 5 | Manifest 文件中包含的provider数量 |
| mf_receiver_count | number | body | 否 | 4 | Manifest 文件中包含的receiver数量 |
| mf_service_count | number | body | 否 | 30 | Manifest 文件中包含的service数量 |
| page | number | body | 否 | 1 | 页码 |
| page_size | number | body | 否 | 10 | 页大小 |
响应参数
| 名称 | 类型 | 示例值 | 描述 |
|---|---|---|---|
| cert_md5 | string | 10 | APK 文件证书 MD5 |
| cert_name | string | 10.33 | APK 文件证书名 |
| md5 | string | 99c351858eb1fe1ddae8d3ac569d429f | APK 文件 MD5 |
| mfsha1 | string | APK 文件mfsha1 | |
| name | string | APK 应用名 | |
| uid | string | APK 包名 | |
| version | string | APK 版本 | |
| version_code | number | APK 包名 |
请求示例
支持cUrl、Python、Java、PHP、Go语言的请求,示例如下
#!/usr/bin/env bash
set -euo pipefail
APPID="" # apikey
SECRET="" # salt
URL="https://api.f.360.cn/files/apk/v1/mf_component"
BODY='{"mf_permission_count":67,"mf_activity_count":22,"mf_service_count":30,"mf_app_name":"im.pbunumiypf.messenger.ApplicationLoader","mf_provider_count":5}'
NONCE=$(printf '%08d' $((RANDOM % 100000000)))
TIMESTAMP=$(date +%s)
BODY_MD5=$(printf '%s' "$BODY" | openssl dgst -md5 -hex | awk '{print $NF}')
SIGNATURE=$(printf '%s' "${BODY_MD5}${APPID}${NONCE}${TIMESTAMP}${SECRET}" | openssl dgst -md5 -hex | awk '{print $NF}')
SIGNATURE=${SIGNATURE:16}
curl --location --request POST "$URL" \
--header "Content-Type: application/json" \
--header "X-360-Key: ${APPID}" \
--header "X-360-Nonce: ${NONCE}" \
--header "X-360-Timestamp: ${TIMESTAMP}" \
--header "X-360-Signature: ${SIGNATURE}" \
--data "${BODY}"# python3.6.8
import hashlib
import json
import random
import time
import requests
APPID = "" # apikey
SECRET = "" # salt
def make_headers(appid, secret, body):
headers = {}
headers["X-360-Key"] = appid
headers["X-360-Nonce"] = str(random.randint(0, 99999999)).zfill(8)
headers["X-360-Timestamp"] = str(int(time.time()))
s = (
hashlib.md5(body.encode("utf8")).hexdigest()
+ headers["X-360-Key"]
+ headers["X-360-Nonce"]
+ headers["X-360-Timestamp"]
+ secret
)
md5 = hashlib.md5(s.encode("utf8")).hexdigest()
headers["X-360-Signature"] = md5[16:]
headers["Content-Type"] = "application/json"
return headers
def do_post(url, body):
res = requests.post(
url,
data=json.dumps(params),
headers=make_headers(APPID, SECRET, json.dumps(body)),
)
print(res.text)
if __name__ == "__main__":
# 请求地址
url = "https://api.f.360.cn/files/apk/v1/mf_component"
# 查询参数
params = {
"mf_permission_count": 67,
"mf_activity_count": 22,
"mf_service_count": 30,
"mf_app_name": "im.pbunumiypf.messenger.ApplicationLoader",
"mf_provider_count": 5,
}
do_post(url, params)import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.concurrent.ThreadLocalRandom;
public class Demo {
static String md5(String input) throws Exception {
byte[] digest = MessageDigest.getInstance("MD5")
.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b & 0xff));
}
return sb.toString();
}
public static void main(String[] args) throws Exception {
String appid = ""; // apikey
String secret = ""; // salt
String url = "https://api.f.360.cn/files/apk/v1/mf_component";
String body = "{\"mf_permission_count\":67,\"mf_activity_count\":22,\"mf_service_count\":30,\"mf_app_name\":\"im.pbunumiypf.messenger.ApplicationLoader\",\"mf_provider_count\":5}";
String nonce = String.format("%08d", ThreadLocalRandom.current().nextInt(100000000));
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
String signature = md5(md5(body) + appid + nonce + timestamp + secret).substring(16);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.header("X-360-Key", appid)
.header("X-360-Nonce", nonce)
.header("X-360-Timestamp", timestamp)
.header("X-360-Signature", signature)
.POST(HttpRequest.BodyPublishers.ofString(body, StandardCharsets.UTF_8))
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(
request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
System.out.println(response.body());
}
}<?php
// apikey
$appid = "";
// salt
$secret = "";
$url = 'https://api.f.360.cn/files/apk/v1/mf_component';
$body = json_encode([
'mf_permission_count' => 67,
'mf_activity_count' => 22,
'mf_service_count' => 30,
'mf_app_name' => 'im.pbunumiypf.messenger.ApplicationLoader',
'mf_provider_count' => 5,
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$nonce = str_pad((string) random_int(0, 99999999), 8, "0", STR_PAD_LEFT);
$timestamp = (string) time();
$signature = substr(md5(md5($body) . $appid . $nonce . $timestamp . $secret), 16);
$ch = curl_init($url);
$options = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-360-Key: {$appid}",
"X-360-Nonce: {$nonce}",
"X-360-Timestamp: {$timestamp}",
"X-360-Signature: {$signature}",
],
];
$options[CURLOPT_POST] = true;
$options[CURLOPT_POSTFIELDS] = $body;
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
if ($response === false) {
echo curl_error($ch), PHP_EOL;
} else {
echo $response, PHP_EOL;
}
curl_close($ch);package main
import (
"bytes"
"crypto/md5"
"encoding/hex"
"fmt"
"io"
"math/rand"
"net/http"
"time"
)
func md5Hex(s string) string {
sum := md5.Sum([]byte(s))
return hex.EncodeToString(sum[:])
}
func main() {
appid := "" // apikey
secret := "" // salt
url := "https://api.f.360.cn/files/apk/v1/mf_component"
body := []byte(`{"mf_permission_count":67,"mf_activity_count":22,"mf_service_count":30,"mf_app_name":"im.pbunumiypf.messenger.ApplicationLoader","mf_provider_count":5}`)
nonce := fmt.Sprintf("%08d", rand.Intn(100000000))
timestamp := fmt.Sprintf("%d", time.Now().Unix())
signature := md5Hex(md5Hex(string(body)) + appid + nonce + timestamp + secret)[16:]
req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(body))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-360-Key", appid)
req.Header.Set("X-360-Nonce", nonce)
req.Header.Set("X-360-Timestamp", timestamp)
req.Header.Set("X-360-Signature", signature)
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
respBody, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(respBody))
}响应示例
业务正常响应
{
"code": "0",
"reason": "",
"message": "",
"data": {
"info": [
{
"cert_md5": "21cad34de8cdb49dd51afc912908c817",
"cert_name": "CN=gpGQWevmMbNhFB, OU=aioGnGwBPODhvCjqGnfd, O=xnWqpeSoKmXAFTEhQvqE, L=peGfRCzqDyLHdoBGV, ST=tPfNOBdBTLmswp, C=fOYboYtBejeq",
"createtime": "2025-12-03 20:50:44",
"md5": "87885176d5b31ea4872028a347ce2c72",
"mfsha1": "",
"name": "ψलग",
"spread_cnt": 0,
"uid": "a9a7833102b0b.ae05157894c5c.a88164c65399f",
"updatetime": "2025-12-03 20:50:51",
"version": "1.0.0",
"version_code": 172
},
{
"cert_md5": "62d27ebe77530f41d358888e131f9e49",
"cert_name": "CN=muWvmBdnHZ, OU=nWTOBXYnnQMLyzgD, O=TSUTQOUtSSDIj, L=tNnXdYTuSt, ST=lvMHBdcJAVb, C=WjsgGqwipjUgzrDkC",
"createtime": "2025-12-03 20:46:57",
"md5": "c580fa5b9a6910d8f498bd818d4e7dcf",
"mfsha1": "",
"name": "ψलग",
"spread_cnt": 0,
"uid": "a9a7833102b0b.ae05157894c5c.a88164c65399f",
"updatetime": "2025-12-03 20:47:01",
"version": "1.0.0",
"version_code": 172
},
{
"cert_md5": "ae9bc4adc8e595184655227eb6dbb128",
"cert_name": "CN=KcilqsGthXV, OU=NkmsbZUquiRCxiOQCIRz, O=YZrcApaldgzSeBoaE, L=unqpHcmDlCYDqxrQU, ST=DfqFnylCuSztYVvx, C=wRtYegUsDLOjXYOa",
"createtime": "2025-12-03 20:39:49",
"md5": "a1f3fbdaca75860ef8a1bc5f00e4ed4e",
"mfsha1": "",
"name": "ψलग",
"spread_cnt": 0,
"uid": "a9a7833102b0b.ae05157894c5c.a88164c65399f",
"updatetime": "2025-12-03 20:39:56",
"version": "1.0.0",
"version_code": 172
},
{
"cert_md5": "225ed440982f0eaaa41e6aaddc649942",
"cert_name": "CN=SmDfYaGzbVae, OU=jjIYqJBXHpIjC, O=dwUzslLzzdLoqoUdXHT, L=WczMFwMvSMlVehzRs, ST=EgdaWeEKVvvxltdfX, C=jEXccwoAtKsKxNutb",
"createtime": "2025-12-03 20:30:55",
"md5": "85ee02a0b5d2d553f1e1a24e49e5c414",
"mfsha1": "",
"name": "ψलग",
"spread_cnt": 0,
"uid": "a9a7833102b0b.ae05157894c5c.a88164c65399f",
"updatetime": "2025-12-03 20:31:01",
"version": "1.0.0",
"version_code": 172
},
{
"cert_md5": "439c9690955d963745684a22a94413b2",
"cert_name": "CN=yULWpgnERYARHX, OU=YrNqVoKwUXreI, O=nfKJSczGahhayOj, L=wukUvKyERRxsbFHAi, ST=GFlfWIHIQMdoSDo, C=rKrkpxuABxSfaDHq",
"createtime": "2025-12-03 20:30:20",
"md5": "0e7ec3e27c50f3a4bd8d948b45a8da89",
"mfsha1": "",
"name": "ψलग",
"spread_cnt": 0,
"uid": "a9a7833102b0b.ae05157894c5c.a88164c65399f",
"updatetime": "2025-12-03 20:30:25",
"version": "1.0.0",
"version_code": 172
},
{
"cert_md5": "eada45db450e00f92bdabe53e0655345",
"cert_name": "CN=dtGaQQdTPhExXYx, OU=nQuCxKuJojclvhywIrf, O=falemJbAOwqGnwGPhxqJ, L=htbmdDNUQCnQgD, ST=ZRJehRtSuE, C=kkVeRJSZCJm",
"createtime": "2025-12-03 20:28:04",
"md5": "96b7180951f9b86ec55919852c6dd5d9",
"mfsha1": "",
"name": "ψलग",
"spread_cnt": 0,
"uid": "a653ae9c748d5.a2146c04bf85e.acbb67398c904",
"updatetime": "2025-12-03 20:28:10",
"version": "1.0.0",
"version_code": 172
},
{
"cert_md5": "a96ff158dd0f991907e638adca8bb660",
"cert_name": "CN=aFsFBthgAP, OU=bNMuZlwQgPRp, O=vEgeWNuuwBbc, L=BpxCBlUuRxeCvB, ST=lCPheEbbczWJHJy, C=NUJIdeAtFNhW",
"createtime": "2025-12-03 20:24:43",
"md5": "e790899627d1aa8140fb7d8a5b7d6c5a",
"mfsha1": "",
"name": "ψलग",
"spread_cnt": 0,
"uid": "a653ae9c748d5.a2146c04bf85e.acbb67398c904",
"updatetime": "2025-12-03 20:24:51",
"version": "1.0.0",
"version_code": 172
},
{
"cert_md5": "15b2f38ae7f3e09e65160c0415ef7973",
"cert_name": "CN=UpKCtpYRYZOonq, OU=CHYEHENcHAnf, O=LCeCumvsrUJBdltZ, L=anLhTvCnFKUCXWPLlP, ST=vYwASXcRyRvNoE, C=pmpHxQtgpd",
"createtime": "2025-12-03 20:16:48",
"md5": "c001404a74ae73559d346402aff88a83",
"mfsha1": "",
"name": "ψलग",
"spread_cnt": 0,
"uid": "a653ae9c748d5.a2146c04bf85e.acbb67398c904",
"updatetime": "2025-12-03 20:16:51",
"version": "1.0.0",
"version_code": 172
},
{
"cert_md5": "894c19a507719830c48b4f621d7fb57f",
"cert_name": "CN=lDvWerqinhMu, OU=bpxUAAPqfTTaJZNG, O=DSsGFpbKbGNHSsyB, L=oHVVnJVhobGjqrUEiAMm, ST=rAEeHHTYHhEAqOYBec, C=fSuUPMStnGCGIdBgY",
"createtime": "2025-12-03 20:00:24",
"md5": "6f45c43b772389caef260da70c99789e",
"mfsha1": "",
"name": "ψलग",
"spread_cnt": 0,
"uid": "a653ae9c748d5.a2146c04bf85e.acbb67398c904",
"updatetime": "2025-12-03 20:04:12",
"version": "1.0.0",
"version_code": 172
},
{
"cert_md5": "1fa79fa83c93c2d97cddc75005cee6d4",
"cert_name": "CN=JaGuSWZtbiIBaFJhd, OU=JXEHRzHKfwacYpznW, O=MUEhzucsvjNgL, L=YjDxyqvtjqT, ST=KUcRIOYbVScrPsJ, C=LyVyIxtTUDwiyAW",
"createtime": "2025-12-03 19:33:42",
"md5": "a8e421f8cb11dfcc29593ab3e1dfffae",
"mfsha1": "",
"name": "ψलग",
"spread_cnt": 0,
"uid": "a140694482e64.a92457268a00a.a071b9d171cee",
"updatetime": "2025-12-03 19:36:00",
"version": "1.0.0",
"version_code": 172
}
],
"total": 3650
}
}业务异常响应
{
"code": "AC00500",
"reason": "BAD_REQUEST",
"message": "empty params",
"data": null
}