You've already forked JapariBypass
							
							Compare commits
	
		
			2 Commits
		
	
	
		
			debug
			...
			c77290fd51
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c77290fd51 | |||
| 1a6e96ee47 | 
							
								
								
									
										81
									
								
								dmmBypass.py
									
									
									
									
									
								
							
							
						
						
									
										81
									
								
								dmmBypass.py
									
									
									
									
									
								
							| @@ -1,22 +1,43 @@ | ||||
| import os | ||||
| import sys | ||||
| import wmi | ||||
| import json | ||||
| import hashlib | ||||
| import argparse | ||||
| import requests | ||||
| import dmmUpdater | ||||
| import subprocess | ||||
| import urllib.parse | ||||
| from uuid import getnode | ||||
|  | ||||
| parser = argparse.ArgumentParser(description='DMM bypass script') | ||||
| parser.add_argument('-g', '--game', type=str, help="DMM code name of the game", default="kfp2g") | ||||
| parser.add_argument('-u', '--update', help="Check for game update before launching", action='store_true') | ||||
| args = parser.parse_args() | ||||
|  | ||||
| config_name = args.game + '.cfg' | ||||
|  | ||||
| if not os.path.exists(config_name): | ||||
|     subprocess.check_call([sys.executable, "-m", "pip", "install", "beautifulsoup4", "PyPasser"]) | ||||
|     config = { | ||||
|         "game_id" : args.game, | ||||
|         "file_path" : input('Enter full file path to KF3 .exe: ').strip('\"'), | ||||
|         "dmm_login" : input('DMM Login (email): '), | ||||
|         "dmm_password" : input('DMM Password: '), | ||||
|         "use_proxy" : input('Your login tokens will be sent through my VPN machine.\nIs that okay? (yes/no): ').lower() == "yes" | ||||
|     } | ||||
|     with open(config_name, 'wt', encoding="utf-8") as f: | ||||
|         json.dump(config, f, indent=1, ensure_ascii=False) | ||||
| else: | ||||
|     with open(config_name, "rt", encoding="utf-8") as f: | ||||
|         config = json.load(f) | ||||
|     print(f'Loaded settings from {config_name}') | ||||
|  | ||||
| config["update_game"] = args.update | ||||
|  | ||||
| import wmi | ||||
| import dmmUpdater | ||||
| from bs4 import BeautifulSoup | ||||
| from pypasser import reCaptchaV3 | ||||
|  | ||||
| def print_request(url, data : str, headers, cookies_dict): | ||||
|     print("Sending to", url) | ||||
|     vars = {"headers":headers, "cookies":cookies_dict, "data":data} | ||||
|     print(json.dumps(vars, ensure_ascii=False, indent=1)) | ||||
|     pass | ||||
|  | ||||
| def get_hash(data): | ||||
|     sha_obj = hashlib.sha256() | ||||
|     sha_obj.update(str(data).encode()) | ||||
| @@ -27,16 +48,11 @@ def get_mac(): | ||||
|     mac = getnode() | ||||
|     return ':'.join(("%012X" % mac)[i:i+2] for i in range(0, 12, 2)).lower() | ||||
|  | ||||
| def get_motherboard(): | ||||
|     return wmi.WMI().Win32_BaseBoard()[0].SerialNumber | ||||
|  | ||||
| def retrieve_login_token(session : requests.Session): | ||||
|     try: | ||||
|         print("Retrieving login form") | ||||
|         url = "https://accounts.dmm.com/service/login/password" | ||||
|         print_request(url, "", dict(session.headers), session.cookies.get_dict()) | ||||
|         result = session.get(url) | ||||
|         print(result.status_code, result.text) | ||||
|         result.raise_for_status() | ||||
|         page = BeautifulSoup(result.content, 'html.parser') | ||||
|         token = page.find('input', attrs={"name":"token"}).get("value") | ||||
| @@ -57,9 +73,7 @@ def retrieve_auth_keys(login, password, token, captcha, session : requests.Sessi | ||||
|         url = "https://accounts.dmm.com/service/login/password/authenticate" | ||||
|         data = f"token={token}&login_id={login}&password={password}&prompt=&device=games-player&recaptchaToken={captcha}" | ||||
|         headers = {"Content-Type": "application/x-www-form-urlencoded"} | ||||
|         print_request(url, data, headers, session.cookies.get_dict()) | ||||
|         result = session.post(url, data, headers=headers) | ||||
|         print(result.status_code, result.text) | ||||
|         result.raise_for_status() | ||||
|         cookies = result.cookies.get_dict() | ||||
|         return cookies["login_secure_id"], cookies["login_session_id"] | ||||
| @@ -73,9 +87,7 @@ def retrieve_update_params(game_id, login_secure, login_session, use_proxy): | ||||
|         headers = {"User-Agent": "DMMGamePlayer5-Win/5.3.12 Electron/32.1.0", "Client-App": "DMMGamePlayer5", "Client-version": "5.3.12", "Content-Type": "application/json"} | ||||
|         cookies = {"login_secure_id":login_secure, "login_session_id":login_session} | ||||
|         url = "https://katworks.sytes.net/KF/Api/DMM/filelist" if use_proxy else "https://apidgp-gameplayer.games.dmm.com/v5/r2/filelist/cl" | ||||
|         print_request(url, data, headers, cookies) | ||||
|         result = requests.post(url, cookies=cookies, headers=headers, json=data) | ||||
|         print(result.status_code, result.text) | ||||
|         result.raise_for_status() | ||||
|         data = result.json()["data"] | ||||
|         game_version = data["latest_version"] | ||||
| @@ -94,36 +106,24 @@ def retrieve_launch_params(game_id, mac_addr, hdd_serial, motherboard, login_sec | ||||
|         headers = {"User-Agent": "DMMGamePlayer5-Win/5.3.12 Electron/32.1.0", "Client-App": "DMMGamePlayer5", "Client-version": "5.3.12", "Content-Type": "application/json"} | ||||
|         cookies = {"login_secure_id":login_secure, "login_session_id":login_session} | ||||
|         url = "https://katworks.sytes.net/KF/Api/DMM/launch" if use_proxy else "https://apidgp-gameplayer.games.dmm.com/v5/r2/launch/cl" | ||||
|         print_request(url, data, headers, cookies) | ||||
|         result = requests.post(url, cookies=cookies, headers=headers, json=data) | ||||
|         print(result.status_code, result.text) | ||||
|         result.raise_for_status() | ||||
|         data = result.json()["data"] | ||||
|         return data["execute_args"] | ||||
|     except Exception as e: | ||||
|         print("Failed to retrieve launch arguments:", e) | ||||
|  | ||||
| def main(args): | ||||
|     if len(args) != 7: | ||||
|         print("Usage:", | ||||
|               "\tpython dmmBypass.py game_id game_path email password update_game use_proxy", | ||||
|               "\t- game_id: DMM code name of the game", | ||||
|               "\t- game_path: full path to the game .exe. Wrap in \" if there are spaces in the path", | ||||
|               "\t- email, password: dmm credentials", | ||||
|               "\t- update_game: \"true\" to check for game update before launching", | ||||
|               "\t- use_proxy: \"true\" to send required request through Katboi VPN. Otherwise use your own VPN", | ||||
|               "\texample: python dmmBypass.py kfp2g \"D:\Games\KFP2G\けもフレ3.exe\" kat@email.com abc123 true", sep="\n") | ||||
|         return | ||||
|  | ||||
|     game_id = args[1] | ||||
|     exe_location = args[2] | ||||
|     login = urllib.parse.quote_plus(args[3]) | ||||
|     password = urllib.parse.quote_plus(args[4]) | ||||
|     update_game = args[5].lower() == "true" | ||||
|     use_proxy = args[6].lower() == "true" | ||||
| def main(config): | ||||
|     game_id = config["game_id"] | ||||
|     exe_location = config["file_path"] | ||||
|     login = urllib.parse.quote_plus(config["dmm_login"]) | ||||
|     password = urllib.parse.quote_plus(config["dmm_password"]) | ||||
|     update_game = config["update_game"] if "update_game" in config else False | ||||
|     use_proxy = config["use_proxy"] if "use_proxy" in config else False | ||||
|     mac_addr = get_mac() | ||||
|     hdd_serial = get_hash('') | ||||
|     motherboard =  get_hash(get_motherboard()) | ||||
|     #actual moterboard serial is unknown, but this works | ||||
|     motherboard =  get_hash(getnode()) | ||||
|  | ||||
|     with requests.Session() as session: | ||||
|         token = retrieve_login_token(session) | ||||
| @@ -154,7 +154,6 @@ def main(args): | ||||
|         args = [exe_location] + execute_args.split() | ||||
|         print(args) | ||||
|         subprocess.Popen(args, start_new_session=True)  | ||||
|         input("Done. Press enter to exit") | ||||
|         input("Done. Press enter to exit (this will close the game)") | ||||
|  | ||||
| args = sys.argv | ||||
| main(args) | ||||
| main(config) | ||||
| @@ -1,3 +0,0 @@ | ||||
| beautifulsoup4 | ||||
| PyPasser | ||||
| wmi | ||||
							
								
								
									
										34
									
								
								run_KF3.bat
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								run_KF3.bat
									
									
									
									
									
								
							| @@ -1,35 +1,3 @@ | ||||
| @echo off | ||||
| chcp 65001 | ||||
| setlocal enabledelayedexpansion | ||||
|  | ||||
| set file_name="kfp2g.cfg" | ||||
|  | ||||
| IF NOT EXIST %file_name% ( | ||||
| 	set /p null="Make sure python is installed. In next step, required packages will be installed. Press Enter to continue" | ||||
| 	pip install -r requirements.txt | ||||
| 	set /p file_path=Enter full file path to KF3 .exe: | ||||
| 	set /p dmm_login=DMM Login: | ||||
| 	set /p dmm_password=DMM Password: | ||||
| 	set /p confirm="Your login tokens will be sent through Katboi's VPN machine, is that ok? Personal VPN is required if not (yes/no):" | ||||
| 	if /i "!confirm!"=="yes" ( | ||||
| 		set use_proxy=true | ||||
| 	) else ( | ||||
| 		set use_proxy=false | ||||
| 	) | ||||
| 	echo !file_path!> %file_name% | ||||
| 	echo !dmm_login!>> %file_name% | ||||
| 	echo !dmm_password!>> %file_name% | ||||
| 	echo !use_proxy!>> %file_name% | ||||
| ) ELSE ( | ||||
|     	< %file_name% ( | ||||
| 		set /p file_path= | ||||
| 		set /p dmm_login= | ||||
| 		set /p dmm_password= | ||||
| 		set /p use_proxy= | ||||
| 	) | ||||
| 	echo Loaded settings from %file_name% | ||||
| ) | ||||
|  | ||||
| python dmmBypass.py kfp2g %file_path% %dmm_login% %dmm_password% false %use_proxy% | ||||
|  | ||||
| python dmmBypass.py -g kfp2g | ||||
| pause | ||||
| @@ -1,35 +1,3 @@ | ||||
| @echo off | ||||
| chcp 65001 | ||||
| setlocal enabledelayedexpansion | ||||
|  | ||||
| set file_name="kfp2g.cfg" | ||||
|  | ||||
| IF NOT EXIST %file_name% ( | ||||
| 	set /p null="Make sure python is installed. In next step, required packages will be installed. Press Enter to continue" | ||||
| 	pip install -r requirements.txt | ||||
| 	set /p file_path=Enter full file path to KF3 .exe: | ||||
| 	set /p dmm_login=DMM Login: | ||||
| 	set /p dmm_password=DMM Password: | ||||
| 	set /p confirm="Your login tokens will be sent through Katboi's VPN machine, is that ok? Personal VPN is required if not (yes/no):" | ||||
| 	if /i "!confirm!"=="yes" ( | ||||
| 		set use_proxy=true | ||||
| 	) else ( | ||||
| 		set use_proxy=false | ||||
| 	) | ||||
| 	echo !file_path!> %file_name% | ||||
| 	echo !dmm_login!>> %file_name% | ||||
| 	echo !dmm_password!>> %file_name% | ||||
| 	echo !use_proxy!>> %file_name% | ||||
| ) ELSE ( | ||||
|     	< %file_name% ( | ||||
| 		set /p file_path= | ||||
| 		set /p dmm_login= | ||||
| 		set /p dmm_password= | ||||
| 		set /p use_proxy= | ||||
| 	) | ||||
| 	echo Loaded settings from %file_name% | ||||
| ) | ||||
|  | ||||
| python dmmBypass.py kfp2g %file_path% %dmm_login% %dmm_password% true %use_proxy% | ||||
|  | ||||
| python dmmBypass.py -g kfp2g -u | ||||
| pause | ||||
		Reference in New Issue
	
	Block a user