Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых)

 eXeL@B —› Программирование —› Написание NativeAPI - приложений
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 07 января 2007 08:54
· Личное сообщение · #1

Всё начилось с того, что решил перенести участок кода:

for(int i = 10; i >= 0; i--)
{
Sleep (1000);
printf ("Timer: %d second(s). ", i);
}
который на С++ в Win32 консольном приложении работает нормально, теперь переписываю на NativeAPI и столкнулся с проблемой:
Функция Sleep вызывает SleepEx, а она ZwDelayExecution(), так вот написав программу линкер говорит что функцию не знает хотя другие всё нормально (типа ZwCreateFile, ZwReadFile, ZwWriteFile ,ZwClose....). Короче проверил DDK, там её нет друзья говорят, что она недокументированна и её описания нет в DDK посоветовали попробовать вызвать её непосредственно из Ntdll.dll, в Windows-приложении типа так:

#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <winternl.h>

NTSTATUS (__stdcall *NtDelayExecution)(BOOL, const LARGE_INTEGER*);

int main()
{
LARGE_INTEGER la;

la.QuadPart = -10000000i64; // Пауза в 1 секунду
NtDelayExecution=(NTSTATUS (__stdcall *)(BOOL, const LARGE_INTEGER*)) GetProcAddress(GetModuleHandle("ntdll.dll"), "NtDelayExecution");

if(NtDelayExecution==NULL) MessageBox(NULL, "GetProcAddress() fail", "test", MB_OK);
else NtDelayExecution(FALSE, &la);
}

но я пишу NativeAPI приложение и использовать WinAPI не могу так же как и при разработке драйверов.
Кроме того ни NtGetProcAddress() ни NtGetModuleHandle() в Ntdll.dll и впомине нет, зато узнал, что часть экспортируемых функций из Ntdll.dll с префиксом Ldr - являются загрузчиками образа, например:

LdrGetDllHandle(
IN PWORD pwPath OPTIONAL,
IN PVOID Unused OPTIONAL,
IN PUNICODE_STRING ModuleFileName,
OUT PHANDLE pHModule );

LdrGetProcedureAddress(
IN HMODULE ModuleHandle,
IN PANSI_STRING FunctionName OPTIONAL,
IN WORD Oridinal OPTIONAL,
OUT PVOID *FunctionAddress );

LdrLoadDll(
IN PWCHAR PathToFile OPTIONAL,
IN ULONG Flags OPTIONAL,
IN PUNICODE_STRING ModuleFileName,
OUT PHANDLE ModuleHandle );

Не подскажите всё-таки возможно ли перенести данный участок простенького кода?

Другие функции Ldr из библиотеки Ntdll.dll
LdrAccessOutOfProcessResource
LdrAccessResource
LdrAddRefDll
LdrAlternateResourcesEnabled
LdrCreateOutOfProcessImage
LdrDestroyOutOfProcessImage
LdrDisableThreadCalloutsForDll
LdrEnumResources
LdrEnumerateLoadedModules
LdrFindCreateProcessManifest
LdrFindEntryForAddress
LdrFindResourceDirectory
LdrFindResourceEx
LdrFindResource
LdrFlushAlternateResourceModules
LdrGetDllHandle
LdrGetDllHandleEx
LdrGetProcedureAddress
LdrHotPatchRoutine
LdrInitShimEngineDynamic
LdrInitializeThunk
LdrLoadAlternateResourceModule
LdrLoadDll
LdrLockLoaderLock
LdrProcessRelocationBlock
LdrQueryImageFileExecutionOptions
LdrQueryProcessModuleInformation
LdrSetAppCompatDllRedirectionCallback
LdrSetDllManifestProber
LdrShutdownProcess
LdrShutdownThread
LdrUnloadAlternateResourceModule
LdrUnloadDll
LdrUnlockLoaderLock
LdrVerifyImageMatchesChecksum



Ранг: 5.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 января 2007 01:20
· Личное сообщение · #2

В VisualStudio сначала выставляю в проекте unsafe потом стандартно.

unsafe static void Main()
{
....
}
}



Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 08 января 2007 03:42
· Личное сообщение · #3

Ты что серьёзно в NatineAPI используешь printf() из стандартной библиотеки и Sleep(), при том, что приложение использует только функции из библиотеки Ntdll.dll



Ранг: 160.9 (ветеран), 1thx
Активность: 0.050
Статус: Участник

Создано: 08 января 2007 04:40
· Личное сообщение · #4

Ну так опиши эту функцию
ZwDelayExecution PROTO :DWORD,:DWORD вот так она выглядит в инклудах масма, на сколько я понял оба dword я вляются pFirst, pSecond



Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 08 января 2007 13:47
· Личное сообщение · #5

Не просто ты так просто говоришь об этом может она как-то должна быть связана с другими функциями ядра не знаю типа Ke.... Но всё равно Cigan спасибо!



Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 08 января 2007 13:52
· Личное сообщение · #6

Ну ладно а как насчёт функции printf - вместо неё я использовал:
//очень просто

UNICODE_STRING string;
RtlInitUnicodeString(&string, L"To skip disk checking, press any key within %d second(s). ");
NtDisplayString(&string);

но она поддерживает но - выдаёт ошибку

NtDisplayString(&string, i);//видимо нельзя как в printf

Подскажите другая функция, или вызвать по другому?




Ранг: 120.9 (ветеран), 5thx
Активность: 0.080
Статус: Участник
Programmer and reverser

Создано: 08 января 2007 14:39
· Личное сообщение · #7

может эта функция?
ZwDisplayString
ZwDisplayString displays a string.
NTSYSAPI
NTSTATUS
NTAPI
ZwDisplayString(IN PUNICODE_STRING String);
Parameters
String
Specifies a string to be displayed.
Return Value
Returns STATUS_SUCCESS or an error status,such as STATUS_PRIVILEGE_NOT_HELD
Related Win32 Functions
None.
Remarks
SeTcbPrivilege is required to display a string.
ZwDisplayString only displays the string if the HAL still owns the display driver takes ownership) or if a crash dump is in progress.

-----
Уважайте других и пишите грамотно.




Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 08 января 2007 15:38
· Личное сообщение · #8

Знаешь что NtCreateFile и ZwCreateFile одна и таже фигня, а различаются лишь тем, что первая - Native API функция вторая - альтернативный интерфейс Native API.
Тут надо либо другую либо может я вызываю не так ведь можно использовать и и не думаю, что разработчики стали бы так делать. Executioner как думаешь?




Ранг: 209.1 (наставник)
Активность: 0.130
Статус: Участник
программист априори

Создано: 08 января 2007 20:07
· Личное сообщение · #9

посмотри может это пригодиться - austin.youareinferior.net/books/Windows%20NT%202000%20Native%20API%20Reference.pdf




Ранг: 104.1 (ветеран)
Активность: 0.070
Статус: Участник
искатель истЕны

Создано: 08 января 2007 21:29
· Личное сообщение · #10

Заодно кто-нибудь обьясните мне сокральный смысл писать чисто на NativeApi. Я еще пойму необходимость писать без crt, но на нативе....




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 08 января 2007 22:02 · Поправил: HoBleen
· Личное сообщение · #11

sxd пишет:
Ну ладно а как насчёт функции printf - вместо неё я использовал:

Попробуй сначала sprintf (он же вроде чисто алгоритмический), а потом NtDisplayString.

Paxan пишет:
кто-нибудь обьясните мне сокральный смысл писать чисто на NativeApi.

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




Ранг: 104.1 (ветеран)
Активность: 0.070
Статус: Участник
искатель истЕны

Создано: 09 января 2007 03:24
· Личное сообщение · #12

HoBleen
понял, на канале подробнее обьяснили



Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 09 января 2007 04:54
· Личное сообщение · #13

Кстати HoBleen ты может весьма прав, я юзаю функцию strlen() из стандартной библиотеки может эта и прокатит - Спасибо весьма ценный совет, щас проверю.
А по поводу NtDelayExecution() не подскажешь. А то BSOD уже надоел...
)




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 09 января 2007 05:01
· Личное сообщение · #14

sxd
NTSYSAPI NTSTATUS NTAPI NtDelayExecution( IN BOOLEAN Alertable,
IN PLARGE_INTEGER DelayInterval );

Alertable
If set, thread become alertable, that means execute all APC in thread's APC Queue.

DelayInterval
Delay in microseconds.



Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 09 января 2007 06:35
· Личное сообщение · #15

Да это я и так знаю... Скажи как в проге её вызвать в DDK её описания нет (она недокументированна)... А описать так:
NTSYSAPI NTSTATUS NTAPI NtDelayExecution( IN BOOLEAN Alertable, IN PLARGE_INTEGER DelayInterval );

Линкер выдаёт ошибку!




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 09 января 2007 07:06 · Поправил: HoBleen
· Личное сообщение · #16

ntdll.lib подключил?

__declspec(dllimport) еще добавить надо - ты ж ее импортируешь



Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 09 января 2007 10:42
· Личное сообщение · #17

Не Ntdll.lib я подключил, а по второму
__declspec(dllimport) NTSTATUS NtDelayExecution( IN BOOLEAN Alertable, IN PLARGE_INTEGER DelayInterval );

вызываю NtDelayExecution(FALSE, 5000);
Чего тут неправильно - не пойму!




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 09 января 2007 11:37
· Личное сообщение · #18

Где у тебя возникает BSOD и с каким кодом?



Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 09 января 2007 13:51
· Личное сообщение · #19

HoBleen у меня тут косяк вышел всё нормально, компилирует код:

__declspec(dllimport) NTAPI NtDelayExecution( IN BOOLEAN Alertable, IN PLARGE_INTEGER DelayInterval );

for(i = 0; i < 10; i++)
{
NtDelayExecution(FALSE, 5000);
sprintf (&string, "Timer %d second(s). ", i);
NtDisplayString(&string);
}
Этот код, но на экране нет нифига! ТОбишь Всё без ошибок, но не пашет ни задержки ни вывода секунд нет! Может из-за NtDisplayString, обычно используют так:

UNICODE_STRING string;
RtlInitUnicodeString(&string, L" HELLO WORLD!");
NtDisplayString(&string);

но тогда возврат каретки теряет смысл!



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 10 января 2007 07:13
· Личное сообщение · #20

Держи текст самого Марка Руссиновича.
Основная ошибка - в нативе вход не main, а
// Instead of a 'main' or 'winmain', NT applications are entered via
// this entry point.
//
//-------------------------------------------------------------------- --
void NtProcessStartup( PSTARTUP_ARGUMENT Argument )
{
RTL_HEAP_DEFINITION heapParams;


5cdf_10.01.2007_CRACKLAB.rU.tgz - native.zip



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 10 января 2007 07:19
· Личное сообщение · #21

Кстати, наверно не случайно строка создается в heap, а не в памяти процесса ?!




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 10 января 2007 08:49
· Личное сообщение · #22

sxd пишет:
sprintf (&string, "Timer %d second(s). ", i);
NtDisplayString(&string);

Дык параметр - юникодовская строка, а не массив char'ов.
А про то, где она создается - могу предположить, что например при копировании UNICODE_STRING новая строка будет указывать на тот же буфер. Для сохранности она размещается вдали от инициализационных данных. ИМХО.

Еще мб поможет -
Warning: Trying to display string without previously switch to text-mode results as system hang.



Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 10 января 2007 13:20
· Личное сообщение · #23

tundra37 написал:
Основная ошибка - в нативе вход не main, а
// Instead of a 'main' or 'winmain', NT applications are entered via
// this entry point.
//
//-------------------------------------------------------------------- --
void NtProcessStartup( PSTARTUP_ARGUMENT Argument )
{
RTL_HEAP_DEFINITION heapParams;


какой от этого смысл? Ну а если я так напишу ошибки то нет и тоже работает:

#pragma comment(linker, "/SUBSYSTEM:NATIVE")
#pragma comment(lib, "ntdll.lib")
#pragma comment(linker, "/ENTRY:NativeMain")
#pragma comment(linker,"/BASE:0x00010000")

#define _X86_

#include "ntddk.h"
#include "nt.h"

void NativeMain (PVOID arg)
{
NtTerminateProcess( NtCurrentProcess(), 0 );
}


Какая разница?

HoBleen написал:

Так по поводу строки?




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 10 января 2007 20:28
· Личное сообщение · #24

sxd пишет:
Так по поводу строки?

Юзай
UNICODE_STRING string;
RtlInitUnicodeString(&string, L" HELLO WORLD!");
NtDisplayString(&string);

а про
sxd пишет:
но тогда возврат каретки теряет смысл!

Не очень понял, поясни



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 11 января 2007 03:11
· Личное сообщение · #25

sxd пишет:
Так по поводу строки?

Так посмотрел бы текст :
PWCHAR stringBuffer, argPtr;
UNICODE_STRING helloWorld;
........................................

stringBuffer = RtlAllocateHeap( Heap, 0, 256 );
swprintf( stringBuffer, L" %s", argPtr );
helloWorld.Buffer = stringBuffer;
helloWorld.Length = wcslen( stringBuffer ) * sizeof(WCHAR);
helloWorld.MaximumLength = helloWorld.Length + sizeof(WCHAR);
NtDisplayString( &helloWorld );
=======================
По поводу входа - наверно просто это стандартное имя - тут я согласен, что все равно.
heap тоже вроде не по делу - можно и в проге зарезервировать. Но вот строка специфическая - там указатель, а не сама строка.




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 11 января 2007 07:06
· Личное сообщение · #26

tundra37 пишет:
По поводу входа - наверно просто это стандартное имя - тут я согласен, что все равно.

Угу, это просто инфа о ЕР для линкера - ничего больше.

tundra37 пишет:
heap тоже вроде не по делу - можно и в проге зарезервировать.

Скорее всего не важно, но для точности нужно посмотреть в доки. Только вот у меня про найтив практически нету литературы. Кто найдет - отпоститесь, пожалуйста.

tundra37 пишет:
Но вот строка специфическая - там указатель, а не сама строка.

Про них все доходчиво написано в Солдатове "Программирование драйверов Windows" - wingman.org.ru/books/files/C/Soldatov_-_Drivers_for_Windows(RUS).rar



Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 11 января 2007 11:21
· Личное сообщение · #27

tundra37 пишет:
По поводу входа - наверно просто это стандартное имя - тут я согласен, что все равно.
Угу, это просто инфа о ЕР для линкера - ничего больше.

Да и в экзешнике места пустого просто жуть размер которого возрастает до 7 кб, что-то наподобе
PE-заголовка, тогда как если не страдать такой хренью размер 2 кб. Да и компилить в VC++ намного
удобнее.

NtDisplayString() - проблема, вообще я попробовал, так:

UNICODE_STRING str;
for(i = 0; i < 10; i++)
{
RtlInitUnicodeString(&string, L"Timer %d%% second(s). ", i);//типа как в printf()
NtDisplayString(&str, i);
}

Вообще код скомпилило и при выводе такое ощущение, что возврат каретки действует, тобишь строку выводит и она видно как бы дёргается обновляется но вот выводит:
Timer %d%% second(s). Походу дела спецификаторы вида %d - неподдерживается или пора пиво бросить
)
Почему так?




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 11 января 2007 12:01
· Личное сообщение · #28

sxd пишет:
Вообще код скомпилило и при выводе такое ощущение, что возврат каретки действует

Извини, но в упор не вижу перевода каретки.

sxd пишет:
Походу дела спецификаторы вида %d - неподдерживается или пора пиво бросить

Не поддерфивается - почитай Солдатова - ссылка выше. Думаю надо использовать (w)sprintf.



Ранг: 36.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 11 января 2007 12:08
· Личное сообщение · #29

Блин, HoBleen извини вот поправил:

UNICODE_STRING str;
for(i = 0; i < 10; i++)
{
RtlInitUnicodeString(&string, L"Timer %d%% second(s). ", i);//типа как в printf()
NtDisplayString(&str, i);
}

Не поддерфивается - почитай Солдатова - ссылка выше. Думаю надо использовать (w)sprintf.
wsprintf() - виндовая функция (API) использовать нельзя, sprintf() можно, а какие примерные соображения по поводу этой функции?




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 11 января 2007 12:14
· Личное сообщение · #30

Гы) обратный слеш низзя постить =)))

sxd пишет:
wsprintf() - виндовая функция (API) использовать нельзя, sprintf() можно, а какие примерные соображения по поводу этой функции?

Ну если не ошибаюсь она линкуется со всей библой си (по умолчанию).
А по использованию - что типа

sprintf(szStr, "lalala%d%d", x, y);
Дальше по этой sz char формируешь ANSI_STRING, из нее - UNICODE_STRING
(Это можно если, как ты говоришь, через sprintf - без w)


. 1 . 2 . >>
 eXeL@B —› Программирование —› Написание NativeAPI - приложений
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати