Initial commit

This commit is contained in:
ZKWolf 2023-05-29 01:17:39 +02:00
commit 4420cfc5ae
6 changed files with 148 additions and 0 deletions

31
ReadMe.md Normal file
View File

@ -0,0 +1,31 @@
# DeathGarden Bloodharvest API Rebirth Project
This project is MORE than just a WIP!
The goal of this project is to revive the Deathgarden backend and servers.
If you have any old HTTP captures of the traffic between the game and server, please submit them here!
I am currently reverse-engineering the files to find all the API endpoints and requests.
Current knowledge
## Current knowledge
The game uses Unreal Engine 4.21.0.
The anticheat is Battleye.
The backend and server can be changed with start parameters.
The in-game console can be re-enabled.
The in-game SET command is available.
The "Status" API is Stashboard. Stashboard has been discontinued in 2019 but is only an HTTP POST, so I will recreate it.
The game server is the Amazon Gamelift SDK.
The steamAPI.dll cannot be spoofed because Battle Eye checks the signature.
If you have any information, suggestions, etc., please create an issue.

2
src/example_respons.txt Normal file
View File

@ -0,0 +1,2 @@
192.168.1.130 - - [29/May/2023 00:54:12] "GET /api/v1/services/tex HTTP/1.1" 200 -
192.168.1.130 - - [29/May/2023 00:54:15] "GET /api/v1/auth/provider/steam/login?token=140000000FA86E1A2XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX3C66B7F0105000000BE0000003E0000000400000025BE174801001001B0790800468CD0C20401A8C0000000002D217164ADD08C640100BB510600020042510D00000096F70D000000000082F2EC01606791C71459EC796782814A75EE134FB2308221505DXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX44CA2AF888A449BAD8B1AFCE22D8DE3BC4B5B5B7306A6EC2BD2A334B82DB5FD5267C9462F73097DEB084C169345464AFA10D3C49C453A4 HTTP/1.1" 200 -

BIN
src/image/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

5
src/logic/handler.py Normal file
View File

@ -0,0 +1,5 @@
def post_handler(data):
print("Post respond:")
print(data)
print("END OF RESPOND")

93
src/start_app.py Normal file
View File

@ -0,0 +1,93 @@
from flask import Flask, send_from_directory, request, jsonify
from threading import Thread
from logic.handler import post_handler
import os
app = Flask(__name__)
@app.route('/favicon.ico')
def favicon():
return send_from_directory(os.path.join(app.root_path, 'image'), 'favicon.ico', mimetype='image/vnd.microsoft.icon')
@app.route("/")
def hello_world():
return "<p>Development Server for Death Garden API!</p>"
@app.route("/api/v1/services/tex")
def one():
print("Responded to tex api call GET")
return jsonify({"status": "success", "online": "true", "Version": "te-18f25613-36778-ue4-374f864b",
"ProjectID": "F72FA5E64FA43E878DC72896AD677FB5",
"DefaultFactoryName": "HttpNetworkReplayStreaming", "ServeMatchDelayInMin": "30.0f"})
@app.route("/metrics/client/event", methods=["POST"])
def receive_event():
print("Responded to Metrics api call POST")
data = request.get_json()
post_handler(data)
return jsonify({"status": "success"})
@app.route("/api/v1/healthcheck", methods=["GET"])
def healthcheck():
return jsonify({"status": "success", "online": "true"})
@app.route("/metrics/httplog/event", methods=["POST"])
def receive_event2():
print("Responded to httplog api call POST")
data = request.get_json()
post_handler(data)
return jsonify({"status": "success"})
@app.route("/api/v1/gameDataAnalytics", methods=["POST"])
def analytics_post():
print("Responded to analytics api call POST")
data = request.get_json()
post_handler(data)
return jsonify({"status": "success"})
@app.route("/api/v1/gameDataAnalytics/batch", methods=["POST"])
def analytics_batch_post():
print("Responded to analytics batch api call POST")
data = request.get_json()
post_handler(data)
return jsonify({"status": "success"})
# [Backend]
@app.route("/tex", methods=["GET"])
def tex_get():
return jsonify({"status": "success"})
@app.route("/api/v1/auth/provider/steam/login", methods=["GET"])
def steam_login():
# here we want to get the value of user (i.e. ?user=some-value)
steam_token = request.args.get('token')
print(steam_token)
# return jsonify({"clientData":{"catalogId": "3.6.0_281460live", "consentId": "3.6.0_281460live"}})
return jsonify({"clientData": "3.0.1"})
def run():
app.run(host='0.0.0.0', port=8080)
def keep_alive():
t = Thread(target=run)
t.start()
try:
keep_alive()
except KeyboardInterrupt:
print("Exiting...")
exit(0)

17
src/start_parms.txt Normal file
View File

@ -0,0 +1,17 @@
Start Parameters
BackendUrl=
MirrorsApi=
FileServiceApi=
GameNewsApi=
MetricApi=
TModerationnApi=
MetricApi=
PollSystemApi=
StashboarApi=
RepllayApi=
TAuthenticationApi=
-ServiceApi=
-UseDatastorePlatform=
-UseMatchmakingPlatform=
-UseMirrors=