|
|
发表于
2024-11-18 19:40:21
|
显示全部楼层
来自 福建
本帖最后由 正己 于 2024-11-20 09:17 编辑
4.简单加解密协议实战
说一下这里服务端配置需要通过ipconfig获取到真实的ip地址替换,除此之外,还需要对教程demo里的dex进行修改,字符串搜搜192.,然后把对应接口的ip地址换成刚才获取到的ip地址
`服务端代码:`
- python
- import hashlib
- import json
- import base64
- import time
- from Crypto.Cipher import AES
- from Crypto.Util.Padding import pad
- from cryptography.hazmat.primitives import padding
- from flask import Flask, jsonify, request
-
- app = Flask(__name__)
-
-
- [b]加密函数 [/b]
- def aes_encrypt(data: str) -> str:
- key = b'1234567890abcdefwuaipojie0abcdef'
- iv = b'1234567wuaipojie' [b]Initialization Vector [/b]
- cipher = AES.new(key, AES.MODE_CBC, iv)
- encrypted_data = cipher.encrypt(pad(data.encode('utf-8'), AES.block_size))
- return base64.b64encode(encrypted_data).decode('utf-8')
-
- [b]解密函数 [/b]
- def aes_decrypt(encrypted_data: str) -> dict:
- key = b'1234567890abcdefwuaipojie0abcdef'
- iv = b'1234567wuaipojie' [b]Initialization Vector [/b]
- cipher = AES.new(key, AES.MODE_CBC, iv)
- encrypted_bytes = base64.b64decode(encrypted_data)
- decrypted_data = cipher.decrypt(encrypted_bytes)
- unpadder = padding.PKCS7(AES.block_size * 8).unpadder()
- decrypted_unpadded = unpadder.update(decrypted_data) + unpadder.finalize()
- decrypted_str = decrypted_unpadded.decode('utf-8')
- return json.loads(decrypted_str)
-
- [b]读取用户数据 [/b]
- with open('user_data.json', 'r') as file:
- user_data = json.load(file)
-
- [b]写入本地JSON文件 [/b]
- def write_json_file(file_path: str, data: dict):
- with open(file_path, 'w') as file:
- json.dump(data, file, indent=4)
-
- [b]生成签名函数 [/b]
- def generate_signature(user_id: str, coin: int, timestamp: int) -> str:
- message = f"{user_id}&{coin}&{timestamp}"
- hash_object = hashlib.md5(message.encode())
- return hash_object.hexdigest()
-
-
- @app.route('/get_coin', methods=['POST'])
- def get_coin():
- [b]获取加密的数据 [/b]
- encrypted_data = request.json.get('user_data')
- if not encrypted_data:
- return jsonify({"error": "数据有误!"}), 400
- try:
- [b]解密数据 [/b]
- decrypted_data = aes_decrypt(encrypted_data)
- [b]验证签名 [/b]
- timestamp = int(decrypted_data.get('timestamp'))
- current_time = int(time.time()*1000)
- print(timestamp)
- print(abs(current_time - timestamp))
- if abs(current_time - timestamp) > 5000:
- return jsonify({"error": "请求过期!"}), 400
- sign = decrypted_data.get('sign')
- [b]计算签名 [/b]
- expected_sign = generate_signature(decrypted_data["user_id"], 1, timestamp)
- if sign != expected_sign:
- return jsonify({"error": "签名验证失败!"}), 401
- [b]验证成功后,获取用户的金币数量 [/b]
- user_id = decrypted_data.get('user_id')
- if user_id in user_data['user_id']:
- user_data['coin_amount'] += 1 [b]增加金币数量 [/b]
- write_json_file('user_data.json', user_data) [b]写入文件 [/b]
- return jsonify({"投币成功,当前数量为:": user_data['coin_amount']})
- else:
- return jsonify({"error": "用户未找到!"}), 404
- except Exception as e:
- return jsonify({"error": f"处理请求时出错: {str(e)}"}), 500
-
- @app.route('/get_user_data', methods=['GET'])
- def get_user_data():
- [b]将数据转换成字符串形式以便于加密 [/b]
- data_str = json.dumps(user_data)
- return jsonify({"user_data": data_str})
-
- if __name__ == '__main__':
- app.run(host='192.168.73.82', port=5000)
复制代码
`协议实现:`
- python
- import json
- import base64
- import hashlib
- import time
-
- from Crypto.Cipher import AES
- from Crypto.Util.Padding import pad
- from datetime import datetime
- import requests
-
- [b]生成签名函数 [/b]
- def generate_signature(user_id: str, coin: int, timestamp: int) -> str:
- message = f"{user_id}&{coin}&{timestamp}"
- hash_object = hashlib.md5(message.encode())
- return hash_object.hexdigest()
-
- [b]加密函数 [/b]
- def aes_encrypt(data: str) -> str:
- key = b'1234567890abcdefwuaipojie0abcdef'
- iv = b'1234567wuaipojie' [b]Initialization Vector [/b]
- cipher = AES.new(key, AES.MODE_CBC, iv)
- encrypted_data = cipher.encrypt(pad(data.encode('utf-8'), AES.block_size))
- return base64.b64encode(encrypted_data).decode('utf-8')
-
- [b]模拟用户数据 [/b]
- user_data = {
- "user_id": "zj2595",
- "timestamp": int(time.time()*1000), [b]当前时间的时间戳 [/b]
- "sign": "", [b]这个稍后计算并赋值 [/b]
- }
-
- [b]计算签名 [/b]
- user_data["sign"] = generate_signature(user_data["user_id"], 1, user_data["timestamp"])
-
- [b]转换为JSON字符串 [/b]
- data_str = json.dumps(user_data)
-
- [b]加密数据 [/b]
- encrypted_data = aes_encrypt(data_str)
-
- [b]发送POST请求 [/b]
- try:
- response = requests.post(
- 'http://192.168.73.82:5000/get_coin',
- json={"user_data": encrypted_data},
-
- )
- if response.status_code == 200:
- print("投币成功")
- print("Response:", response.json())
- else:
- print(f"Request failed with status code: {response.status_code}")
- except requests.exceptions.RequestException as e:
- print(f"请求出现异常: {e}")
复制代码
四、请作者喝杯咖啡

六、视频及课件地址
百度云
阿里云
哔哩哔哩
教程开源地址
PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压
# 八、参考文档
[炒冷饭汇总抓包姿势-上](https://bbs.kanxue.com/thread-278142.htm)
[安卓 App 逆向课程之四 frida 注入 Okhttp 抓包中篇](https://cloud.tencent.com/developer/article/1663828) |
|