根据火绒剑在系统日志里监控Typore的启动,找到可疑的asar文件,程序访问并读取了该文件,并启动了其中的main.node模块,疑似开发者对加密源代码的解密过程
image.png (31.93 KB, 下载次数: 0)
下载附件
2024-9-27 20:45 上传
找到app.asar文件,根据日志显示,可以猜测这个类似压缩包,问Bing得知
asar是一种用于打包Electron应用程序源代码的文件格式,它可以让应用程序更容易分发和运行。asar文件的工作原理是将所有文件连接在一起,不进行压缩,但支持随机访问。asar文件可以使用asar命令行工具或者electron-packager等工具来创建或解压
根据提示内容进行解压, asar extract app.asar unpacked
得到unpacked文件,貌似找到关于许可证的有关文件--License.js,Winhex打开看一眼
image.png (102.01 KB, 下载次数: 0)
下载附件
2024-9-27 20:45 上传
有种base64编码的感觉,难道只是base64编码加密?拖进CyberChef解密一下
image.png (201.21 KB, 下载次数: 0)
下载附件
2024-9-27 20:45 上传
可能还有一层或几层加密
2. 从main.node文件找License.js的解密逻辑
根据火绒剑日志显示,在app.asar解包后运行了main.node模块,又根据前面License.js被加密了,可以推测main.node有可能运行时解密了License.js文件,先DIE看一眼main.node,DLL64位,IDA64打开,先不管其他的,shift+f12查找字符串
image.png (38.63 KB, 下载次数: 0)
下载附件
2024-9-27 20:46 上传
疑似有base64解密过程,交叉引用找到引用处伪代码
image.png (67.61 KB, 下载次数: 0)
下载附件
2024-9-27 20:46 上传
根据Bing得知
napi_get_named_property 是一个 Node-API 的函数,它的作用是从一个对象中获取一个指定名称的属性,并返回它的值。
napi_status napi_call_function(napi_env env, napi_value recv, napi_value func, size_t argc, const napi_value* argv, napi_value* result);
其中,参数的含义是:
分析得知,这段代码类似给v40进行解码,v40 = base64.from(v38),v38又来自函数的第三个参数a3+8,猜测这个a3+8指向的就是密文的地址,动调验证下,x64dbg直接拖Typora,手动下一个main.node的断点,再根据IDA中给出的偏移计算出调试器里解密函数的地址,根据64位下寄存器默认传参顺序是ECX,EDX,R8,R9知道a3的值储存在R8中,所以R8+8指向密文地址,验证:
image.png (265.21 KB, 下载次数: 0)
下载附件
2024-9-27 20:46 上传
image.png (21.62 KB, 下载次数: 0)
下载附件
2024-9-27 20:46 上传
image.png (43.39 KB, 下载次数: 0)
下载附件
2024-9-27 20:46 上传
这里的数据刚好对应的是atom.js里的密文
image.png (122.09 KB, 下载次数: 0)
下载附件
2024-9-27 20:46 上传
验证成功,继续分析
image.png (44.51 KB, 下载次数: 0)
下载附件
2024-9-27 20:46 上传
找到类似加密算法的密钥初始化,用findcrypt看一眼发现了AES的S盒和逆S盒,推测这里应该是AES的密钥,而且长度为32个字节,猜测是256位模式
image.png (31.16 KB, 下载次数: 0)
下载附件
2024-9-27 20:46 上传
接着找AES解密线索,找到F4E0偏移处函数
image.png (46.28 KB, 下载次数: 0)
下载附件
2024-9-27 20:47 上传
里面有S盒和异或的继续分析,确定下ECB模式还是CBC模式
image.png (40.64 KB, 下载次数: 0)
下载附件
2024-9-27 20:47 上传
进入3A8F偏移处函数分析,在这里先猜测block应该是密文(void 指针数组)
image.png (40.2 KB, 下载次数: 0)
下载附件
2024-9-27 20:47 上传
函数里面又出现了一个循环异或,可以肯定这是个CBC模式下的异或偏移量了,那偏移量又是怎么来的呢,追踪a2(密文地址)进行判断的话,函数里面是复制了一份a2给v3,也就是说v3可能指向了密文
image.png (35.23 KB, 下载次数: 0)
下载附件
2024-9-27 20:47 上传
那么result就是偏移量了,偏移量来自密文地址+v5处,进行16次循环,也就是说偏移量可能来自密文的0-15个字节位?
3. CyberChef验证猜测
依据之前的猜测,main.node通过base64解码,再AES,CBC模式解码,密钥IDA动调得到
0x4E, 0xE1, 0xB3, 0x82, 0x94, 0x9A, 0x02, 0x4B, 0x80, 0x2F, 0x52, 0xB4, 0xB4, 0xFE, 0x57, 0xF1, 0xBE, 0xF4, 0x08, 0x53, 0x10, 0x92, 0x56, 0xE2, 0xC2, 0x0D, 0xEC, 0xA3, 0xDD, 0x8D, 0xD5, 0x6D
偏移量为密文的前16个字节,带入CyberChef检验
image.png (208.01 KB, 下载次数: 0)
下载附件
2024-9-27 20:47 上传
这下应该是得到了License.js源码,下载得到文件,找在线js美化工具美化
4. 最终的Patch
简单审计了下代码,不懂的找Bing问就是。首先应该patch掉网络验证类似request的东西,找到了几处
patch掉网络验证,对doActivation的验证直接改成永恒真,使得邮箱和序列号随便填即可激活,再改写hasLicense的值,使得下次登录时访问许可证信息时得到软件已被激活的信息,再打包生成app.asar,打开软件随便输入序列号和邮箱即可
5. 破解成功
image.png (75.27 KB, 下载次数: 0)
下载附件
2024-9-27 20:48 上传