当我在window.localStorage
上运行https://stackoverflow.com
时,它返回localStorage
,但是当我在Discord页面上使用相同的命令时,它每次都会返回undefined
。
Discord正在执行某些操作以从客户端删除其localStorage
吗?如果是这样,是否有办法在localStorage
删除之前对其进行更改,防止其被删除或以其他任何方式在undefined
之前对其进行访问?
有什么帮助吗?
答案 0 :(得分:2)
就像用户AkiraMiura提到的那样-“ Discord”页面开发人员已删除window.localStorage
属性。他们这样做的方式如下(来自 Reddit post ):
Discord如何隐藏localStorage?
....(function() { var privateLocalStorage = window.localStorage; delete window.localStorage; console.log(privateLocalStorage); }()); console.log(window.localStorage); //undefined
他们在所有本地存储操作所在的位置创建一个闭包,并将
localStorage
复制到变量,然后从窗口中删除对象。
但是我们可以使用iframe中的localStorage
如果您要使用Discord页面上的 localStorage 来进行还原,则可以使用iframe.src = 'about:blank';
从新的iframe中获取它,这使您可以进行工作带有“ Discord”页面的已存储项目。您可以这样写:
window.localStorage = iframe.contentWindow.localStorage;
在iframe加载之后,但是这个localStorage
对象来自iframe,因此,您无需编写它-更好的是,如下面的代码所示。
您可以在开发人员控制台中将以下代码放在 "Discord" page 上,您将在控制台输出中获得如下内容:
“ 45235333 ... WKDrSWDKIS”
别忘了之前在“ Discord”页面上登录!(甚至不必在此页面上登录)。
代码
var iframe = document.createElement('iframe');
iframe.onload = function()
{
//Iframes must be appended to the DOM in order to be loaded
//Iframes do not load immediately nor synchronously
//now (after load) we can use iframe.contentWindow:
//window.localStorage = iframe.contentWindow.localStorage; //you can use it, but better is like:
var ifrLocalStorage = iframe.contentWindow.localStorage;
//But DO NOT: "document.body.removeChild(iframe);" because after it access on 'Storage' will be denied
console.log(ifrLocalStorage.getItem('fingerprint'));
//OUTPUT: "45235333...WKDrSWDKIS"
};
iframe.src = 'about:blank';
document.body.appendChild(iframe);
祝你好运!
答案 1 :(得分:1)
您仍然可以通过编程方式获得访问权限。他们已删除window.localStorage
。这是窗口实例的自有属性,但不是数据属性,而是访问器。访问者的get是一种品牌方法,它将返回内部具有localStorage
插槽的任何接收者的localStorage
值。当前窗口的实际内部localStorage
插槽仍然存在,因此您需要的是另一个品牌的get localStorage
函数。幸运的是,您可以获得很多方法。
function getLocalStoragePropertyDescriptor() {
const iframe = document.createElement('iframe');
document.head.append(iframe);
const pd = Object.getOwnPropertyDescriptor(iframe.contentWindow, 'localStorage');
iframe.remove();
return pd;
}
// You can use pd.get.call, pd.get.apply, or use Reflect.apply; but the simplest
// thing to do is probably to just restore the original property:
Object.defineProperty(window, 'localStorage', getLocalStoragePropertyDescriptor());
window.localStorage.heeeeey; // yr old friend is bak
如果这是一场军备竞赛,则有兴趣隐藏localStorage的一方可以尝试通过返回窗口对象引用的DOM修补每个方法和访问器。即使它们成功了,但最终的词总是在用户方:浏览器扩展内容脚本,其清单文件声明必须在任何其他代码之前对其进行评估。 (这就是为什么可以进行广告拦截的原因。)
存储(无论是sessionStorage实例还是localStorage实例)均不用于保存敏感数据。它根本不受保护。似乎试图隐藏起来,暗示它可能被滥用了。
答案 2 :(得分:0)
在reddit上找到。 TL; DR,他们将window.localStorage移至另一个变量,然后删除window.localStorage。
我发现获得localStorage的一种方法(虽然是手动)如下:
1:转到https_discordapp.com_0.localstorage
2:在SQLite Studio中打开https_discordapp.com_0 > Tables > ItemTable
3:转到Data
,然后双击它。
4:在00
标签下,双击一个值,然后读取/转换十六进制数据,并删除所有其他X
十六进制。
答案 3 :(得分:-1)
实际上,我想写其他这篇帖子的解决方案,更流畅。完全加载Discord网站后,将以下代码复制并粘贴到浏览器的控制台中,则window.localStorage
还不是undefined
。
(() => {
const iframe = document.createElement('iframe');
iframe.style.display = 'none';
document.body.prepend(iframe);
window.localStorage = iframe.contentWindow.localStorage;
iframe.remove();
})();
Discord开发团队从全局localStorage
对象中删除了window
键,因此我再次创建并将其添加到DOM之前以使用其localStorage
。