Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #82, ОКТЯБРЬ 2005 г.

Родные приложения

Николай «gorl» Андреев

Хакер, номер #082, стр. 082-114-6


Другой вариант – это написать небольшой код специально для регистрации нашего приложения. У меня на это нехитрое дело ушло 5 минут.

BOOL RegistryAdd(PSTR szAppName)

{

char szRegEntry[1024];

DWORD dwBytes = 1024;

BOOL ret = FALSE;

HKEY hk;

char szKeyPath = "SYSTEM\\CurrentControlSet\\Control\\Session Manager";

// открываем ключик

if (RegCreateKey(HKEY_LOCAL_MACHINE, szKeyPath, &hk) != ERROR_SUCCESS)

return 0;

// скидываем все данные в буфер

if(RegQueryValueEx(hk, "BootExecute",

0,0, (LPBYTE)szRegEntry, &dwBytes))

szRegEntry[0] = 0;

// добавляем к буферу свою строчку

lstrcat(&szRegEntry[dwBytes-1], szAppName);

if (RegSetValueEx(hk, "BootExecute", 0, REG_MULTI_SZ,

(LPBYTE) szRegEntry, dwBytes + lstrlen(szAppName) + 1))

goto finally;

ret = TRUE;

finally: {

// закрываем ключик

if (hk) RegCloseKey(hk);

}

return ret;

}

[оригинальный helloworld]

/*

Немного измененный мной код Марка Руссиновича,

копирующий параметры запуска в кучу и выводящий их

на экран. Может быть полезен для улучшения понимания

работы с кучей и строками с помощью native API.

*/

#pragma comment(linker, "/SUBSYSTEM:NATIVE")

#pragma comment(linker, "/ENTRY:native_main")

#pragma comment(lib, "ntdll.lib")

#pragma comment(linker,"/BASE:0x00010000")

#define _X86_

#include gt;

#include gt;

#include "nt.h"

typedef struct {

ULONG Unknown[21];

UNICODE_STRING CommandLine;

UNICODE_STRING ImageFile;

} ENVIRONMENT_INFORMATION, *PENVIRONMENT_INFORMATION;

typedef struct {

ULONG Unknown[3];

PENVIRONMENT_INFORMATION Environment;

} STARTUP_ARGUMENT, *PSTARTUP_ARGUMENT;

typedef struct {

ULONG Length;

ULONG Unknown[11];

} RTL_HEAP_DEFINITION, *PRTL_HEAP_DEFINITION;

void native_main(PSTARTUP_ARGUMENT Argument)

{

PUNICODE_STRING commandLine;

PWCHAR stringBuffer, argPtr;

UNICODE_STRING helloWorld;

RTL_HEAP_DEFINITION heapParams;

memset(&heapParams, 0, sizeof(RTL_HEAP_DEFINITION));

heapParams.Length = sizeof( RTL_HEAP_DEFINITION);

Heap = RtlCreateHeap(2, 0, 0x100000, 0x1000, 0, &heapParams);

commandLine = &Argument->gt;Environment->gt;CommandLine;

argPtr = commandLine->gt;Buffer;

while( *argPtr != L' ' ) argPtr++;

argPtr++;

stringBuffer = RtlAllocateHeap( Heap, 0, 256 );

swprintf(stringBuffer, L"\n%s", argPtr);

helloWorld.Buffer = stringBuffer;

helloWorld.Length = wcslen(stringBuffer) * sizeof(WCHAR);

helloWorld.MaximumLength = helloWorld.Length + sizeof(WCHAR);

NtDisplayString(&helloWorld);

RtlFreeHeap(Heap, 0, stringBuffer);

NtTerminateProcess(NtCurrentProcess(), 0);

}

WWW

На английском языке о разработке native-приложений ты можешь прочесть на www.sysinternals.com в статье «Inside Native Applications», датированной аж 98ым годом.

INFO

Чтобы реализовать ввод данных с клавиатуры в нашем приложении придется уже поизвращаться: открыть NtCreateFile’ом драйвер клавиатуры (\\Device\\KeyboardClass), привязать к нему NtCreateEvent’ом событие и т.д. и т.п. – механизм всего этого дела тебе придется изучать самому, уродуя дизассемблером autochk.exe.

Назад на стр. 082-114-5  Содержание  Вперед на стр. 082-114-7