吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2438|回复: 71
上一主题 下一主题
收起左侧

[原创] Typora最新版逆向分析

  [复制链接]
跳转到指定楼层
楼主
swiftR 发表于 2024-12-12 11:36 回帖奖励
本帖最后由 swiftR 于 2024-12-12 15:59 编辑

1.app.asar分析

通过大佬们的文章知道Typora是通过加载main.node文件执行的,直接分析app.asar文件就行,asar是electron用的归档文件通过asar解压出来即可

asar extract ./app.asar ./app.unpacked

解压出来后发现atom.js是加密后的文件,这个应该就是typora的js逻辑代码了。直接分析main.node文件看看有没有引用atom.js

2. main.node分析

通过查找main.node中的字符串找到0xE57D这里有对字符串./atom.js的引用

image.png

这里实际是调用napi_create_string_utf8创建了一个给js环境使用的字符串./atom.js,
image.png
通过静态分析知道v66是创建好的atom.js的字符串地址, 实际是被传入sub_4467中调用napi_call_function来调用js函数

image.png
通过动态分析可以知道这里执行的js函数是

(function makeRequireFunction(e) {
    const n = e.constructor;
    function t(e, n) {
        if ("string" != typeof e) throw new TypeError('The "' + n + '" argument must be of type string. Received type ' + typeof e)
    }
    const r = function(n) {
        return e.require(n)
    };
    function o(r, o) {
        return t(r, "request"),
        n._resolveFilename(r, e, !1, o)
    }
    return r.resolve = o,
    o.paths = function(r) {
        return t(r, "request"),
        n._resolveLookupPaths(r, e)
    },
    r.main = process.mainModule,
    r.extensions = n._extensions,
    r.cache = n._cache,
    r
})

参数是字符串atom.js,可以看到实际是require("./atom.js"),了解js的都知道直接require一个加密的js会直接报错,这里猜测应该是重写了require的底层
image.png
这里重新创建了一个_compile函数并调用了napi_define_properties来覆盖当前Module的_compile函数,js调用require函数时会调用到_compile函数解析js,应该是在_compile函数中完成对atom.js的解密,这里直接分析_compile函数。
通过动态分析最终会调用到sub_10BF0执行解密并执行atom.js中的代码
image.png
这里sub_4647会将atom.js进行解密并返回js的字符串指针。

3.解密流程分析

直接来到sub_B480,拿到atom.js的密文后首先通过base64解密,base64解密完成后去掉了解密后的最后一个字节并创建了新的字节数组。
image.png

下面要确定使用的是什么加密,sub_17070会使用到新创建出的密文去解密,每次解密后都会将密文的最后16个字节和解密后的数据异或操作基本可以确定key的最后16个字节是iv,加密方式是AES的CBC模式
image.png
直接在main.node偏移B784处断点拿到key和iv,rcx就是第一个参数前32字节是key最后16字节是iv
image.png
接下来去CyberChef验证下,解密时注意最后一个字节是用来计算iv的不参与到aes运算的需要删除
image.png
拿到js源码后找到验证相关的代码直接patch掉,再打包成app.asar替换原来的

4.破解加密

为了替换原来的atom.js需要通过aes加密后替换回去,这里的难点在于iv的计算是通过原字符串长度和最后一个字节共同计算的,可以看sub_1992的实现,这里为了省事直接调用dll的函数计算iv,把文件长度和最后一个字节改了就能直接成一个iv了

#include <windows.h>
#include <iostream>
typedef int64_t(*FunctionPtr)(int64_t* array, int64_t p2, int64_t p3);
int main() {
    HMODULE hModule = LoadLibrary(L"./main.node");
    DWORD_PTR baseAddress = (DWORD_PTR)hModule;
    DWORD_PTR functionOffset = 0x1992; 
    DWORD_PTR functionAddress = baseAddress + functionOffset;
    FunctionPtr func = (FunctionPtr)functionAddress;
    if (!func) {
        std::cerr << "无法获取函数指针" << std::endl;
        FreeLibrary(hModule);
        return 1;
    }
    const int64_t arrayLength = 3;
    int64_t inputArray[arrayLength] = {0,0 ,0};  
    int64_t len  = 0x22531;
    int64_t param3 = 0x10;
    byte last_byte = 0x6a;
    int64_t result = func(inputArray, (len%256)^last_byte, 0x10);
    byte* res = (byte*)(inputArray[0]);
    for (size_t i = 0; i < 16; i++)
    {
        std::cout <<"0x" << std::hex << static_cast<int>(res[i]);
    }
    FreeLibrary(hModule);
    return 0;
}

5.打包

万事俱备只欠东风,aes加密有了key和iv,这里最后一个计算iv的字节我用的'0xb7',按下边的步骤来就好

1.先将修改后的js文件进行aes加密
openssl enc -aes-256-cbc -in dump.js -out atom.byte  -iv 9B342BB23D876525D200266E2A2E46F7 -K aes_key
2.将计算iv用的字节写入到文件最后一个字节
printf '\xb7' >> atom.byte 
3.base64加密
base64 --wrap=0 atom.byte > atom.js
4.asar打包覆盖原来的app.asar
asar.cmd pack .\appasar\  app.asar --unpack-dir "{main.node}"

最后启动激活完成
image.png

免费评分

参与人数 24威望 +2 吾爱币 +124 热心值 +22 收起 理由
moshouhot + 1 + 1 我很赞同!
Weirdo + 1 + 1 谢谢@Thanks!
Crepe + 1 + 1 我很赞同!
Clown3zz + 1 + 1 我很赞同!
天堂的风 + 1 + 1 谢谢@Thanks!
allspark + 1 + 1 用心讨论,共获提升!
腰围两尺99 + 1 + 1 用心讨论,共获提升!
liyitong + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
bluexixi + 1 + 1 我很赞同!
edsionxuanxuan + 1 我很赞同!
what01 + 1 + 1 真能干!!
lingyun011 + 1 + 1 热心回复!
涛之雨 + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
FC1908 + 1 谢谢@Thanks!
DRZH + 1 + 1 我很赞同!
xiaoxiaoshou + 1 + 1 我很赞同!
Jerryice + 1 我很赞同!
小朋友呢 + 2 + 1 谢谢@Thanks!
yangxfan + 1 + 1 用心讨论,共获提升!
mr88fang + 1 + 1 我很赞同!
beatone + 1 + 1 谢谢@Thanks!
woyucheng + 1 + 1 谢谢@Thanks!
tail88 + 1 + 1 谢谢@Thanks!
jzfxly + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
Hmily 发表于 2024-12-12 15:51
@swiftR 贴图搞复杂了弄错了,很快图片就丢失了,看下演示赶紧编辑修改一下:https://www.52pojie.cn/misc.php? ... 29&messageid=36
推荐
moshouhot 发表于 2024-12-14 15:56
解包命令
asar extract ./app.asar ./appasar
打包命令
asar.cmd pack .\appasar\ app.asar --unpack "main.node"
沙发
chenxz2008 发表于 2024-12-12 11:54
对于我这种小白表示一点都看不懂,好好学习学习
3#
mol7732 发表于 2024-12-12 12:18
感谢提供分享思路
4#
hgd6367385 发表于 2024-12-12 12:28
太好了,正好在学
5#
52pojie19 发表于 2024-12-12 12:34
大佬牛逼啊
6#
jkl2024 发表于 2024-12-12 12:41
感谢分享,学习一下
7#
cszdz999 发表于 2024-12-12 12:48
最新版?是哪一版?
8#
Qinmuyi 发表于 2024-12-12 12:51
感谢分享
9#
无敌小儿 发表于 2024-12-12 13:08
太高级了,看不懂
10#
Junm 发表于 2024-12-12 13:10
谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-14 18:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表