我有一个已编译的C ++控制台应用程序,它显示为一个小黑窗口。 现在我想反汇编应用程序并添加代码以隐藏进程启动。也许你可以帮我找到api电话,或者你能解释一下这是怎么回事。我目前使用的Debuger是OllyDBG,但我也熟悉IDA和WDASM32。
谢谢!
答案 0 :(得分:6)
有两种方法可以做到这一点。您可以执行代码注入以在创建窗口后隐藏窗口,也可以更改PE标头中定义的子系统。
PE头有一个标志,用于定义编译代码的子系统。目前为WINDOWS_CUI
,您希望将其更改为WINDOWS_GUI
。
要执行代码注入,请找到编解码器,然后在入口点(EP)将JMP
修补到此编解码器。在编解码器中,写下被JMP
覆盖的指令然后调用FreeConsole
然后JMP
回到你在EP上修补的JMP
之后的指令早。
让我举个例子。我在VC ++中编译了一个C程序:
#include <Windows.h>
int main() {
Sleep(INFINITE);
return 0;
}
如果我们在OllyDbg中打开结果二进制文件,我们会得到类似的结果:
按顶部的大M来获取存储器映射:
由于我们的主模块是Some_console_App,然后双击那里的PE标题,我们将其转到:
向下滚动一下以找到子系统:
如您所见,它设置为IMAGE_SUBSYSTEM_WINDOWS_CUI,定义为3.我们要将其设置为IMAGE_SUBSYSTEM_WINDOWS_GUI,即2.返回CPU窗口,在十六进制转储中,转到子系统标志设置的地址上。在这种情况下,它是0x0136013C:
选择要更改的字节,按Ctrl-E并将3更改为2.然后右键单击&gt;&gt;复制到可执行文件。在弹出的“文件”窗口中,右键单击并选择“保存文件”。
多田!完成。对不起,对于大分辨率的图片。