在逆向Electron程序时,当遇到控制台打不开,往往是因为以下几个原因:
1)程序监听了控制台的打开事件,当发现控制台打开,则立刻将其关闭;
2)程序在用BrowserWindow创建窗口时,配置了webPreferences中的devTools为false;
3)程序在打包时,去除了Electron的控制台功能模块。如果是第一种(通常是使用的是devtools-opened事件),可以通过解绑事件或移除相关代码的方式绕过;
如果是第二种,可以尝试顺着程序入口文件寻找窗口的devTools配置项,并修改它;
如果是第三种,通过添加修改JS脚本是无能为力的。那怎么检测一个程序是不是属于该情况呢?
检测的思路是:先抛开原程序,先将入口文件指向到一个新建文件上,新建文件里创建一个带控制台的窗口,然后通过观察程序运行后是否可以看到控制台来做判断。
1)解压app.asar后,在app文件夹中新建一个js文件并写入以下代码:
const { app, BrowserWindow } = require("electron");
//创建窗口
function createWindow () {
let mainWindow = new BrowserWindow({
title: "测试",
width: 670,
height: 420,
offscreen: true,
show: true,
titleBarStyle: "customButtonsOnHover",
backgroundColor: "#fff",
acceptFirstMouse: true, //是否允许单击页面来激活窗口
allowRunningInsecureContent: true,//允许一个 https 页面运行 http url 里的资源
webPreferences: {
devTools: true, //是否允许打开调试模式
webSecurity: false,//禁用安全策略
allowDisplayingInsecureContent: true,//允许一个使用 https的界面来展示由 http URLs 传过来的资源
allowRunningInsecureContent: true, //允许一个 https 页面运行 http url 里的资源
nodeIntegration: true//5.x以上版本,默认无法在渲染进程引入node模块,需要这里设置为true
}
});
mainWindow.loadURL('about:blank');
// 完成第一次绘制后显示
mainWindow.on('ready-to-show', () => {
mainWindow.webContents.openDevTools();
})
// 窗口关闭
mainWindow.on('closed', function () {
mainWindow = null
});
}
// 主进程准备好以后创建窗口
app.on('ready', () => {
createWindow();
});
2)打开app文件夹中的package.json文件,将入口(main)指向新建的js文件;
3)启动程序,看打开的窗口是否有控制台,若有,则说明程序内打包了控制台模块,若无,则说明没有打包。