-
Notifications
You must be signed in to change notification settings - Fork 290
ManifestV3 Bypasses
Don't waste your time with compliance. FastForward automatically skips annoying link shorteners.
With the release of MV3 and the deprecation of MV2, we have decided to move to MV3 to remain on the Chrome Web Store. Luckily, bypasses are easier to write for the MV3 branch.
Generally, every MV3 bypass, instant or crowd, will have the structure below and will be placed in src/bypasses
import BypassDefinition from "./BypassDefinition.js"
export default class Website extends BypassDefinition {
constructor() {
super()
}
execute() {
//Bypassing stuff goes here
}
}
export const matches = ['website.com'] //What websites will be bypassed
Let's translate the dutchycorp.space bypass to MV3. For reference, here is the MV2 bypass.
domainBypass("dutchycorp.space", () => {
ifElement("div#cl1", d => {
safelyNavigate(d.getElementsByTagName("a")[0].href)
})
})
First, we'll need to make a blueprint for this bypass. For conformity, use only 1 website name in the file and class name. Keep the class name with the first letter capitalized. For example, if the website is dutchycorp.space
, the file name will be dutchycorp.js
and the class name will be Dutchycorp
. The file will be placed in src/bypasses
in the manifest-v3 branch. Here is what the blueprint will look like:
import BypassDefinition from "./BypassDefinition.js"
export default class Dutchycorp extends BypassDefinition {
constructor() {
super()
}
execute() {
//Bypassing stuff goes here
}
}
export const matches = ['dutchycorp.space']
All the functions in the MV2 injection script are also in MV3, except ones that are easier without functions. Due to this, there is no loss in functionality for the mv3 extension. One MAJOR difference is that when you call a function, you must add this.helpers to it. For example, if you want to call safelyNavigate
, you would write this.helpers.safelyNavigate
, as the functions are now in a class.
It's very simple to translate mv2 extesions to mv3. Here is the MV3 version of the dutchycorp bypass:
import BypassDefinition from "./BypassDefinition.js"
export default class Dutchycorp extends BypassDefinition {
constructor() {
super()
}
execute() {
const address = document.querySelector("div#cl1")
if (address) {
this.helpers.safelyNavigate(address.getElementsByTagName("a")[0].href)
}
}
}
export const matches = ['dutchycorp.space']
In this example, the ifElement function was replaced with an if statement. This is because the ifElement function is not needed in MV3. The if statement is the same as the ifElement function, but it is not a function.
Now we will do a bypass with crowd bypass. For this example, we will use the ouo.io
bypass. Here is the MV2 bypass:
domainBypass(/ouo\.(press|io)/, () => {
if (location.pathname !== '/') {
if (/(go|fbc)/.test(location.pathname.split("/")[1])) {
document.querySelector("form").submit()
}
else {
ifElement("form#form-captcha", form => {
form.action = `/xreallcygo${location.pathname}`
form.submit()
}, () => crowdBypass())
}
}
})
Here is the MV3 template:
import BypassDefinition from "./BypassDefinition.js"
export default class Ouo extends BypassDefinition {
constructor() {
super()
}
execute() {
//Bypassing stuff goes here
}
}
export const matches = ['ouo.io', 'ouo.press']
Now we will need to translate the bypass. The overall structure is the same, but the functions are different. Here is the MV3 bypass:
import BypassDefinition from "./BypassDefinition.js"
export default class Ouo extends BypassDefinition {
constructor() {
super()
}
execute() {
if (location.pathname !== '/') {
if (/(go|fbc)/.test(location.pathname.split("/")[1])) {
document.querySelector("form").submit()
}
else {
if (document.querySelector("form#form-captcha")) {
document.querySelector("form#form-captcha").action = `/xreallcygo${location.pathname}`
document.querySelector("form#form-captcha").submit()
}
else {
this.helpers.crowdBypass()
}
}
}
}
}
export const matches = ['ouo.io', 'ouo.press']
And there you go! You've made 2 bypasses for MV3. If you have any questions, feel free to ask in the Discord server.