python-js逆向之某租网站-AES加密

目标网站:aHR0cHM6Ly93d3cubWFvbWFvenUuY29tLyMvYnVpbGQ=

话不多说直接开干

1.打开网页,查看源码,哟吼,比我还干净,查找xhr,发现有三个文件,且都是加密数据

2.开始一般操作,随意复制hotlist.json到xur断点,停住了,开始分析调用栈,发现没有什么关键地方

3.于是开始用一种最笨的操作,试试看,咱也不知道行不行,点进入内部调试,看提示,真的不知道点了几下,可以去尝试下,终于到了关键位置,出现那一刻真的太感人了,那data不正是加密数据吗,,,,,,如果是老手的话看到加密那一刻,肯定是会先试着全局搜索encode,encrypt,decode,decrypt,json.parse等,我还是太年轻了,我事后才想起来。

4.于是开心的打上断点,刷新。真的是乐极生悲啊,虽然停住了但一直在加载,鼠标也点不了,等了好久也没好.............试了几次都一样,难道 天要亡我?。。。。。。天无绝人之路,人定胜天啊,我想起了hook,上图有个JSON.parse,没错咱就hook它,咱也不知道行不行,试试看

脚本代码如下:

5.刷新,加密数据出现,再全速运行,可以说这波操作是很成功

6.在第一次找到的地方打个断点,在全速运行,停住了,很直观,加密数据进来先替换一波,在解个密再转下类型。

7.于是进入解密内部分析,哟吼,AES,CBC,pkcs7,还有个iv,分析发现 l 是个固定值

8.多调试几遍后就可以进行扣代码了,把该扣的都扣下来,我们只是需要解密相关,但是你可能会因为this,n.default啥的不知道咋扣而选择整体扣,因为我也不知道....................................于是调试几遍后我就想用CryptoJS试试,

直接第一行写 var CryptoJS = require('crypto-js')

把n.default都替换成CryptoJS,扣好并修改好的代码如下:

function aes_decrypt(e) {
    var l = '0a1fea31626b3b55'
    return d(l, e)
}

function d(e, l) {
    e = CryptoJS.enc.Utf8.parse(e);
    var a = CryptoJS.AES.decrypt(l, e, {
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7,
        iv: e
    });
    return CryptoJS.enc.Utf8.stringify(a)
}

function decrypted(e) {
    e = aes_decrypt(e.replace(/^\s+|\s+$/gm, ""))
    //e = JSON.parse(e)
    return e
}

再复制个请求得到的加密数据打印看看,完美解密。

返回数据解密分析完了,下面就该分析加密参数到底是什么。

没错这次咱也直接hook

首先一个对象先转为字符串,再加密,想想这次我们应该hook什么

..................此处分析省略一万字........

.........................................................

.........................................................

.........................................................

以下直接给出代码:

function p(e, l) {
    return e = CryptoJS.enc.Utf8.parse(e),
        l = CryptoJS.enc.Utf8.parse(l),
        CryptoJS.AES.encrypt(l, e, {
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7,
            iv: e
        }).toString()
}
function k(e) {
    var l = '55b3b62613aef1a029bd7231109e051d'
    return l = 0 == e ? l.substring(0, 16) : l.substring(16, 32)
}

function encrypted(e) {
    e = JSON.stringify(e)
    return p(k(0), e)
}

当然了有了参数加密的,是不是该有个参数解密的,写写吧,其实已经有答案了。

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是一个简单的使用 python-gnupg 模块进行加密和解密的示例代码: ```python import gnupg # 创建一个 GPG 对象 gpg = gnupg.GPG() # 导入公钥 with open('public_key.asc', 'rb') as f: public_key = f.read() import_result = gpg.import_keys(public_key) print(import_result.results) # 加密数据 data = b'Hello, world!' encrypted_data = gpg.encrypt(data, import_result.fingerprints[0], always_trust=True) print(encrypted_data.data) # 解密数据 decrypted_data = gpg.decrypt(encrypted_data.data, passphrase='your_passphrase') print(decrypted_data.data) ``` 在上面的示例代码中,我们首先通过 `gnupg.GPG()` 创建了一个 GPG 对象。然后,我们通过读取公钥文件的方式导入了公钥,并使用 `gpg.import_keys()` 方法将公钥导入到 GPG 对象中。接着,我们使用 `gpg.encrypt()` 方法对数据进行加密,并将加密结果打印出来。最后,我们使用 `gpg.decrypt()` 方法对加密数据进行解密,并将解密结果打印出来。 需要注意的是,上述示例中的 `public_key.asc` 文件是一个 ASCII 编码的公钥文件,可以通过 `gpg --export --armor <key-id>` 命令导出。`--armor` 选项表示将输出结果转换为 ASCII 编码的文本格式。`<key-id>` 是要导出公钥的密钥 ID。 另外,需要在使用 `gpg.encrypt()` 方法时指定接收者的指纹(即密钥 ID),这里我们使用导入公钥时获取的第一个指纹。在使用 `gpg.decrypt()` 方法时,需要提供解密密码(即私钥密码)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值