Initial commit: Flights iOS app
Flight search app built on FlightConnections.com API data. Features: airport search with autocomplete, browse by country/state/map, flight schedules by route and date, multi-airline support with per-airline schedule loading. Includes 4,561-airport GPS database for map browsing. Adaptive light/dark mode UI inspired by Flighty. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
101
frida/simple_hook.js
Normal file
101
frida/simple_hook.js
Normal file
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
* Simple URL connection logger.
|
||||
* Hooks at the lowest level to catch ALL HTTP traffic regardless of OkHttp version.
|
||||
*/
|
||||
Java.perform(function() {
|
||||
console.log("[*] Simple HTTP hook starting...");
|
||||
|
||||
// Hook HttpURLConnection
|
||||
try {
|
||||
var HttpURLConnection = Java.use("java.net.HttpURLConnection");
|
||||
HttpURLConnection.getInputStream.implementation = function() {
|
||||
var url = this.getURL().toString();
|
||||
var code = this.getResponseCode();
|
||||
console.log("[HTTP] " + code + " " + url);
|
||||
return this.getInputStream();
|
||||
};
|
||||
console.log("[+] HttpURLConnection.getInputStream hooked");
|
||||
} catch(e) {
|
||||
console.log("[-] HttpURLConnection hook failed: " + e);
|
||||
}
|
||||
|
||||
// Hook OkHttp Response - try multiple class paths
|
||||
var okHttpClasses = [
|
||||
"okhttp3.internal.http.RealInterceptorChain",
|
||||
"okhttp3.internal.connection.RealInterceptorChain",
|
||||
"okhttp3.RealCall"
|
||||
];
|
||||
|
||||
for (var i = 0; i < okHttpClasses.length; i++) {
|
||||
try {
|
||||
var cls = Java.use(okHttpClasses[i]);
|
||||
var methods = cls.class.getDeclaredMethods();
|
||||
console.log("[*] Found " + okHttpClasses[i] + " with " + methods.length + " methods:");
|
||||
for (var j = 0; j < methods.length; j++) {
|
||||
console.log(" " + methods[j].getName());
|
||||
}
|
||||
} catch(e) {
|
||||
console.log("[-] " + okHttpClasses[i] + ": not found");
|
||||
}
|
||||
}
|
||||
|
||||
// Hook OkHttp Response.body() to see what responses come back
|
||||
try {
|
||||
var Response = Java.use("okhttp3.Response");
|
||||
Response.body.implementation = function() {
|
||||
var body = this.body();
|
||||
try {
|
||||
var url = this.request().url().toString();
|
||||
var code = this.code();
|
||||
console.log("[OkHttp] " + code + " " + url);
|
||||
|
||||
if (body !== null && url.indexOf("spirit.com") !== -1 ||
|
||||
url.indexOf("delta.com") !== -1 || url.indexOf("united.com") !== -1) {
|
||||
|
||||
// Try to peek at the body
|
||||
try {
|
||||
var source = body.source();
|
||||
source.request(java_lang_Long.MAX_VALUE.value);
|
||||
var buffer = source.getBuffer().clone();
|
||||
var bodyStr = buffer.readUtf8();
|
||||
|
||||
if (bodyStr.length > 0) {
|
||||
console.log("[BODY] (" + bodyStr.length + " chars) " + bodyStr.substring(0, Math.min(2000, bodyStr.length)));
|
||||
|
||||
send({
|
||||
type: "RESPONSE",
|
||||
url: url,
|
||||
status: code,
|
||||
body: bodyStr
|
||||
});
|
||||
}
|
||||
} catch(be) {
|
||||
console.log("[BODY-ERR] " + be);
|
||||
}
|
||||
}
|
||||
} catch(e) {
|
||||
// ignore
|
||||
}
|
||||
return body;
|
||||
};
|
||||
console.log("[+] OkHttp Response.body() hooked");
|
||||
} catch(e) {
|
||||
console.log("[-] OkHttp Response hook failed: " + e);
|
||||
}
|
||||
|
||||
var java_lang_Long = Java.use("java.lang.Long");
|
||||
|
||||
// Also hook URL.openConnection for non-OkHttp traffic
|
||||
try {
|
||||
var URL = Java.use("java.net.URL");
|
||||
URL.openConnection.overload().implementation = function() {
|
||||
console.log("[URL] " + this.toString());
|
||||
return this.openConnection();
|
||||
};
|
||||
console.log("[+] URL.openConnection hooked");
|
||||
} catch(e) {
|
||||
console.log("[-] URL hook failed: " + e);
|
||||
}
|
||||
|
||||
console.log("[*] Simple HTTP hook ready.");
|
||||
});
|
||||
Reference in New Issue
Block a user