Google+按钮背后的逆向工程Javascript

问题描述 投票:0回答:3

我正在尝试模拟google+按钮。在LINK的部分代码中,它将会话ID转换为某种哈希值。我发现会话ID名称是SAPISID,转换后的哈希名称是SAPISIDHASH,谁能告诉我哪个部分代码执行哈希部分。任何帮助将不胜感激。我已经连续 6 个小时了,仍然没有任何线索:(

例如

VUOyLIU22fNPz2ko/AbGsxW03_WHoGjaJq is SAPISID
f17aa630b9b9a105dad437b0fedcafe429f6fca2 is SAPISIDHASH
。在 php 中我尝试了所有类型的哈希..没有匹配。

javascript
3个回答
52
投票

胜利!至少对我来说很好。我正在寻找的

SAPISIDHASH
是 API 控制台中的一个。相当大的工作的自动化,完全合法。 我发现的是当前 JavaScript 毫秒时间戳的 SHA1 加上 cookie 中当前的
SAPISID
以及域来源。为了 为了使我的请求有效,我必须在请求中包含以下标头:

Authorization:SAPISIDHASH 1439879298823_<hidden sha1 hash value>

和:

X-Origin:https://console.developers.google.com

我假设第一个标头告诉服务器您的时间戳和 SHA1 值。 第二个(如果不包含它就会中断)告诉它在 SHA1 算法。我通过深入挖掘和调试找到了算法 大量缩小的 JS 注意,之间附加了空格 价值观。伪代码基本上是:

sha1(new Date().getTime() + ' ' + SAPISID + ' ' + origin);

这至少是我在 2015 年的用例中获得

SAPISIDHASH
值的方式 (几年后我知道)...与你的不同,但也许我会帮助一些 有一天,还有其他年轻的优秀黑客。


8
投票

所有功劳均归功于戴夫·托马斯。

我只是想澄清一下,对于 X-Origin 或 Origin,您不包括“X-Origin:”或“Origin:”

这是一个例子:

public class SAPISIDHASH {

    public static void main(String [] args) {

        String sapisid = "b4qUZKO4943exo9W/AmP2OAZLWGDwTsuh1";
        String origin = "https://hangouts.google.com";
        String sapisidhash = "1447033700279" + " " + sapisid + " " + origin;
        System.out.println("SAPISID:\n"+ hashString(sapisidhash));
        System.out.println("Expecting:");
        System.out.println("38cb670a2eaa2aca37edf07293150865121275cd");

    }

    private static String hashString(String password)
    {
        String sha1 = "";
        try
        {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(password.getBytes("UTF-8"));
            sha1 = byteToHex(crypt.digest());
        }
        catch(NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
        catch(UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        return sha1;
    }

    private static String byteToHex(final byte[] hash)
    {
        Formatter formatter = new Formatter();
        for (byte b : hash)
        {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }
}

Java 中 sha1 的来源: Java 字符串到 SHA1


0
投票

这适用于 2024 年的 youtube(带有 Deno 运行时的 js)

const now = new Date();
const origin = "https://studio.youtube.com";
const timems = now.getTime() + (now.getTimezoneOffset() * 60 * 1000)
const timesec = Math.round(timems / 1000);
const SAPISID = cookieArray['SAPISID']; // you should know how to get it
const newHash = timesec + '_' + sha1(timesec + ' ' + SAPISID + ' ' + origin, "utf8", "hex"); // this sha1 function is from deno package but you can use any other from the samples above
SAPISIDHASH = newHash; // 1704658177_78eb913fea82472cd726b118c51a6071f9d794f3

我使用 deno 中的 sha1,但您可以使用上面示例中的 sha1 的任何其他实现。

© www.soinside.com 2019 - 2024. All rights reserved.