hex.pp.ua

Заготовка Native API-приложения

Сборка Native API-приложения в Visual Studio 2010




Разработка Native API приложений обычно происходит с помощью компилятора, входящего в состав Windows Driver Kit (WDK). Однако, можно обойтись и без WDK. Visual Studio тоже способна создавать приложения, не требующие функционирования подсистемы Win32 для запуска.

Здесь я покажу, как можно создать простое Native-приложение в Visual Studio. Для этого понадобится сама Visual Studio, заголовочные файлы NDK и файл ntdll.lib, который придётся достать (из WDK или ещё откуда-нибудь).

Настройка проекта Visual Studio

В Visual Studio нужно создать новый проект — консольное приложение. Это оптимальный тип проекта для переделки в Native-приложение. В каталог с проектом или в иное место нужно положить заголовочные файлы (каталог ndk). В настройках проекта во вкладке «Свойства конфигурации › Каталоги VC++» нужно добавить путь к NDK в пункт «Каталоги включения», и путь к ntdll.lib в пункте «Каталоги библиотек».

Каталоги

Запуск Native-приложения в отладчике Visual Studio, да и вообще, при работающей системе невозможен. Так что сразу можно выбирать тип сборки проекта «Release».

На вкладке «C/C++ › Создание кода» нужно отключить проверку переполнения буфера (опция должна быть выставлена в /GS-). Если этого не сделать, то при сборке Native-приложения возникнет ошибка:

1>native_stub.obj : error LNK2001: неразрешенный внешний символ "@[email protected]"
проверка переполнения буфера

На вкладке «Компоновщик › Ввод» в пункте «Дополнительные зависимости» нужно убрать всё, что содержится в нём и добавить только одну зависимость: ntdll.lib. В пункте «Игнорировать все стандартные библиотеки» нужно выбрать «Да». Native-приложение не может позволить себе иметь зависимость от других библиотек, кроме ntdll, по причине того, что все остальные библиотеки рассчитаны на работу в рамках подсистемы Win32. Native-приложение работает вне этой системы.

зависимость ntdll

На вкладке «Компоновщик › Система» в пункте «Подсистема» нужно выбрать «Машинный код (/SUBSYSTEM:NATIVE)».

подсистема native

На вкладке «Компоновщик › Дополнительно» в пункте «Точка входа» нужно написать NtProcessStartup. Именно так обычно называется точка входа в Native-приложение, а не main и не WinMain. В исходном тексте, который создала Visual Studio для нашего проекта нужно убрать сгенерированную ей точку входа и написать свою. Об этом ниже. В пункте «Базовый адрес» нужно написать «0x00010000».

точка входа

На этом настройка проекта завершена.

Точка входа Native-приложения

В файле native_stub.cpp, являющимся главным файлом проекта, должна содержаться точка входа, прописанная ранее в настройках проекта. Нужно удалить сгенерированную точку входа main и написать свою, под именем NtProcessStartup:

void NtProcessStartup(void* StartupArgument) 
{ 
  UNICODE_STRING str; 
  PPEB pPeb = (PPEB)StartupArgument; 
  RtlNormalizeProcessParams(pPeb->ProcessParameters); 
  
  RtlInitUnicodeString(&str, L"Hello, world!\nCommand line is: ");
  NtDisplayString(&str);
  RtlInitUnicodeString(&str, pPeb->ProcessParameters->CommandLine.Buffer);
  NtDisplayString(&str);
  
  NtTerminateProcess(NtCurrentProcess(), 0);
}

Программа выводит «Hello, world!», показывает содержимое своей командной строки и завершает своё выполнение вызовом NtTerminateProcess.

Заголовочный файл проекта

В stdafx.h нужно написать следующее:

#pragma once

#define WIN32_NO_STATUS

#include <windows.h>
#include <ntndk.h>

Запуск

подсистема native

В результате сборки проекта получается файл native_stub.exe размером 2048 байт (2 Кб). Антивирус Avira ошибочно считает его руткитом (TR/Rootkit.Gen), хотя файл не содержит ничего, кроме вывода своей командной строки на экран. Если посмотреть заголовок PE в программе PE Tools, видно, что exe-файл имеет подсистему Native.

Запуск файла возможен стандартным для Native-приложений способом: через ключ реестра BootExecute. Но лучше запускать файл из-под Native Shell. В командной строке Native Shell есть время увидеть, что программа выводит на экран. Оттуда можно запустить программу несколько раз, меняя командную строку. Будет видно, как программа правильно выводит содержимое своей командной строки. Для запуска программы из Native Shell нужно ввести в его командной строке имя исполняемого файла: native_stub.exe (в команде запуска должно присутствовать расширение .exe). Предварительно нужно в Native Shell перейти в тот каталог, где лежит файл.

запуск native-приложения

Приложение native-stub может послужить заготовкой для разработки более сложных приложений, способных запускаться в режиме синего экрана. В архиве native-stub.zip лежит исполняемый файл native_stub.exe и проект приложения для Visual Studio 2010.

Скачать заготовку native-stub



Автор: амдф
Дата: 06 ноября 2011


При копировании материалов хорошим тоном будет указание авторства и ссылка на сайт. По поводу рекламы обращайтесь на почту [email protected]