Есть два способа сделать это.Вы можете выполнить внедрение кода, чтобы скрыть окно после его создания, или изменить подсистему, определенную в заголовке PE.
В заголовке PE есть флаг, определяющий подсистему, с которой был скомпилирован код.В настоящее время это будет WINDOWS_CUI
, и вы хотите изменить его на WINDOWS_GUI
.
. Чтобы выполнить внедрение кода, найдите кодовую пещеру, а затем подключите JMP
в точке входа (EP) к этой кодовой пещере.В кодовой пещере напишите инструкцию, которая была перезаписана JMP
, затем выполните вызов FreeConsole
, затем JMP
, чтобы вернуться к инструкции после JMP
, который вы исправили в EP ранее.
Позвольте привести пример.Я скомпилировал C-программу на VC ++:
#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. Затем щелкните правой кнопкой мыши >> Копировать в исполняемый файл,В открывшемся окне «Файл» щелкните правой кнопкой мыши и выберите «Сохранить файл».
Tada!Готово.Извините за большие разрешения фотографий.