[原创]入门级,无壳app登录算法还原并实现发包
2023-7-3 18:19:28 Author: bbs.pediy.com(查看原文) 阅读量:6 收藏

如题本文主要讲某app登录算法还原并实现发包的全过程,此app非常适合小白入门时拿来练手,
一个无壳无混淆的app,软件链接我会放在文章最下面,建议先看一下文章后,再去下载上手。

首先将apk拖入jadx进行关键字LoginActivity搜索,然后进行分析得到下图代码,
是手机号加密码的发包位置,其中可见手机号和密码都被传入了login,跟踪进去后,可见的相关代码如下图。
这里login又调用的私有方法doLogin,将手机号和密码传给了UserService里面,我们进行追踪,得到如下图代码。

这里可以看到了密码登录参数,手机号和密码被传入了这里,密码被传进了getMD5后,加密后存入了params又传入了getRSAParams,然后传入request,先继续追踪getMD5,

是一个普通的MD5,用python进行一下复现,代码如下。

传入之前的密码,python复现的MD5结果相同,传入getRSAParams后成了后面的三项,data sign 和 timestamp,然后这些数据和charles抓包得到的login数据相同。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

import requests

import json

import time

import hashlib

from Crypto.Hash import SHA

from Crypto.Signature import pkcs1_15

from Crypto.PublicKey import RSA

import base64

pey = 'MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMNGABIfN+iron2hbwB7mLK1Dm05V1qLZBILTDj7dypr+GJzQ9fk0V7gIIchpFG7pDQEXMbb2nj8VkNAIIDBaw7UY1h9n+sCBT+Xzz6BB2UxLBBMQVwOwv55tJkZ2YBcHFQDGz51HjxAonKJdHwGpjIp7bwdx375gybn2ic4qNuFAgMBAAECgYEAmcha7eqgASCKCx5DaMHtc2+bOPFblfcIjB1Rnd6L7mCxb/cOisutB2bCtykLW0LHAiAdYI5r87Ply3iJIF0yjU35I8aieDVmeaQXXQfpisimXLOmz6p4VlBzAkz493oXPEH81cHqbwnFkiFE3VVtHbCNoZqXlFWthIdae2kpjlECQQDyCMl09eyDBNGuzg1r4tAQ4CeZe7aCkEFwK2at76Raqz9NKrynBiZHsKLU3JedRm2eZ7JimUhsuKbbkS/mcxBrAkEAzop7/PyddSXGDFDECyuXtuEKyzzUvdGiyNmOexhSwTmTZ7QdQqe5p382yCQcY8RXxZ6W9CLjuukfa9I6Tcz/zwJAQbjpG318D8fLOHBzbIxWe36iwia51JJfcpoWc7zTIFvIAKhOOfyNgIISdULBWM+7DHyUD/oXlI4/oPe3zhgIqQJAQd3gFJnrDQTy19KZ8oYAaA30h0PrBG3qX+shiRgErCJUY+oIus0KY+Qp8EGz3A0tgJRGx6you17E6nmspksN+QJBAKhaBGeHqs0+Z5wtFcunuqc6hV7WlhBYCe5YSxBNSiaohXDr6nQwjiOY22Q3m8aInp9KS+lDwW0o4C58VARKyo8='

url = 'https://api.langshiyu.com/user/v2/account/login'

def md5(pwd_str):

    md5_obj = hashlib.md5()

    md5_obj.update(pwd_str.encode('utf-8'))

    return md5_obj.hexdigest()

def times():

    return str(int(time.time()))

def sign(content, private_key):

    private_key_value = base64.b64decode(private_key)

    key = RSA.import_key(private_key_value)

    hash_value = SHA.new(content.encode('utf-8'))

    k = 1024

    em_len = k // 4

    h_len = 20

    t_len = 3

    s_len = em_len - h_len - t_len - 1

    signature_value = pkcs1_15.new(key).sign(hash_value)[:s_len]

    return base64.b64encode(signature_value).decode()

def login(mobile, param):

    params = {

        "password": md5(param),

        "os": "android",

        "mobile": mobile,

        "version": "2.2.3",

    }

    return params

def jiaparams(params):

    params_json = json.dumps(params,separators=(',', ':'))

    print("json转成功:",params_json)

    data = base64.b64encode(params_json.encode('utf-8')).decode('utf-8')

    print("data成功:",data)

    signstr = f"data={data}&timestamp={times()}"

    print("时间戳:",times())

    print("拼接成功",signstr)

    signss = sign(signstr, pey)

    print("sign成功",signss)

    result = {}

    result['data'] = data

    result['sign'] = signss

    result['timestamp'] = times()

    return result

mobile = input("请输入16位手机号:")

parem = input("请输入密码:")

params = login(mobile,parem)

paramss = jiaparams(params)

print("发包内容:",paramss)

fb= requests.post(url, paramss)

print("结果:",fb.text)bjsdm

有部分简单的代码实现,以及开头通过objection的SSL屏蔽后charles进行抓包进行找的关键点,都没有在文章里面写,不过这些都是不必要的,所以文章是有一小部分省略。
整体对小白非常友好的软件,难度不算很高,只要花时间就可以掌握关键点,进行复现。
app放在有道云文章里面,想尝试一下的小白可以进去拿一下。
算法还原过程有道云文章链接:https://note.youdao.com/s/Yf9jGzqk


文章来源: https://bbs.pediy.com/thread-277869.htm
如有侵权请联系:admin#unsafe.sh