Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.23;
Скачать: CL | DM;

Вниз

Поток без длл или самодостаточный код   Найти похожие ветки 

 
Digitman ©   (2004-11-24 08:18) [80]


> Piter ©   (23.11.04 23:26) [78]


имелся ввиду не какой-то конкретный адрес, а то что в рамках одной и той же сессии ОС образ модуля kernel32 в АП всех использующих его приложениях будет находиться по одному и тому же адресу, поскольку как правило статически загружается одним из первых системных модулей, импортируемых win32-приложениями.


 
n0name   (2004-11-24 09:36) [81]

>Игорь Шевченко ©   (24.11.04 00:13) [79]
Спасибо за информацию, обязательно напишу.

>Digitman ©   (24.11.04 08:18) [80]
Вот именно, как правило :)
Win32-приложение может и не импортировать никаких функций из kernel32.dll, но он будет грузиться вторым(после ntdll.dll).


 
Digitman ©   (2004-11-24 10:37) [82]


> n0name   (24.11.04 09:36) [81]


> Win32-приложение может и не импортировать никаких функций
> из kernel32.dll


Нормальное (без выкрутасов с RET) win32-приложение импортирует из kernel32.dll как минимум одну ф-цию - ExitProcess(), поскольку в соответствии с док-цией Майкрософт вызов этой ф-ции есть предпочтительный способ нормального завершения процесса.


> будет грузиться вторым(после ntdll.dll)


ну и что ? предпочтительный адрес загрузки kernel32 выбран разработчиком ОС таким образом, что вынужденное изменение его системой в подавляющем большинстве не требуется. Особенно это касается НТ-платформы, где kernel32 грузится в верхние (системные) 2Гб АП процесса, куда при всем желании пользовательские модули загрузить (дабы вынудить систему "подвинуть" kernel32) не удастся. К тому же докум.загрузка пользов. PE-модулей осуществляется с пом. LoadLibrary(), которая опять же требует уже загруженной kernel32.
Так что вероятность изменения факт.адреска загрузки kernel32 по отношения к предпочтительному в НТ практически равна нулю. Она (такая вероятность), конечно же, больше нуля в Маздае, но с учетом того, что нормальные приложения грузят kernel32 первым модулем в цепочке требуемых к импорту, этой вероятностью опять же можно пренебречь.

В конечном итоге, ДАЖЕ если сомнения существуют, можно просканировать АП целевого процесса на предмет обнаружения какой-либо сигнатуры, идентифицирующей kernel32, и найдя таковую с учетом ее смещения отн-но начала образа получить фактический базовый адрес.


 
Игорь Шевченко ©   (2004-11-24 10:59) [83]

Digitman ©   (24.11.04 10:37) [82]


> Особенно это касается НТ-платформы, где kernel32 грузится
> в верхние (системные) 2Гб АП процесса, куда при всем желании
> пользовательские модули загрузить (дабы вынудить систему
> "подвинуть" kernel32) не удастся


Это ты с Win9x перепутал, извини.


> Так что вероятность изменения факт.адреска загрузки kernel32
> по отношения к предпочтительному в НТ практически равна
> нулю


Теоретически она тоже равна нулю, так как на фиксированные адреса в kernel32 ссылаются другие системные библиотеки. Про попытке запустить программу, которая в адресном пространстве занимает область kernel32.dll такая программа просто не запускается.


 
Digitman ©   (2004-11-24 11:04) [84]


> Игорь Шевченко ©   (24.11.04 10:59) [83]


да, точно, перепутал.
строго наоборот.


> Про попытке запустить программу, которая в адресном пространстве
> занимает область kernel32.dll такая программа просто не
> запускается


и анализ исх.текста это также подтверждает ?


 
Игорь Шевченко ©   (2004-11-24 11:30) [85]

Digitman ©   (24.11.04 11:04) [84]

Нет, исходный текст тут не причем, такая связь при импорте символов устанавливается, насколько мне известно. Опытным путем было установлено, что при попытке залезть в область адресов kernel32.dll программа не запускается из-за того, что kernel32.dll не может быть перемещена.


 
n0name   (2004-11-24 12:06) [86]

>Digitman ©   (24.11.04 10:37) [82]
На это (ExitProcess) я отвечу : ха!
Никаких извращений - NtTerminateProcess(DWORD(-1), 0).

Что насчёт загрузки кернела, то измени ImageBase в PE-заголовке  при компиляции на предпологаемый адрес кернела.

Загрузчик PE ВСЕГДА для Win32-приложений грузит kernel32.dll. Причём обязательно вторым по счету.


 
Digitman ©   (2004-11-24 13:16) [87]


> n0name   (24.11.04 12:06) [86]


> Никаких извращений - NtTerminateProcess


это ты - про НТ... а про маздайную линейку ?


> Причём обязательно вторым по счету


опять же - а для маздая кто будет первым ?


 
-SeM-   (2004-11-24 16:43) [88]

Digitman ©   (24.11.04 13:16) [87]

И на маздай то же - ха! Но для этого надо как-то узнать адрес загрузки кернел. Что и пытаюсь определить http://predskazanie-wunschpunsch.ru/view/4-1101201473/&web=1


 
Xaker ©   (2004-11-24 17:40) [89]

n0name   (24.11.04 12:06) [86]

> Что насчёт загрузки кернела, то измени ImageBase в
> PE-заголовке  при компиляции на предпологаемый адрес
> кернела.

Ошибка: Недопустимое перемещение системной DLL

- не хочет запускаться ..

самое интересное, что можно больше сделать и меньше - будет работать ...


 
Digitman ©   (2004-11-24 17:41) [90]


> -SeM-   (24.11.04 16:43) [88]


ХАкать я бы не посоветовал.


 
n0name   (2004-11-25 11:35) [91]

Digitman мне кажется что Win9X это анахроизм.
У меня его нет, и я не могу программировать под него.


 
Digitman ©   (2004-11-25 12:03) [92]


> -SeM-   (24.11.04 16:43) [88]
> для этого надо как-то узнать
> адрес загрузки кернел. Что и пытаюсь определить http://predskazanie-wunschpunsch.ru/view/4-1101201473/&web=1


в той ветке ты поехал в совершенно иной огород - создание KMD ..

никак не вяжется что-то поднятая тобой проблема определения адреса загрузки модуля kernel32 как модуля режима пользователя с программированием KMD, использующего модули и ф-ции именно режима ядра, но никак не режима пользователя ..


 
Digitman ©   (2004-11-25 12:09) [93]


> мне кажется что Win9X это анахроизм


ну наверно она, эта линейка ОС, потому маздайной и зовется, что изначально рождалась под флагом "Должна умереть") ... что ж, для тебя она уже умерла ... аминь)


 
-SeM-   (2004-11-25 12:21) [94]

Digitman ©   (25.11.04 12:03) [92]
Да нет, ты не правильно понял. Ответ там же.

n0name   (25.11.04 11:35) [91]
А ты, как программист, разве не должен учитывать то, что твоя прога может быть запущена на другой линейке ОС. Или ты предпочитаешь писать в реадми, что прога работает только на NT линейке?


 
n0name   (2004-11-25 14:03) [95]

Digitman ©   (25.11.04 12:09) [93]
-SeM-   (25.11.04 12:21) [94]
Как программист я должен учитывать эту возможность(есть же слабые компы). А как юзер давно простился с линейкой Win9X.
Но еа каждый хитрый болт есть своя хитрая гайка.
Что можно сделать в WinNT+ можно сделать и в Win9X. Вопрос в другом сколько займёт реализация...
Например в Win9X нет NativeAPI. Если хочешь реализуй нужную функцию сам.


 
n0name   (2004-11-25 14:03) [96]

Удалено модератором
Примечание: Дубль


 
Xaker ©   (2004-11-28 23:25) [97]

Остался вопрос, а как можно подправить стёа потока, чтобы он был "нормальным"  ?


 
n0name   (2004-11-30 10:33) [98]

Для чего тебе "подправлять" стек?


 
Xaker ©   (2004-11-30 13:24) [99]

n0name   (30.11.04 10:33) [98]
чтобы не выделялся ;))


 
Digitman ©   (2004-11-30 13:29) [100]


> Xaker ©   (30.11.04 13:24) [99]


размер стека трэда задается 2-м параметром при вызове ф-ций CreateThread/CreateRemoteThread


 
Xaker ©   (2004-11-30 14:24) [101]

Digitman ©   (30.11.04 13:29) [100]
ок, спасибо, постараюсь сделать его более "нормальным"  :))
- а что там лучше указывать ? - какое значение ?
- чтобя вообще не выделялся ?


 
TankMan ©   (2004-11-30 15:01) [102]

Прочитал я эту ветку...и у меня вопрос возник, вы всетаки хотите довести этот код до ~100% вероятности работоспособности или просто так спорите?


 
n0name   (2004-11-30 15:08) [103]

//TankMan ©   (30.11.04 15:01) [102]
Какой код?


 
TankMan ©   (2004-11-30 20:58) [104]

>>n0name
:)) Самый самый верхний :)


 
Piter ©   (2004-11-30 21:01) [105]

Xaker ©   (30.11.04 13:24) [99]

а чем выделяется стек потока трояна? Колись...


 
Xaker ©   (2004-11-30 23:14) [106]

TankMan ©   (30.11.04 15:01) [102]
код работает ..  улучшаем . :)

Piter ©   (30.11.04 21:01) [105]
я сам пока точно не выяснил...


 
n0name   (2004-12-01 10:52) [107]

Если ты про xGetModuleHandle и xGetProcAddress. Я сделал новую версию. В прошлых было несколько багов, теперь их нет.


 
Xaker ©   (2004-12-01 13:14) [108]

n0name   (01.12.04 10:52) [107]
выкладывай :))
потестим :)


 
n0name   (2004-12-01 13:47) [109]

unit xFuncs;

interface

uses
CommonTypes,
StrFuncs,
PETypes,
xTypes;

function xGetModuleHandle(ModuleName: PChar): HMODULE;
function xGetProcAddress(hMod: HMODULE; ProcName: PChar): Pointer;

implementation

var
LdrLockLoaderLock: function (Flags: DWORD; result, Magic: PDWORD): NTSTATUS; stdcall;
LdrUnlockLoaderLock: function (Flags, Magic: DWORD): NTSTATUS; stdcall;

function GetCurrentPEB: PPEB;
asm
mov eax, fs:[30h]
mov result, eax
end;

function xGetProcAddress(hMod: HMODULE; ProcName: PChar): Pointer;
var
ExportDir: PImageExportDirectory;
i, IndInAddr: DWORD;
begin
result:=nil;
ExportDir:=PImageExportDirectory(PImageNtHeaders(hMod+DWORD(PImageDosHeader(hMod).e_lfanew)).OptionalHeader.
 DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress+hMod);
for i:=0 to ExportDir.NumberOfNames-1 do
begin
 if ComparePCharStrings(PChar(PDWORD(DWORD(ExportDir.AddressOfNames)+hMod+i*4)^+hMod), ProcName) then
  begin
   IndInAddr:=PWORD(DWORD(ExportDir.AddressOfNameOrdinals)+hMod+i*2)^;
   result:=Pointer(PDWORD(DWORD(ExportDir.AddressOfFunctions)+hMod+IndInAddr*4)^+hMod);
  end;
end;
end;

function GetNtDLLHandle: HModule;
begin
result:=DWORD(PLdrDataTableEntry(PLdrDataTableEntry(GetCurrentPEB.Ldr.InLoadOrderModuleList.FLink)^.
 InLoadOrderLinks.Flink)^.DllBase);
end;

procedure InitAPI;
var
NtDLLHandle: THandle;
begin
NtDLLHandle:=GetNtDLLHandle;
@LdrLockLoaderLock:=xGetProcAddress(NtDLLHandle, "LdrLockLoaderLock");
@LdrUnlockLoaderLock:=xGetProcAddress(NtDLLHandle, "LdrUnlockLoaderLock");
end;

function xGetModuleHandle(ModuleName: PChar): HMODULE;
var
FirstMod: Pointer;
CurrentMod: TLdrDataTableEntry;
LdrLockMagic: DWORD;
begin
InitAPI;
result:=0;

LdrLockLoaderLock(0, nil, @LdrLockMagic);

FirstMod:=GetCurrentPEB.Ldr.InLoadOrderModuleList.FLink;
CurrentMod:=PLdrDataTableEntry(FirstMod)^;
repeat
 if FirstMod=CurrentMod.InLoadOrderLinks.FLink then
  exit;
 if CompareMultibyteWithAnsi(CurrentMod.BaseDllName.Buffer, ModuleName) then
  begin
   result:=DWORD(CurrentMod.DllBase);
   exit;
  end;
 CurrentMod:=PLdrDataTableEntry(CurrentMod.InLoadOrderLinks.Flink)^;
until (not true);

LdrUnlockLoaderLock(0, LdrLockMagic);
end;

end.


 
Игорь Шевченко ©   (2004-12-01 23:08) [110]

n0name   (01.12.04 13:47) [109]

Я бы тебе посоветовал переделать функции LdrLockLoaderLock и LdrUnlockLoaderLock

на


type
 TLdrLockLoaderLock: function (Flags: DWORD; Aresult, Magic: PDWORD): NTSTATUS; stdcall;
 TLdrUnlockLoaderLock: function (Flags, Magic: DWORD): NTSTATUS; stdcall;

var
 _LdrLockLoaderLock: TLdrLockLoaderLock;
 _LdrUnlockLoaderLock: TLdrUnlockLoaderLock;

procedure InitAPI;
var
NtDLLHandle: THandle;
begin
NtDLLHandle:=GetNtDLLHandle;
@_LdrLockLoaderLock:=xGetProcAddress(NtDLLHandle, "LdrLockLoaderLock");
@_LdrUnlockLoaderLock:=xGetProcAddress(NtDLLHandle, "LdrUnlockLoaderLock");
end;

function LdrLockLoaderLock (Flags: DWORD; Aresult, Magic: PDWORD): NTSTATUS; stdcall;
begin
 if Assigned(_LdrLockLoaderLock) then
   Result := _LdrLockLoaderLock (Flags, Aresult, Magic)
 else begin
   Result := NT_SUCCESS;
   EnterCriticalSection(CurrentPEB.LoaderLock);
 end;
end;

function LdrUnlockLoaderLock (Flags, Magic: DWORD): NTSTATUS; stdcall;
begin
 if Assigned(_LdrUnlockLoaderLock) then
   Result := _LdrUnlockLoaderLock (Flags, Magic)
 else begin
   Result := NT_SUCCESS;
   LeaveCriticalSection(CurrentPEB.LoaderLock);
 end;
end;


Причина в том, что функции блокировки загрузчика экспортируются из NTDLL только в WinXP, Win2003 и в LongHorn.


 
Xaker ©   (2004-12-05 02:21) [111]

Удалено модератором
Примечание: Создание пустых сообщений. Предупреждение тебе



Страницы: 1 2 3 вся ветка

Текущий архив: 2005.01.23;
Скачать: CL | DM;

Наверх




Память: 0.68 MB
Время: 0.031 c
1-1104858342
Sun bittern
2005-01-04 20:05
2005.01.23
WIN32_FIND_DATA (большой размер файла)


4-1102111892
Bobby Digital
2004-12-04 01:11
2005.01.23
Serial


14-1104571729
Сергей Г
2005-01-01 12:28
2005.01.23
Всех с новым годом!!!!


8-1097945501
Viper
2004-10-16 20:51
2005.01.23
Убрать ФОН


3-1103525704
denis24
2004-12-20 09:55
2005.01.23
редактирование в гриде