electron逆向小记
记录一下通过在product模式下发行的electron应用调试手段和electron逆向的方法
解包
electron应用的核心代码通常以明文js形式储存在app.asar文件中(也可能使用wasm),他的exe本身是无意义的,所以我们要先解包npm install --engine-strict @electron/asar
然后运行asar e app.asar app
就能解包了,当然可能解包完后发现js是加密的(这种大概率是自解密壳,按照其他平台上的对抗手法一样对抗即可)
electron有一个特点,如果resource目录下有app.asar,他就会优先把app.asar作为资源运行,但如果我们把app.asar删了,留下解包后的文件夹,他也可以正常运行,这可能和asar只是归档文件格式有关,总之这大大方便了我们修改代码打补丁的过程
解包后的node_modules中可能会缺依赖,执行npm install
重新下载即可,package.json肯定是好的
之后在dist目录下应该能看到webpack打包的前端代码,然后其他目录下是一些后端代码,善用vscode的全局搜索功能定位关键代码即可,可以套用js逆向的常规对抗思路
调试
electron这种web应用本质是在本地泡了个chrome渲染网页和用户交互,在开发模式下直接按f12或者左上角工具栏都可以打开调试器,但是逆向遇到的大多都是发行版的app,这种情况本地不能打开f12,如果强行将运行环境(process.env.NODE_ENV)改为”development”,electron会尝试从本地开发服务器获取页面,但是发行版的应用肯定dev server都是剥离的,重新配置也很麻烦,这种时候一般是考虑使用chrome远程调试应用
electron的应用分前端渲染部分和后端部分,前端部分就是个网页,可以在运行时添加–remote-debugging-port=xxxx开启调试服务器,这是chromium内核应用通用的调试服务器开启方式,后端部分通过添加–inspect=xxxx开启调试,这个是electron特有的调试服务器参数
这些都开启后可以在本地chrome的chrome://inspect/#devices
页面查看调试服务器
一般默认已经开启了几个监听端口(9222),如果是新的端口要在network targets中手动添加
然后点击inspect就能打开调试窗口了
一般这个时候已经足够我们逆向了,如果还行打开electron原生的devTool,可以参考以下方法
先获取BrowserWindow的引用const BrowserWindow=require("electron")
然后通过BrowserWindow.getAllWindows()
获取所有窗口的引用
之后调用toggleDevTools()
方法一般就能弹调试器了
总之能我们都能任意执行js了,只要找到对应的方法执行就行了
当然应用可能会有一些反调试手段
但是web应用本身的接触底层的接口有限,所以反调试手法无非检测一些浏览器环境字段或者程序运行参数,直接在解包的js代码里修改patch即可