Webview debugging via chrome://inspect can be very useful when reverse engineering hybrid applications (Cordova etc). Using Frida we can overwrite the constructors and always enable debugging.
// Enable debugging on Android webviews
/*
You might not need to hook all of the constructors, assuming that the
ones with less parameters just use defaults;
you would be able to only hook the root one (ie, the constructor that is called by all the other constructors).
*/
Java.perform(() => {
let android_webkit_WebView = Java.use("android.webkit.WebView")
android_webkit_WebView.$init.overload("android.content.Context").implementation = function (android_content_Context_0) {
let returnValue = this.$init.apply(this, arguments)
this.setWebContentsDebuggingEnabled(true)
console.log("Enabling debugging")
return returnValue
}
android_webkit_WebView.$init.overload("android.content.Context", "android.util.AttributeSet").implementation = function (android_content_Context_0, android_util_AttributeSet_1) {
let returnValue = this.$init.apply(this, arguments)
this.setWebContentsDebuggingEnabled(true)
console.log("Enabling debugging")
return returnValue
}
android_webkit_WebView.$init.overload("android.content.Context", "android.util.AttributeSet", "int").implementation = function (android_content_Context_0, android_util_AttributeSet_1, int_2) {
let returnValue = this.$init.apply(this, arguments)
this.setWebContentsDebuggingEnabled(true)
console.log("Enabling debugging")
return returnValue
}
android_webkit_WebView.$init.overload("android.content.Context", "android.util.AttributeSet", "int", "int").implementation = function (android_content_Context_0, android_util_AttributeSet_1, int_2, int_3) {
let returnValue = this.$init.apply(this, arguments)
this.setWebContentsDebuggingEnabled(true)
console.log("Enabling debugging")
return returnValue
}
android_webkit_WebView.$init.overload("android.content.Context", "android.util.AttributeSet", "int", "int", "java.util.Map", "boolean").implementation = function (android_content_Context_0, android_util_AttributeSet_1, int_2, int_3, java_util_Map_4, boolean_5) {
let returnValue = this.$init.apply(this, arguments)
this.setWebContentsDebuggingEnabled(true)
console.log("Enabling debugging")
return returnValue
}
android_webkit_WebView.$init.overload("android.content.Context", "android.util.AttributeSet", "int", "java.util.Map", "boolean").implementation = function (android_content_Context_0, android_util_AttributeSet_1, int_2, java_util_Map_3, boolean_4) {
let returnValue = this.$init.apply(this, arguments)
this.setWebContentsDebuggingEnabled(true)
console.log("Enabling debugging")
return returnValue
}
})