【问题标题】:ASM Start Process hiddenASM 启动过程隐藏
【发布时间】:2011-10-29 17:46:33
【问题描述】:

我有一个已经编译好的 C++ 控制台应用程序,它显示为一个黑色的小窗口。 现在我想反汇编应用程序并添加代码以隐藏进程启动。也许你可以帮我找到 api 调用,或者你能解释一下它是如何工作的。我目前使用的调试器是 OllyDBG,但我也有 IDA 和 WDASM32 方面的知识。

谢谢转发!

【问题讨论】:

  • 使用 WinAPI SetWindowVisible 与控制台窗口句柄和参数为 false?
  • 我找不到 SetWindowVisible,我没有太多经验,但我仍然需要它,我想了解它是如何工作的,我搜索并发现 codeguru.com/forum/showthread.php?t=416781
  • 他可能指的是 ShowWindow 或 SetWindowPos。在您的示例中,SetWindowVisible 是一个调用 ShowWindow 的辅助函数。

标签: winapi console nasm masm disassembly


【解决方案1】:

有两种方法可以做到这一点。您可以在创建窗口后进行代码注入以隐藏窗口,也可以更改 PE 标头中定义的子系统。

PE 标头有一个标志,用于定义编译代码所针对的子系统。当前为WINDOWS_CUI,您想将其更改为WINDOWS_GUI

要进行代码注入,请找到一个 codecave,然后在此 codecave 的入口点 (EP) 处修补 JMP。在 codecave 中,写入被 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。然后右键单击 >> 复制到可执行文件。在弹出的文件窗口中,右键选择保存文件。

多田!完毕。抱歉,图片分辨率太大了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多