2013-03-30 3 views
2

Я работаю над этим кодом часами, и это сводит меня с ума!Создание процесса в памяти C++

Весь источник здесь http://pastebin.com/Urxh68W4, но я уверен, что знаю проблему.

extern "C" NTSYSAPI LONG NTAPI ZwUnmapViewOfSection(HANDLE, PVOID); 

Когда я запускаю его я получаю следующее сообщение об ошибке:

Error 1 error LNK2019: unresolved external symbol [email protected] referenced in function [email protected] 

Я предполагаю, что есть некоторые DLL или библиотеки я должен быть в том числе и поэтому я добавил Ntoskrnl.lib в мой проект, потому что ему содержит функцию ZwUnmapViewOfSection.

У меня нет абсолютно никакой идеи, что делать. Должен ли я использовать Ntdll.dll? Если да, то как мне связать DLL? Я думал, что вы можете использовать библиотеки только в Visual Studio 2010.

Также, что такое NTSYSAPI и NTAPI? В сети практически нет информации.

Любая помощь была бы высоко оценена!

+0

Скорее всего, это соглашение о вызове, а другое - спецификация экспорта. – chris

+0

Можете ли вы уточнить? Вы немного расплывчаты. –

+0

Похоже, вы пытаетесь использовать функцию из API режима ядра (для драйверов) в программе пользовательского режима. Они не идут вместе. Если вы хотите получить информацию о API-интерфейсе ядра, получите WDK (комплект драйверов Windows). – rhashimoto

ответ

5

Это похоже на код режима пользователя, поэтому вам вряд ли захочется ссылаться на ntoskrnl.lib. Вы скорее свяжетесь с ntdll.

Способ, которым я, вероятно, сделаю это, - использовать динамическую ссылку и позвонить GetProcAddress, переходя в HANDLE в ntdll.dll и ZwUnmapViewOfSection.

Пример кода:

typedef LONG (NTAPI *pfnZwUnmapViewOfSection)(HANDLE, PVOID); 
HMODULE hMod = GetModuleHandle("ntdll.dll"); 
pfnZwUnmapViewOfSection pZwUnmapViewOfSection= (pfnZwUnmapViewOfSection)GetProcAddress(hMod, "ZwUnmapViewOfSection"); 

Я не компилируется, но это должно выглядеть примерно так, что (возможно, добавить некоторые проверки ошибок и т.д.).

Что касается ваших других вопросов: NTAPI - это макрос, который определяет соглашение о вызове, в данном случае __stdcall. calling convention связан с тем, как передаются аргументы функции, и кто будет очищать эти аргументы.

Например, __stdcall требует, чтобы аргументы были сдвинуты в стек в обратном порядке, и вызывающая сторона очистит стек.

Аналогичным образом NTSYSAPI - это макрос, который только разрешает __declspec(dllimport), если я правильно помню.

Кроме того, я должен указать, что вызывающие функции, экспортируемые NtDll в пользовательском режиме, обычно не одобряются. И код, который вы пишете, также будет иметь дополнительные проблемы на этом пути (даже после того, как он будет работать).

Если вы ищете другой пример кода, который выполняет очень похожую задачу с тем, который вы пишете, вы можете проверить here. Это была техника, используемая вредоносным ПО Duqu. Удачи!

+0

«если я правильно помню». LOL серьезно? Вы просто знаете эти вещи с головы? Вот почему я так люблю, есть так много замечательных программистов. Мои папы программы в VB.NET, поэтому он никогда не сможет помочь мне с C++ DX –

+0

Np man, рад, что я мог бы помочь. И будьте осторожны с этим кодом памяти. ;) – mrduclaw

Смежные вопросы