Is there an anti-correlation browser that can be called by a program | Anti-fingerprint browser | How to modify the Chromium kernel | Chromium fingerprint browser development and customization

?
some

Original project link

https://github.com/musiclover789/luna

luna browser, this browser can be called directly by the program, and also provides the golang-encapsulated devtools framework, and can be called based on vision.

The supported proxy types are rich and the modified chrome items are as follows.

 //Set the fingerprint you need
args := []string{<!-- -->
/***
a. This parameter luna_user_agent currently only changes the value of navigator.userAgent; that is to say, http, http2, and other protocol layers will still not be replaced; if you need to replace it, see below.
b. In headless mode, navigator.userAgent will also be replaced; no headless userAgent will be displayed;
*/
"--luna_user_agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
/***
a. The navigator.platform value is replaced
*/
"--luna_platform=win64",
/***
a. After timeZone is tested, the time zone will be replaced with the specified time zone.
b. The time zone offset of timeZone is also automatically calculated.
c. Test js:
const date = new Date();
const timeZone = date.getTimezoneOffset();
const timeZoneOffset = -timeZone / 60;
console.log("Time Zone: " + Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log("Time Zone Offset: " + timeZoneOffset);
*/
"--luna_timezone=Europe/London",
/***
languages: The following will take effect
a.navigator.language
b. new Intl.DateTimeFormat().resolvedOptions().locale
Note: Theoretically, both international API and navigator are valid.

*/
"--luna_languages=en-GB",
/***
navigator.userAgentData:
Value example: Google Chrome:92-luna-Chromium:92-luna-Not-A.Brand:24-luna-platform:win32-luna-mobile:false-luna-platform_version:6.1-luna-ua_full_version:92.0.4515.186- luna-model:PC-luna-architecture:x86_64
format, -luna- is the delimiter for each group
: is the key and value separator
\t\t\tfor example:
1: Google Chrome:92-luna-Chromium:92 are 2 groups respectively Google Chrome:92 and Chromium:92
The value key and value of each group are: Group 1 key is Google Chrome value is 92, Group 2 Chromium:92 key is Chromium value is 92
2: What do they represent? Represents the value of brands after executing "navigator.userAgentData"; you can know it by testing it with your own browser.
3: The following are special values and represent the parameter values after executing "navigator.userAgentData".
mobile:false //Is it a mobile phone?
ua_full_version:92.0.4515.186 //Browser version
model:PC //Model information of the device
architecture:x86_64 //Chip type, such as arm
Note: Pay special attention to these 4 special values, because you may not be able to see their specific values, but third-party fingerprint tests can see their values.
For example: https://abrahamjuliot.github.io/creepjs/ For testing, you can see the following
*/
"--luna_userAgentData=Google Chrome:92-luna-Chromium:92-luna-Not-A.Brand:24-luna-platform:win32-luna-mobile:false-luna-platform_version:6.1-luna-ua_full_version:92.0. 4515.186-luna-model:PC-luna-architecture:x86_64",
/***
luna_header_1: This is to replace the header parameter in the data packet during http request;
key format:--luna_header_1
--luna_header_2
...
--luna_header_11
Value range[1-11]
In other words, you can replace up to 11 pieces. Why is it designed like this? Because too many affect efficiency; personally I feel that 1-11 is enough.
value format:
key -lunareplace- value //Represents replacing the key matched on the left with the value on the right
key -lunaremove- value //Represents the key matched on the left and deletes this header parameter item
key --lunaadd-- value //Add this key and value header item
Note that there are no spaces in the format. This is just for convenience. Normally it should be: key-lunareplace-value
\t\t\tscenes to be used:
1. In order to cope with the changes in navigator.userAgent, the protocol layer has not changed.
2. In order to delete the private data exposed at the protocol layer
3. Add the request header data you want to add
*/
"--luna_header_1=User-Agent-lunareplace-Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
"--luna_header_2=sec-ch-ua-arch-lunaremove-",
"--luna_header_3=sec-ch-ua-platform-lunaremove-",
"--luna_header_4=accept-language-lunareplace-en;q=0.9",
/***
deviceMemory memory
Suggested value range: [0.25, 0.5, 1, 2, 4, 8]
Represents the memory size of the device in GB.
Navigator.deviceMemory corresponding to js
*/
"--luna_deviceMemory=8", //[0.25, 0.5, 1, 2, 4, 8]
/***
deviceMemory memory
The property is a number that represents the number of logical processor cores of the device.
Corresponding to js\
avigator.hardwareConcurrency
*/
"--luna_hardwareConcurrency=16",
/***
Graphics Information: These are WebGL-related properties and extension names that provide information about the WebGL context and renderer:
UNMASKED_VENDOR_WEBGL: Indicates the vendor of the graphics hardware used by the WebGL context. It usually returns a string representing the name of the hardware vendor.
UNMASKED_RENDERER_WEBGL: Represents the renderer of the graphics hardware used by the WebGL context. It usually returns a string representing the name of the graphics renderer.
GL_VERSION: Indicates the OpenGL version supported by the WebGL context. It usually returns a string indicating the supported OpenGL version number.
SupportedExtensions: Represents the list of extensions supported by the WebGL context. It is an array containing the various extension names supported by the current WebGL context.
GL_VENDOR: Represents the name of the graphics hardware vendor used by the WebGL context. It usually returns a string representing the name of the graphics hardware vendor. //Default value: WebKit, which means I observed that this value is hard-coded into the chromium source code, and there is no need to modify it unless there are special circumstances.
GL_RENDERER: Indicates the name of the graphics renderer used by the WebGL context. It usually returns a string representing the name of the graphics renderer. //Default value: WebKit WebGL, which means I observed that this value is hard-coded into the chromium source code, and no modification is required unless there are special circumstances.
GL_SHADING_LANGUAGE_VERSION: Indicates the shading language version supported by the WebGL context. It usually returns a string representing the supported shading language version number.
The corresponding js and code are too long, so I won’t write them. You can observe the following code. Runtime.Evaluate(conn, luna_script.TestWebDriver()) basically has all the tests in it.
*/
"--luna_UNMASKED_VENDOR_WEBGL=Intel Corporation", //Google Inc. (Apple)
"--luna_UNMASKED_RENDERER_WEBGL=Intel(R) UHD Graphics 620", //ANGLE (Apple, Apple M1 Pro, OpenGL 4.2)
"--luna_GL_VERSION=WebGL 1.0 (OpenGL ES 3.0 Intel(R) UHD Graphics 620)",
`--luna_GL_SupportedExtensions=["ANGLE_instanced_arrays", "EXT_blend_minmax", "EXT_color_buffer_half_float", "EXT_disjoint_timer_query", "EXT_float_blend", "EXT_frag_depth", "EXT_shader_texture_lod", "EXT_texture_compression_rgtc", "EXT_texture_filter_ anisotropic", "WEBKIT_EXT_texture_filter_anisotropic", "EXT_sRGB", "KHR_parallel_shader_compile", "OES_element_index_uint", "OES_fbo_render_mipmap", "OES_standard_derivatives", "OES_texture_float", "OES_texture_float_linear", "OES_texture_half_float", "OES_texture_half_float_linear", "OES_vertex_array_object", "WEBGL _color_buffer_float", "WEBGL_compressed_texture_s3tc", "WEBKIT_WEBGL_compressed_texture_s3tc", "WEBGL_compressed_texture_s3tc_srgb ", "WEBGL_debug_renderer_info", "WEBGL_debug_shaders", "WEBGL_depth_texture", "WEBKIT_WEBGL_depth_texture", "WEBGL_draw_buffers", "WEBGL_lose_context", "WEBKIT_WEBGL_lose_context", "WEBGL_multi_draw"]`,
"--luna_GL_VENDOR=WebKit", //Default value WebKit
"--luna_GL_RENDERER=WebKit WebGL", //Default value WebKit WebGL
"--luna_GL_SHADING_LANGUAGE_VERSION=WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)", //Test value WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)
/***
cavans fingerprint:
Principle & Difference:
luna_cavans_random_str
luna_cavans_random_int
a: First of all, you can only choose 1 of these two, and you cannot write them at the same time, because writing them at the same time is basically equivalent to only setting luna_cavans_random_str, thus making luna_cavans_random_int become time zone dependent.
b:luna_cavans_random_str He just adds a random string when toDataURl; you need to pass in this string yourself. As for the value, as long as it is a string, the rest is optional.
What's the use?
This will make the entire browser, whether tabs, windows, or hidden windows, consistent when detecting cavans fingerprints;
And you have passed in a random string, so his fingerprint becomes random.
The disadvantage of this is that because the result value is randomized, it will be very false, but the range of falsehood is large.
c: luna_cavans_random_int His principle is just to adjust the compression level of png.
What's the use of this?
1. The advantage is that it is more realistic and will not affect any results.
2. The disadvantage is that your value range is only [0-9] and the number of fingerprints is limited. The default value of each version of the chromium source code may be different. The version I tested has the default value: 3. I also observed that some versions The default is 4
*/
//"--luna_cavans_random_str=B3B4",
"--luna_cavans_random_int=1", //Value 0-9, default value 3

/***
The screen: object is a global object that represents user screen information. The following is an explanation of the common properties found in the screen object:
height: Represents the total height of the screen in pixels.
width: Represents the total width of the screen in pixels.
availHeight: Indicates the available screen height, that is, the remaining screen height after subtracting the height of the operating system taskbar or other system UI.
availWidth: Indicates the available screen width, that is, the remaining screen width after subtracting the width of the operating system taskbar or other system UI.
availLeft: Indicates the offset of the left edge of the available screen relative to the left edge of the entire screen. In a multi-monitor setup, this property can be used to determine the position of the screen.
availTop: Indicates the offset of the top border of the available screen relative to the top border of the entire screen. In a multi-monitor setup, this property can be used to determine the position of the screen.
internal: Indicates whether the screen is an internal display. Returns true if the screen is an internal display, false otherwise. //My personal understanding is that if you buy a laptop and it comes with a built-in screen, it is true, and if the host has an external monitor connected to it, it is false.
primary: Indicates whether the screen is the primary display. Returns true if the screen is the primary monitor, false otherwise.
top: Indicates the offset of the top border of the screen relative to the top border of the entire screen. In a multi-monitor setup, this property can be used to determine the position of the screen.
left: Indicates the offset of the left border of the screen relative to the left border of the entire screen. In a multi-monitor setup, this property can be used to determine the position of the screen.
scaleFactor: Represents the scaling factor of the screen. If the operating system sets the zoom level, returns the zoom factor; otherwise, returns 1.
//In short, if it is not necessary, I recommend not to modify this value easily, because my framework is based on vision, and if you use visual clicks, it may be affected.
Also, this parameter is not very meaningful.
\t\t\tFormat:
Example: height:800,width:978
Comma "," separate each group
Colon ":" separates key and value
If you are not stupid, you should be able to understand it, so I won’t explain it in detail.
*/
//"--luna_screen=height:800,width:978,availHeight:1024,availWidth:934,availLeft:0,availTop:28,internal=true,primary=true,top:34,left:34,scaleFactor=2 ",
//"--luna_screen=height:1440,width:2560,availHeight:1440,availWidth:2560,availLeft:0,availTop:0,internal=true,primary=true,scaleFactor=2",
"--luna_key=WERWER234234WERWEr345345",
/***
\t\t\tat last:
1. These are common hardware information, but they do not represent everything, such as sound cards, fonts, CSS features of each version, speech synthesizer, etc.
It all depends on how big of a challenge you face (but, it’s usually enough)
2. From an academic perspective, my personal suggestion is to use real values.
3. From the perspective of usage, if you are not allowed to modify certain fingerprints, you do not need to write them.
The same is true for the key and value inside. If you don’t need it, you don’t need to write it.
If you don't write it, it will be the default value, and it will be whatever it is.
4. Don’t think that if you change a few parameters, he won’t be able to recognize you. The real situation is that this is a very skillful combination of fingerprints, and the identification method of big data statistics is still very scary. It’s revealing. Looks like a bone
5. From an academic perspective only, regarding mouse movement, click, double-click, and keyboard events, the default value of trusted is true; in theory, it is impossible to identify whether the program is clicking or not.
6. From an academic perspective only, whether it is , headless, including common identification of playwright, puppeteer, webdriver, Selenium, it is theoretically impossible to identify; because I don’t use these frameworks, but encapsulate them myself.
And feature elimination will be done by default.
*/
}