import requests LATEST = 3 GAP = 2 REV = 1 OLD = 0 def decrypt_iapp( *, lib_so_path, pack_version=LATEST, label, package_name, dex_key, so_key, version_name="1.0", version_code=100001, native_key=None, cache_key=None, sign_base64=None, encrypt_key=None, decrypt_files=["mian.iyu"], time_limit=5000, api_url="https://www.011106.xyz/iapp/decrypt" ): error_types = { -1: "InvalidPackVersion", -2: "InvalidSignBase64", -3: "InvalidDataBase64", -4: "InvalidVersionCode", -5: "InvalidNativeKey", -6: "InvalidCacheKey", -7: "InvalidTimeLimit", -8: "MissingPackageName", -9: "MissingVersionName", -10: "MissingLabel", -11: "MutexPoisoned", -12: "DecryptBusy", -13: "CipherInitFailed", -14: "DecryptFailed", -15: "EmptyLibSo", -16: "DecryptTimeOut", -17: "DecryptCacheMiss", -18: "ReadLibSoFailed", -19: "CacheOpenFailed", -20: "CacheReadFailed", -21: "CacheWriteFailed", -22: "BackupOpenFailed", -23: "BackupWriteFailed", -24: "UnableJoinSearch", } params = { "pv": pack_version, "pn": package_name, "lb": label, "vn": version_name, "vc": version_code, "dk": dex_key, "sk": so_key, "fn": ",".join(decrypt_files), "tl": time_limit } if native_key: params["nk"] = native_key if cache_key: params["ck"] = cache_key if sign_base64: params["sg"] = sign_base64 if encrypt_key: params["en"] = encrypt_key try: with open(lib_so_path, 'rb') as f: lib_so_data = f.read() except FileNotFoundError: return ('FileNotFound', 'UnableToOpenFile') except PermissionError: return ('PermissionError', 'UnableToReadFile') try: response = requests.post( api_url, params=params, data=lib_so_data, headers={'Content-Type': 'application/octet-stream'} ) result = response.json() if result["code"] < 0: error_type = error_types.get(result["code"], "UnknownErrorCode") error_explain = result["msg"] return (error_type, error_explain) return result["msg"] except requests.ConnectionError: return ('ConnectionError', 'UnableToConnect') except requests.Timeout: return ('Timeout', 'RequestTimeout') except requests.RequestException: return ('RequestException', 'RequestFailed') except ValueError: return ('ValueError', 'ParseServerResponseError') except Exception: return ('Exception', 'UnknownException') def test_decrypt_remote(): return decrypt_iapp( lib_so_path="./lib.so", pack_version=LATEST, label="AppName", package_name="com.i011106", version_code=100001, version_name="1.0", dex_key=0x12345678, so_key="AABBCCDD", decrypt_files=["mian.iyu"], ) def test_decrypt_local(): return decrypt_iapp( lib_so_path="./local_test_iapp_latest_1", pack_version=LATEST, label="test", package_name="com.i5c532e408bfb2e93", version_code=100001, version_name="1.0", dex_key=0x1d4755, so_key="50CC2CD53F", decrypt_files=["mian.iyu", "unicode.mjava", "this_file_does_not_exists.iyu"], api_url="http://localhost/iapp/decrypt" ) if __name__ == "__main__": print(test_decrypt_local()) # print(test_decrypt_remote())