Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Вниз

CreateRemoteThread???   Найти похожие ветки 

 
volser   (2005-01-20 19:21) [0]

Мне нужно запустить поток в чужом процесе.

Как работать с функцией
CreateRemoteThread(hProcess,nil, 0,  @myProc, nil, 0,ThreadID)

myProc - доступна только в моем адресном пространстве. Как сделать так что бы она была доступна и в hProcess?


 
Kerk ©   (2005-01-20 19:40) [1]

Где-то тут Казанова пробегал.. :)))


 
VMcL ©   (2005-01-20 20:20) [2]

>>volser  (20.01.05 19:21)

>myProc - доступна только в моем адресном пространстве. Как сделать так что бы она была доступна и в hProcess?

Переписать её в ВАП целевого пространства.


 
VMcL ©   (2005-01-20 20:22) [3]

>Переписать её в ВАП целевого пространства.

Читать: "Переписать её в ВАП целевого процесса."


 
volser   (2005-01-20 20:24) [4]

VMcl
А как это сделать?


 
Piter ©   (2005-01-20 20:25) [5]

VMcL ©   (20.01.05 20:22) [3]

А как можно определить "длину" функции?


 
kaZaNoVa ©   (2005-01-20 20:41) [6]

Kerk ©   (20.01.05 19:40) [1]
я вернулся))
//моя тема ...  ну как же без меня и нет тем более ответа по сабжу ..

program loader;
uses
 Windows,Tlhelp32;

function SetDebugPriv: Boolean;
var
Token: THandle;
tkp: TTokenPrivileges;
begin
Result := false;
if OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then
begin
 if LookupPrivilegeValue(nil, PChar("SeDebugPrivilege"), tkp.Privileges[0].Luid) then
 begin
   tkp.PrivilegeCount := 1;
   tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
   Result := AdjustTokenPrivileges(Token, false, tkp, 0, PTokenPrivileges(nil)^, PDWord(nil)^);
 end;
end;
end;

function Start(ProcessID: Cardinal; DllFileName: string): Boolean;
var
hProcess, hTh: THandle;
BytesWritten, ThreadID, DllNameLen: Cardinal;
LoadLibraryProc, MemPtr: Pointer;
ExitCode: DWord;
begin
Result := false;

SetDebugPriv();

hProcess := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE,true, ProcessID);

if hProcess <> 0 then
begin
 DllNameLen := Length(DllFileName) + 1;
 
 MemPtr := VirtualAllocEx(hProcess, nil, DllNameLen, MEM_COMMIT, PAGE_READWRITE);

 if MemPtr <> nil then
 begin
   if WriteProcessMemory(hProcess, MemPtr, PChar(DllFileName), DllNameLen, BytesWritten) then
   begin
     LoadLibraryProc := GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");

     hTh := CreateRemoteThread(hProcess, nil, 0, LoadLibraryProc, MemPtr, 0, ThreadID);

     if hTh <> 0 then
     begin
       if (WaitForSingleObject(hTh, INFINITE) = WAIT_OBJECT_0) and
         GetExitCodeThread(hTh, ExitCode) then
         Result := ExitCode <> 0;

       CloseHandle(hTh);
     end;
   end;

   VirtualFreeEx(hProcess, MemPtr, 0, MEM_RELEASE);
 end;

 CloseHandle(hProcess);
end;

end;

function UpperCase(const S: string): string;
var I : Integer;
begin
 Result := S;
 for I := 1 to Length( S ) do
   if Result[ I ] in [ "a".."z" ] then
      Dec( Result[ I ], 32 );
end;
               

var
ProcessID: Cardinal;
DllName,ppp: string;
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
ProcessID:=0;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);

ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) <> 0 do
 begin
ppp:=FProcessEntry32.szExeFile;
if (pos("EXPLORER.EXE",UpperCase(ppp))>0) then  ProcessID:=FProcessEntry32.th32ProcessID;
ContinueLoop := Process32Next(FSnapshotHandle,  FProcessEntry32);
 end;
CloseHandle(FSnapshotHandle);

DllName:="A:\Sys.dll";

if ProcessID <> 0 then Start(ProcessID, DllName);

end.


 
DeadMeat ©   (2005-01-20 20:44) [7]

А где библиотека? Которая самовыгружается... ;0)
Как же без нее?...

---
...Death Is Only The Begining...


 
kaZaNoVa ©   (2005-01-20 20:50) [8]

DeadMeat ©   (20.01.05 20:44) [7]
LOL

забыл


library Sys;

uses
Windows,Messages;

Var
 pi: TProcessInformation;
 si: TStartupInfo;
 id,ThreadID:cardinal;

function thread:integer; stdcall;
begin
thread:=0;
CreateThread(nil,0,GetProcAddress(GetModuleHandle("kernel32"),"FreeLibrary"),pointer(hInstance),0,id);
end;

begin
si.cb := SizeOf(si);

CreateProcess(nil, "cmd.exe", nil, nil, FALSE, 0, nil, nil, si, pi);

sleep(1);

CreateThread(nil,0,@Thread,nil,0,ThreadID);
end.


 
kaZaNoVa ©   (2005-01-20 20:53) [9]

VMcL ©   (20.01.05 20:20) [2]

> Переписать её в ВАП целевого пространства.

я давал и такой пример, "Поток без длл ..."
в кратце:

program loader;
{$IMAGEBASE $70000000}
uses
 Windows,Messages,Tlhelp32;

Var
hProcess, hTh: THandle;
MemPtr: Pointer;
PID,ExitCode,Size,BytesWritten,ThreadID: Cardinal;

ProcessID: Cardinal;
ppp: string;
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;

function SysErrorMessage(ErrorCode: Integer): string;
var
 Buffer: array[0..255] of Char;
var
 Len: Integer;
begin
 Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS or
   FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, ErrorCode, 0, Buffer,
   SizeOf(Buffer), nil);
 while (Len > 0) and (Buffer[Len - 1] in [ #0..#32, "."]) do Dec(Len);
 SetString(Result, Buffer, Len);
end;

function UpperCase(const S: string): string;
var I : Integer;
begin
 Result := S;
 for I := 1 to Length( S ) do
   if Result[ I ] in [ "a".."z" ] then
      Dec( Result[ I ], 32 );
end;

function SetDebugPriv: Boolean;
var
Token: THandle;
tkp: TTokenPrivileges;
begin
Result := false;
if OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then
begin
 if LookupPrivilegeValue(nil, PChar("SeDebugPrivilege"), tkp.Privileges[0].Luid) then
 begin
   tkp.PrivilegeCount := 1;
   tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
   Result := AdjustTokenPrivileges(Token, false, tkp, 0, PTokenPrivileges(nil)^, PDWord(nil)^);
 end;
end;
end;

function ThreadF1(dwEntryPoint: Pointer): longword; stdcall;
Var t:Tpoint;
begin
LoadLibrary("kernel32.dll");
LoadLibrary("user32.dll");
while true do   begin
GetCursorPos(t);
if (t.X<2) and (t.Y<2) then break;
sleep(150);
Windows.Beep(175,100);
end;
Result:=0;
end;

function Main1(dwEntryPoint: Pointer): longword; stdcall;
begin
CreateThread(nil,0,@ThreadF1,dwEntryPoint,0,ThreadID);
Result:=0;
end;

Procedure Podgotovka;
Begin
ProcessID:=0;

SetDebugPriv;

FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);

ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) <> 0 do
 begin
ppp:=FProcessEntry32.szExeFile;
if (pos("EXPLORER.EXE",UpperCase(ppp))>0) then  //WINLOGON
ProcessID:=FProcessEntry32.th32ProcessID;
ContinueLoop := Process32Next(FSnapshotHandle,  FProcessEntry32);
 end;
CloseHandle(FSnapshotHandle);
End;

begin
Podgotovka;
//GetWindowThreadProcessId(FindWindow("Progman", nil), @PID);
PID:=ProcessID;
if PID = 0 then Exit;

MemPtr:= Pointer(GetModuleHandle(nil));

Size := PImageOptionalHeader(Pointer(integer(MemPtr) + PImageDosHeader(MemPtr)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;

hProcess := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE,true,PID);

if hProcess = 0 then Exit;

BytesWritten:=0;
VirtualFreeEx(hProcess,MemPtr, 0, MEM_RELEASE);
 MemPtr := VirtualAllocEx(hProcess,MemPtr, Size , MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE );

 if MemPtr <> nil then
 begin
   if WriteProcessMemory(hProcess, MemPtr,MemPtr, Size, BytesWritten) then
   begin
   hTh := CreateRemoteThread(hProcess, nil, 0,@Main1,MemPtr, 0, ThreadID);
     if hTh <> 0 then
     begin
       if (WaitForSingleObject(hTh,INFINITE) = WAIT_OBJECT_0) and
         GetExitCodeThread(hTh, ExitCode) then CloseHandle(hTh);
     end;
   end ;
 //  VirtualFreeEx(hProcess, MemPtr, 0, MEM_RELEASE);  //?
 end;
 CloseHandle(hProcess);
end.


 
volser   (2005-01-20 21:32) [10]


> kaZaNoVa ©

Много текста, но ничего не понятно.
Можешь принципиально объяснить, что мне нужно сделать.

У меня есть
1) hProcess
2) function MyProc(dwEntryPoint: Pointer): longword; stdcall;

Как мне MyProc запустить в hProcess.
Когда я делаю просто
CreateRemoteThread(hProcess,nil, 0,  @myProc, nil, 0,ThreadID)
то вылетает Access Violation.

Параметры функции мне не нужны.


 
volser   (2005-01-20 21:33) [11]

Что делает function SetDebugPriv?


 
volser   (2005-01-20 21:58) [12]

как узнать size процедуры?


 
kaZaNoVa ©   (2005-01-20 22:01) [13]

volser   (20.01.05 21:32) [10]
мой первый пример внедряет ДЛЛ


> Как мне MyProc запустить в hProcess.

это очень непросто

volser   (20.01.05 21:33) [11]

> Что делает function SetDebugPriv?

даёт тебе отладочные права


> как узнать size процедуры?

спроси что-нить полегче ...


 
kaZaNoVa ©   (2005-01-20 22:02) [14]

volser   (20.01.05 21:32) [10]

> Как мне MyProc запустить в hProcess.

нечто-подобное - смотри [9]


 
GuAV ©   (2005-01-20 22:45) [15]


> > как узнать size процедуры?

Вычесть её адрес из адреса следующей процедуры, это будет size процедуры + size of align.


 
volser   (2005-01-20 22:50) [16]

А где гарантия что они идут подряд


 
GuAV ©   (2005-01-20 22:52) [17]

volser   (20.01.05 22:50) [16]

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


 
volser   (2005-01-20 22:54) [18]

Я сделал
 
MemPtr := VirtualAllocEx(hProcess,nil, TESTSIZE , MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE );

 WriteProcessMemory(hProcess, MemPtr,@MyProc, TESTSIZE, BytesWritten);


где TESTSIZE гарантированые размеры функции.
если функцию пустая, то все работает нормально, а если обращатся к свои локальным процедурам или вызывать какие нибудь функции, то вылетает AV.
Как сделать возможным вызывать какие либо функции, хотя бы loadlibrary и т.д.?


 
volser   (2005-01-20 23:03) [19]


> kaZaNoVa ©

И в каком процессе запускается поток в [9]?


 
kaZaNoVa ©   (2005-01-20 23:05) [20]

volser   (20.01.05 23:03) [19]
пример работает?
//если что-то будет "пищать", просьба не пинать)))

строчку if (pos("EXPLORER.EXE",UpperCase(ppp))>0) then   видел? - там и ответ)


 
GuAV ©   (2005-01-20 23:08) [21]

volser   (20.01.05 22:54) [18]

Если локальные функции помещены в целевое АП, то для них нужно находить новый адрес и ставить его в месте вызова (т.е. то же что делает ОС при relocation).

Вызвать внешние функции можно без обращения к таблице импорта, зарание получив их адрес в АП целевого процесса. Некоторые системные dll всегда загружаются по тем же адресам, поэтому для их функций адрес в целевом и своём процессе совпадают. так и для loadlibrary.


 
kaZaNoVa ©   (2005-01-20 23:14) [22]

GuAV ©   (20.01.05 23:08) [21]
мой пример в [9] хоть и корявый, но рабочий))
- он полностью прогу копирует в целевой процесс


 
GuAV ©   (2005-01-20 23:36) [23]

kaZaNoVa ©   (20.01.05 23:14) [22]
А если $70 000 000 уже занят ?


 
kaZaNoVa ©   (2005-01-21 00:12) [24]

GuAV ©   (20.01.05 23:36) [23]
тогда непридведенная очень нехорошая ситуация ..
новероятность такого очень мала


 
volser   (2005-01-21 00:24) [25]


> kaZaNoVa ©

А можно это как то проверять: занят или нет?


 
kaZaNoVa ©   (2005-01-21 00:28) [26]

volser   (21.01.05 0:24) [25]
я не проверял, пока ошибок не было)))


 
GuAV ©   (2005-01-21 00:50) [27]

Криво. Лучше с dll.
Ксати если для exe сделать LoadLibrary, то будет ли работоспособен образ в случае перемещения ?

Я к тому что если да, можно CreateRemoteThread(hProcess, nil, 0, LoadLibraryProc, MemPtr, 0, ThreadID); для ехе, затем запустить процедуру из ехе
CreateRemoteThread(hProcess, nil, 0, MyProcAddress, MemPtr, 0, ThreadID); где  MyProcAddress = @MyProc - OriginalImageBase + hExe, где hExe это ExitCode первого CreateRemoteThread.


 
kaZaNoVa ©   (2005-01-21 00:58) [28]

GuAV ©   (21.01.05 0:50) [27]
классная идея, но думаю с релоками в exe напряг будет ...


 
GuAV ©   (2005-01-21 01:36) [29]

Сделал тест:
project1:
procedure TForm1.FormCreate(Sender: TObject);
var hExe: THandle; P: procedure; I:Integer absolute P;
begin
 hExe := LoadLibrary("project2.exe");
 I:=4566872; // из project2 - TForm1.Button1Click
 Dec(I, $00400000);
 Inc(I, hExe);
 P;
 FreeLibrary(hExe);
end;

project2:
procedure ShowText;
begin
 MessageBox(0, "If you see this, I""ve relocated successfully", nil, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var P: procedure; I:Integer absolute P;
begin
 P:=@ShowText;
 MessageBox(0, PChar(IntToStr(I)), nil, 0); // вернул 4566872
end;


Работает. Тест более приближенный к реальности сделать не могу, т.к. в 9х нет CreateRemoteThread, а также т.к. в лом.


 
Kerk ©   (2005-01-21 05:59) [30]

GuAV ©   (21.01.05 0:50) [27]
Криво. Лучше с dll.

С DLL не лучше. Лучше так. Просто товарищ Казанова никак не хочет изучать асм. :) Демку этого дела я ему давал. И 9х она тоже работает. :)


 
kaZaNoVa ©   (2005-01-21 10:31) [31]

Kerk ©   (21.01.05 5:59) [30]
мы всё-же Мастера Delphi а на Асма )))
но всё-же твой пример в принципе круче))


 
Kerk ©   (2005-01-21 10:38) [32]

http://kerk.frandt.com/files/inject.zip


 
Kerk ©   (2005-01-21 10:43) [33]

Забыл сказать. Запускаем, жмем кнопку "Пуск" и наслаждаемся. Просто влом было другую АПИ перехватывать..


 
Игорь Шевченко ©   (2005-01-21 11:42) [34]


>  I:=4566872; // из project2 - TForm1.Button1Click
>  Dec(I, $00400000);
>  Inc(I, hExe);


Давить вообще-то надо за такой код. Пожизненно :)


 
Fay ©   (2005-01-21 11:53) [35]

2 kaZaNoVa ©   (21.01.05 00:12) [24]
>> новероятность такого очень мала
Законы Мерфи говорят об обратном


 
Piter ©   (2005-01-21 12:32) [36]

volser   (21.01.05 0:24) [25]
А можно это как то проверять: занят или нет?


а зачем? Ты правильно делаешь - выделяешь пространство в адресном пространстве другого процесса - это гарантированный способ.

Вообще, попроси kaZaNoVa выложить его собственную ветку по этому вопросу, там ему умные люди много чего умного насоветовали


 
kaZaNoVa ©   (2005-01-21 13:02) [37]

Piter ©   (21.01.05 12:32) [36]
спасибо что напомнил, ветка уже ушла в архив, выложил у себя
http://sys.h14.ru/potok.html


 
volser   (2005-01-21 13:36) [38]

какой самый простой и надежный метод запустить функцию с длл в процессе експлорера?
[6] - является таковым?


 
Kerk ©   (2005-01-21 13:38) [39]

volser   (21.01.05 13:36) [38]

а самому варианты посмотреть? подумать?


 
kaZaNoVa ©   (2005-01-21 13:44) [40]

volser   (21.01.05 13:36) [38]

Var
PID: Cardinal;
//-----------------------
GetWindowThreadProcessId(FindWindow("Progman", nil), @PID);


 
GuAV ©   (2005-01-21 14:06) [41]

Игорь Шевченко ©   (21.01.05 11:42) [34]
Давить вообще-то надо за такой код. Пожизненно :)


Я знаю :) Я просто хотел быстро проверить работоспособность идеи.

У меня нет CreateRemoteThread (9х), а при загрузке ехе файла собой hExe = SysInit.hInstance (что вполне логично).

Так я сделал пример из двух ехе. Передавать указатель оказалось лень, так же как и определять  ImageBase второго ехе.
(кстати, можно ли из ехе экспортировать ?)

Kerk ©   (21.01.05 10:38) [32]
Идею в общем понял. Но 8 кБ релока эксплорера - маловато для дельфовского приложения.
Можно объёдинить идеи и уйти от асма, поместив в релок Explorera delphi-код (и структуру с адресом loadlibrary, createthread и  именем ехе) который уже с помощью loadlibrary загрузит остальной ехе и передаст ему управление через createthread.


 
Kerk ©   (2005-01-21 15:07) [42]

GuAV ©   (21.01.05 14:06) [41]
(кстати, можно ли из ехе экспортировать ?)

можно конечно

> Но 8 кБ релока эксплорера - маловато для дельфовского
> приложения.

ну чего у вас за заморочки? ну зачем именно дельфовское приложение? я предлагаю мыслить шире и внедрять туда приложение на Visual Prolog! :)


 
Игорь Шевченко ©   (2005-01-21 15:19) [43]

GuAV ©   (20.01.05 22:45) [15]


> size of align.


А что за align такой ?

С уважением,


 
Kerk ©   (2005-01-21 15:22) [44]

Игорь Шевченко ©   (21.01.05 15:19) [43]
А что за align такой ?


видимо имелся ввиду мусор для выравнивания адреса начала процедуры


 
Игорь Шевченко ©   (2005-01-21 15:28) [45]

Kerk ©   (21.01.05 15:22) [44]

А зачем его выравнивать?

С уважением,


 
GuAV ©   (2005-01-21 15:34) [46]

Игорь Шевченко ©   (21.01.05 15:19) [43]

Может некорректно выразился, я о том что процедуры dword-aligned, т.е. размер процедуры вычисленный таким образом получистя больше необходимого на 0..3 байт.


procedure P1;
begin
end;

procedure P2;
asm
end;

procedure P3;
asm
 NOP
 NOP
 NOP
end;

procedure P4;
begin
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Memo1.Lines.Add(Format("P2-P1 = %d",[Integer(@P2)-Integer(@P1)]));
 Memo1.Lines.Add(Format("P4-P3 = %d",[Integer(@P4)-Integer(@P3)]));
// 4 в обоих случаях
end;


 
Игорь Шевченко ©   (2005-01-21 16:35) [47]

GuAV ©   (21.01.05 15:34) [46]

Так это фича конкретного компилятора...И не факт, что устоявшаяся.

С уважением,


 
Kerk ©   (2005-01-21 16:41) [48]

Игорь Шевченко ©   (21.01.05 16:35) [47]
дык пофиг :)
все равно это невлияет на вычисление размера процедуры :)


 
GuAV ©   (2005-01-21 17:12) [49]

Игорь Шевченко ©   (21.01.05 16:35) [47]

Я и не говорю что факт. Сохранение порядка процедур - тоже фича компилятора.

Однако более надёжного и точного способа найти "размер процедуры" подсказать не могу.


 
-SeM-   (2005-01-21 17:37) [50]

GuAV ©   (21.01.05 17:12) [49]


> Однако более надёжного и точного способа найти "размер процедуры"
> подсказать не могу.


Вот так например предлагает Aphex


const

 Opcodes1: array [0..255] of word =
 (
   (16913),(17124),(8209),(8420),(33793),(35906),(0),(0),(16913),(17124),(8209),(8420),(33793),(35906),(0),(0),(16913),
   (17124),(8209),(8420),(33793),(35906),(0),(0),(16913),(17124),(8209),(8420),(33793),(35906),(0),(0),(16913),
   (17124),(8209),(8420),(33793),(35906),(0),(32768),(16913),(17124),(8209),(8420),(33793),(35906),(0),(32768),(16913),
   (17124),(8209),(8420),(33793),(35906),(0),(32768),(529),(740),(17),(228),(1025),(3138),(0),(32768),(24645),
   (24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645), (69),
   (69),(69),(69),(69),(69),(69),(69),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(24645),(0),
   (32768),(228),(16922),(0),(0),(0),(0),(3072),(11492),(1024),(9444),(0),(0),(0),(0),(5120),
   (5120),(5120),(5120),(5120),(5120),(5120),(5120),(5120),(5120),(5120),(5120),(5120),(5120),(5120),(5120),(1296),
   (3488),(1296),(1440),(529),(740),(41489),(41700),(16913),(17124),(8209),(8420),(17123),(8420),(227),(416),(0),
   (57414),(57414),(57414),(57414),(57414),(57414),(57414),(32768),(0),(0),(0),(0),(0),(0),(32768),(33025),
   (33090),(769),(834),(0),(0),(0),(0),(1025),(3138),(0),(0),(32768),(32768),(0),(0),(25604),
   (25604),(25604),(25604),(25604),(25604),(25604),(25604),(27717),(27717),(27717),(27717),(27717),(27717),(27717),(27717), (17680),
   (17824),(2048),(0),(8420),(8420),(17680),(19872),(0),(0),(2048),(0),(0),(1024),(0),(0),(16656),
   (16800),(16656),(16800),(33792),(33792),(0),(32768),(8),(8),(8),(8),(8),(8),(8),(8),(5120),
   (5120),(5120),(5120),(33793),(33858),(1537),(1602),(7168),(7168),(0),(5120),(32775),(32839),(519),(583),(0),
   (0),(0),(0),(0),(0),(8),(8),(0),(0),(0),(0),(0),(0),(16656),(416)
 );

 Opcodes2: array [0..255] of word =
 (
   (280),(288),(8420),(8420),(65535),(0),(0),(0),(0),(0),(65535),(65535),(65535),(272),(0),(1325),(63),
   (575),(63),(575),(63),(63),(63),(575),(272),(65535),(65535),(65535),(65535),(65535),(65535),(65535),(16419),
   (16419),(547),(547),(65535),(65535),(65535),(65535),(63),(575),(47),(575),(61),(61),(63),(63),(0),
   (32768),(32768),(32768),(0),(0),(65535),(65535),(65535),(65535),(65535),(65535),(65535),(65535),(65535),(65535),(8420),
   (8420),(8420),(8420),(8420),(8420),(8420),(8420),(8420),(8420),(8420),(8420),(8420),(8420),(8420),(8420),(16935),
   (63),(63),(63),(63),(63),(63),(63),(63),(63),(63),(63),(63),(63),(63),(63),(237),
   (237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(101),(237),(1261),
   (1192),(1192),(1192),(237),(237),(237),(0),(65535),(65535),(65535),(65535),(65535),(65535),(613),(749),(7168),
   (7168),(7168),(7168),(7168),(7168),(7168),(7168),(7168),(7168),(7168),(7168),(7168),(7168),(7168),(7168),(16656),
   (16656),(16656),(16656),(16656),(16656),(16656),(16656),(16656),(16656),(16656),(16656),(16656),(16656),(16656),(16656), (0),
   (0),(32768),(740),(18404),(17380),(49681),(49892),(0),(0),(0),(17124),(18404),(17380),(32),(8420),(49681),
   (49892),(8420),(17124),(8420),(8932),(8532),(8476),(65535),(65535),(1440),(17124),(8420),(8420),(8532),(8476),(41489),
   (41700),(1087),(548),(1125),(9388),(1087),(33064),(24581),(24581),(24581),(24581),(24581),(24581),(24581),(24581),(65535 ),
   (237),(237),(237),(237),(237),(749),(8364),(237),(237),(237),(237),(237),(237),(237),(237),(237),
   (237),(237),(237),(237),(237),(63),(749),(237),(237),(237),(237),(237),(237),(237),(237),(65535),
   (237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(237),(0)
 );

 Opcodes3: array [0..9] of array [0..15] of word =
 (
   ((1296),(65535),(16656),(16656),(33040),(33040),(33040),(33040),(1296),(65535),(16656),(16656),(33040),(33040),(33040),( 33040)),
   ((3488),(65535),(16800),(16800),(33184),(33184),(33184),(33184),(3488),(65535),(16800),(16800),(33184),(33184),(33184),( 33184)),
   ((288),(288),(288),(288),(288),(288),(288),(288),(54),(54),(48),(48),(54),(54),(54),(54)),
   ((288),(65535),(288),(288),(272),(280),(272),(280),(48),(48),(0),(48),(0),(0),(0),(0)),
   ((288),(288),(288),(288),(288),(288),(288),(288),(54),(54),(54),(54),(65535),(0),(65535),(65535)),
   ((288),(65535),(288),(288),(65535),(304),(65535),(304),(54),(54),(54),(54),(0),(54),(54),(0)),
   ((296),(296),(296),(296),(296),(296),(296),(296),(566),(566),(48),(48),(566),(566),(566),(566)),
   ((296),(65535),(296),(296),(272),(65535),(272),(280),(48),(48),(48),(48),(48),(48),(65535),(65535)),
   ((280),(280),(280),(280),(280),(280),(280),(280),(566),(566),(48),(566),(566),(566),(566),(566)),
   ((280),(65535),(280),(280),(304),(296),(304),(296),(48),(48),(48),(48),(0),(54),(54),(65535))
 );


 
-SeM-   (2005-01-21 17:38) [51]

Ну и сами функции


function SizeOfCode(Code: pointer): longword;
var
 Opcode: word;
 Modrm: byte;
 Fixed, AddressOveride: boolean;
 Last, OperandOveride, Flags, Rm, Size, Extend: longword;
begin
 try
   Last := longword(Code);
   if Code <> nil then
   begin
     AddressOveride := False;
     Fixed := False;
     OperandOveride := 4;
     Extend := 0;
     repeat
       Opcode := byte(Code^);
       Code := pointer(longword(Code) + 1);
       if Opcode = $66 then
       begin
         OperandOveride := 2;
       end
       else if Opcode = $67 then
       begin
         AddressOveride := True;
       end
       else
       begin
         if not ((Opcode and $E7) = $26) then
         begin
           if not (Opcode in [$64..$65]) then
           begin
             Fixed := True;
           end;
         end;
       end;
     until Fixed;
     if Opcode = $0f then
     begin
       Opcode := byte(Code^);
       Flags := Opcodes2[Opcode];
       Opcode := Opcode + $0f00;
       Code := pointer(longword(Code) + 1);
     end
     else
     begin
       Flags := Opcodes1[Opcode];
     end;
     if ((Flags and $0038) <> 0) then
     begin
       Modrm := byte(Code^);
       Rm := Modrm and $7;
       Code := pointer(longword(Code) + 1);
       case (Modrm and $c0) of
         $40: Size := 1;
         $80:
           begin
             if AddressOveride then
             begin
               Size := 2;
             end
             else
               Size := 4;
             end;
         else
         begin
           Size := 0;
         end;
       end;
       if not (((Modrm and $c0) <> $c0) and AddressOveride) then
       begin
         if (Rm = 4) and ((Modrm and $c0) <> $c0) then
         begin
           Rm := byte(Code^) and $7;
         end;
         if ((Modrm and $c0 = 0) and (Rm = 5)) then
         begin
           Size := 4;
         end;
         Code := pointer(longword(Code) + Size);
       end;
       if ((Flags and $0038) = $0008) then
       begin
         case Opcode of
           $f6: Extend := 0;
           $f7: Extend := 1;
           $d8: Extend := 2;
           $d9: Extend := 3;
           $da: Extend := 4;
           $db: Extend := 5;
           $dc: Extend := 6;
           $dd: Extend := 7;
           $de: Extend := 8;
           $df: Extend := 9;
         end;
         if ((Modrm and $c0) <> $c0) then
         begin
           Flags := Opcodes3[Extend][(Modrm shr 3) and $7];
         end
         else
         begin
           Flags := Opcodes3[Extend][((Modrm shr 3) and $7) + 8];
         end;
       end;
     end;
     case (Flags and $0C00) of
       $0400: Code := pointer(longword(Code) + 1);
       $0800: Code := pointer(longword(Code) + 2);
       $0C00: Code := pointer(longword(Code) + OperandOveride);
       else
       begin
         case Opcode of
           $9a, $ea: Code := pointer(longword(Code) + OperandOveride + 2);
           $c8: Code := pointer(longword(Code) + 3);
           $a0..$a3:
             begin
               if AddressOveride then
               begin
                 Code := pointer(longword(Code) + 2)
               end
               else
               begin
                 Code := pointer(longword(Code) + 4);
               end;
             end;
         end;
       end;
     end;
   end;
   Result := longword(Code) - Last;
 except
   Result := 0;
 end;
end;

function SizeOfProc(Proc: pointer): longword;
var
 Length: longword;
begin
 Result := 0;
 repeat
   Length := SizeOfCode(Proc);
   Inc(Result, Length);
   if ((Length = 1) and (byte(Proc^) = $C3)) then Break;
   Proc := pointer(longword(Proc) + Length);
 until Length = 0;
end;


 
GuAV ©   (2005-01-21 17:51) [52]

фигня. например:

procedure Z1;
var S: string;
begin
 S := "It won""t work";
end; // ставь Breakpoint сюда. это будет уже после "конца" процедуры определенноко как начало+SizeOfProc.

procedure TForm1.FormCreate(Sender: TObject);
begin
 Caption:=IntToHex(Integer(@Z1) + SizeOfProc(@Z1), 8);
 Z1;
end;


или вот
procedure Z2;
begin
 if Form1=nil then Exit;
 Form1.Caption := "Boo";
end;


 
volser   (2005-01-21 18:07) [53]

Хочу обобщить понятое мной в этой ветки и все таки найти окончательный ответ на мой вопрос:
1. Запустить функцию в процессе эксплорера без dll 100% не возможно и основано на теории вероятности, что не устраивает большинство.
2. Существует несколько способов сделать это при помощью допольнительной dll.

Вопрос сосотоит в том:
- Какие есть способы с №2 и какой из них более совершенный?
- Как обмениватьося данными с главным приложением и dll?


 
Kerk ©   (2005-01-21 18:27) [54]

volser   (21.01.05 18:07) [53]
1. Запустить функцию в процессе эксплорера без dll 100% не возможно и основано на теории вероятности, что не устраивает большинство.

ты мою демку смотрел вообще???


 
volser   (2005-01-21 19:56) [55]


> Kerk ©  

Я не шарю в асьме и свои выводы формировал на основе примеров, котрые наводились на делфи


 
GuAV ©   (2005-01-21 20:05) [56]

volser   (21.01.05 19:56) [55]

Тогда [27] - вполне возможно на дельфи.


 
Digitman ©   (2005-01-22 15:10) [57]


> Какие есть способы с №2 и какой из них более совершенный?


наиболее совершенен лишь способ, документированный самим разработчиком ОС - LoadLibrary[Ex] .. адрес т.входа в эту ф-цию передается параметром в CreateRemoteThread .. адрес этот будет одинаков и для процесса приложения, вызывающего CreateRemoteThread, и для процесса, в чьем АП этот RemoteThread собственно требуется запустить .. утверждение равенства адресов основывается на факте того , что модуль kernel32, в котором реализована ф-ция CreateRemoteThread и который в обязательном порядке используется любым прикл.процессом в системе, загружается системой в АП любого процесса всегда по одному и тому же фактическому лин.адресу


> Как обмениваться данными с главным приложением и dll?


способов - масса.
но, наверно, наилучший же (и самый универсальный, рекомендуемый самим разработчиком) способ - использование именованых программных каналов (named pipes), технология и механизм которых как раз и предназначены для быстрой и надежной интеркоммуникации между различными процессами в системе.


 
GuAV ©   (2005-01-22 15:41) [58]

Digitman ©   (22.01.05 15:10) [57]
LoadLibrary[Ex]


Точно ?

HMODULE LoadLibraryEx(
 LPCTSTR lpFileName,  // file name of module
 HANDLE hFile,        // reserved, must be NULL
 DWORD dwFlags        // entry-point execution option
);



> документированный самим разработчиком ОС

Где ?


 
Digitman ©   (2005-01-24 08:07) [59]


> GuAV ©   (22.01.05 15:41) [58]


> Где ?

http://msdn.microsoft.com/library/en-us/dllproc/base/loadlibraryex.asp


> Точно ?


что "точно" ?


 
Kerk ©   (2005-01-24 08:17) [60]

Digitman ©   (22.01.05 15:10) [57]
наиболее совершенен лишь способ, документированный самим разработчиком ОС - LoadLibrary[Ex] .. адрес т.входа в эту ф-цию передается параметром в CreateRemoteThread


Прочитал раза четыре и ПОНЯЛ!!! Супер! Мне в голову такое не могло прийти.


 
GuAV ©   (2005-01-24 12:10) [61]


> http://msdn.microsoft.com/library/en-us/dllproc/base/lo
> adlibraryex.asp

Да, это справка по LoadLibraryEx но там нет упоминания совместного использования с CreateRemoteThread.


> что "точно" ?

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


 
Digitman ©   (2005-01-24 12:28) [62]


> Да, это справка по LoadLibraryEx но там нет упоминания совместного
> использования с CreateRemoteThread.


да мало ли каких еще упоминаний там нет !
все 3 ф-ции документированы, используй их как умеешь !


> Ничего, что первые два параметра прочитаются непоняно откуда
>


как ты их передашь, так они и "прочитаются"
у тебя же не вызывает вопросов передача единственного параметра для вызова LoadLibrary() ? тогда почему вызывает вопрос передача более чем одного параметра ?


 
GuAV ©   (2005-01-24 15:44) [63]


>как ты их передашь, так они и "прочитаются"
> у тебя же не вызывает вопросов передача единственного
> параметра для вызова LoadLibrary() ? тогда почему
> вызывает вопрос передача более чем одного параметра ?


Смотрим CreateRemoteThread

HANDLE CreateRemoteThread(
 ...
 LPTHREAD_START_ROUTINE lpStartAddress,    // thread function
 LPVOID lpParameter,                       // thread argument
 ...
);

LPTHREAD_START_ROUTINE протипа ThreadProc

Смотрим ThreadProc

DWORD WINAPI ThreadProc(
 LPVOID lpParameter   // thread data
);


WINAPI означает использование модели stdcall.
Это значит что один параметр должен быть прочитан из стека и удалён оттуда при возврате.

Смотрим LoadLibrary

HMODULE LoadLibrary(
 LPCTSTR lpFileName   // file name of module
);


Тот же один параметр будет прочитан из стека и удалён оттуда при возврате.

т.е. можно передать lpFileName как lpParameter в CreateRemoteThread.

Смотрим LoadLibraryEx

HMODULE LoadLibraryEx(
 LPCTSTR lpFileName,  // file name of module
 HANDLE hFile,        // reserved, must be NULL
 DWORD dwFlags        // entry-point execution option
);


Три параметра будут прочитаны из стека. первый (lpFileName) будет равен  lpParameter в CreateRemoteThread. Что будет в последних двух ? И как это отразится на коде ОС который вызывает ThreadProc из CreateRemoteThread ?


 
Digitman ©   (2005-01-24 16:04) [64]


> GuAV


ты дуриком-то не прикидывайся !

ты копируешь код будущего трэда в удаленное ВАП, тело этого трэде первым делом будет вызывать LoadLibrary[Ex]
далее ты копируешь в удаленное ВАП параметры ф-ции LoadLibraryEx
далее ты стартуешь удал.трэд, передавая ему структуру, содержащую И адрес ф-ции LoadLibraryEx И адреса необходимых ей УЖЕ СКОПИРОВАННЫХ тобой в чужое ВАП параметров

ЧТО еще непонятно ?


 
GuAV ©   (2005-01-24 16:33) [65]

Digitman ©   (24.01.05 16:04) [64]

> ты копируешь код будущего трэда в удаленное ВАП

Так бы сразу... а то

Digitman ©   (22.01.05 15:10) [57]

>  LoadLibrary[Ex] .. адрес т.входа в эту ф-цию
> передается параметром в CreateRemoteThread

т.е. я понял передать

CreateRemoteThread(
...
GetProcAddres(hKernel32, "LoadLibraryExA"),    // thread function
GlobalStrPtr,                       // thread argument
...
);

А оно оказывается записать код который уже вызовет LoadLibraryEx и передать указатель на этот код... больше вопросов не имею.


 
Digitman ©   (2005-01-24 16:45) [66]


> GuAV ©   (24.01.05 16:33) [65]


> А оно оказывается записать код который уже вызовет LoadLibraryEx
>


только не так как ты написал - вызовом GetProcAddres().
ОТКУДА там возьмется адрес ф-ции "GetProcAddres" ?

если уж на то пошло, можно даже не адрес "LoadLibrary" передавать параметром в CreateremoteThread(), а сразу адрес "GetProcAddress"


 
GuAV ©   (2005-01-24 16:58) [67]

Digitman ©   (24.01.05 16:45) [66]

> только не так как ты написал - вызовом GetProcAddres().

Я писал не применительно к внедряемому коду, а применительно к случаю вызвова LoadLibrary как ThreadProc без предварительной записи кода в чужое АП.

Я понимаю что кроме кода нужно записать в чужое АП ещё структуру со всеми необходимыми указателями. Или обойтись одним указателем на GetProcAddres или LoadLibrary[Ex] (как параметр CreateRemoteThread).
Или "по-хакерски" сформировать код как структуру из "заготовки" типа
PUSH $FFFFFFFF
PUSH $FFFFFFFF
PUSH $FFFFFFFF
CALL $FFFFFFFF
RET 12


 
DeadMeat ©   (2005-01-25 11:12) [68]


> [54] Kerk ©   (21.01.05 18:27)

ты мою демку смотрел вообще???

Так. На всякий случай. Я код не смотрел, т.к. в асме не шибко шарю, но на моей WinXP_SP2EN на твою прогу отругался DEP... И послал ее вместе с Explorer-ом.. Но перед этим отругался мой ZoneAlarm.. Но оно и понятно. Он на OpenProcess ругался..
Это так... Просто чтоб ты знал..

Сорри всем за оффтоп..

---
...Death Is Only The Begining...


 
kaZaNoVa ©   (2005-01-25 11:33) [69]

DeadMeat ©   (25.01.05 11:12) [68]

> DEP... И послал ее вместе с Explorer-ом.. Но перед
> этим отругался мой ZoneAlarm.. Но оно и понятно. Он на
> OpenProcess ругался..

что у тебя из защит установлено?
//как то круто, интересно)))


 
kaZaNoVa ©   (2005-01-25 11:34) [70]

DeadMeat ©   (25.01.05 11:12) [68]

> отругался мой ZoneAlarm

я слышал это самый "жесткий" фарволл ))


 
DeadMeat ©   (2005-01-25 11:41) [71]

Да ничего особенного.. Встроенный файер отключен. Только этот и вот DEP... И все...

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

---
...Death Is Only The Begining...


 
kaZaNoVa ©   (2005-01-25 11:51) [72]

DeadMeat ©   (25.01.05 11:41) [71]

> вот DEP

а что это такое ?


 
DeadMeat ©   (2005-01-25 19:42) [73]

Data Execution Prevention
В сервис паке втором есть... Детали не могу сказать, но насколько я понял, эта хрень защищает проги от таких вещей, как CreateRemoteThread. Хотя могу ошибаться, но смысл тот же... Т.е. чтобы в чужом АП не было беспредела. По умолчанию включено только для виндовых прог. А Explorer один из них...

---
...Death Is Only The Begining...


 
Kerk ©   (2005-01-25 19:55) [74]

DeadMeat ©   (25.01.05 19:42) [73]
Data Execution Prevention


Аааа.. спасибо за инфу.. на такой штуке я еще не тестил.


 
DeadMeat ©   (2005-01-25 20:57) [75]

А у тя SP2 нету чтоли? Или может оно не эмулируется на старых процессорах...?

---
...Death Is Only The Begining...


 
Kerk ©   (2005-01-25 22:13) [76]

DeadMeat ©   (25.01.05 20:57) [75]
А у тя SP2 нету чтоли?


нету


 
xShadow ©   (2005-01-26 09:42) [77]


> Kerk ©   (25.01.05 19:55) [74]
Data Execution Prevention

Злая кстати вешь!
При включении на все приложения любое внедрение в чужое приложение заканчивается крахом приложения.


 
Kerk ©   (2005-01-26 10:21) [78]

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


 
xShadow ©   (2005-01-26 10:29) [79]


> Kerk ©   (26.01.05 10:21) [78]

Пока из того что тестировал работают стандартные средства LoadLibary 100%


 
DeadMeat ©   (2005-01-26 11:12) [80]

Я так понял Керк, что ты в своем примере релоки меняешь. Вот видимо на это он и матюкнулся... Потому как вчера мы выяснили, что простой CreateRemoteThread срабатывает спокойно..

---
...Death Is Only The Begining...


 
Kerk ©   (2005-01-26 11:50) [81]

DeadMeat ©   (26.01.05 11:12) [80]
Я так понял Керк, что ты в своем примере релоки меняешь. Вот видимо на это он и матюкнулся...


так и есть.


 
Piter ©   (2005-01-26 12:40) [82]

xShadow ©   (26.01.05 9:42) [77]
Злая кстати вешь!
При включении на все приложения любое внедрение в чужое приложение заканчивается крахом приложения


а почему крах?
И внедрение только с помощью CreateRemoteThread? А если с помощью хуков - тоже самое или нет?

Кто владеет инфой по этому вопросу?


 
xShadow ©   (2005-01-26 13:17) [83]


> Piter ©   (26.01.05 12:40) [82]

CreateRemoteThread - отрабатывает нормально, а вот при внесении изменений в приложении цели происходит ошибка.
Сегодня вечером займась тестами.

Оффтоп:
2 Kerk
Где можно скачать твой пример потому как ссылке выдаёт ошибку?


 
Piter ©   (2005-01-26 18:47) [84]

xShadow ©   (26.01.05 13:17) [83]
А вот при внесении изменений в приложении цели происходит ошибка.


это как? не работает WriteProccessMemory или что? Как ты вносишь изменения?


 
Kerk ©   (2005-01-26 19:19) [85]

xShadow ©   (26.01.05 13:17) [83]
Где можно скачать твой пример потому как ссылке выдаёт ошибку?


ссылка нормально качается. только что проверил. попробуй еще раз.


 
kaZaNoVa ©   (2005-01-26 20:08) [86]

Piter ©   (26.01.05 18:47) [84]

> это как? не работает WriteProccessMemory или что? Как
> ты вносишь изменения?

WriteProccessMemory точно работает)


 
DeadMeat ©   (2005-01-26 21:54) [87]

Похожу определенные диапазоны адресов проверяются....

---
...Death Is Only The Begining...


 
Piter ©   (2005-01-26 22:33) [88]

DeadMeat ©   (26.01.05 21:54) [87]

поконкретнее можно?


 
DeadMeat ©   (2005-01-26 23:12) [89]

Это просто предположение...
Видимо в эти диапазоны входят такие места, как таблица релоков, импорта и т.п...
Может быть и места, занятые самим процессом...
Хотя могу и глупость сказать. Это ведь предположение. У меня нет достаточно информации.

---
...Death Is Only The Begining...


 
Piter ©   (2005-01-27 00:12) [90]

DeadMeat ©   (26.01.05 23:12) [89]
Видимо в эти диапазоны входят такие места, как таблица релоков, импорта и т.п...


А при чем здесь это?

Я как понял, тут говорят о том, что в SP2 появился некий механизм, препятствующий внедрнению в другие процессы. Вот и хотелось бы узнать - это ОБС или факт?
Если такое средство есть - как оно работает?

Внедрению с помощью CreateRemoteThread можно разделить на 2 пункта:

1) запись в память удаленного процесса своего кода потока

2) вызов CreateRemoteThread, чтобы запустить удаленный поток.

какому этапу этот механизм препятствует?


 
Kerk ©   (2005-01-27 00:15) [91]

Piter ©   (27.01.05 0:12) [90]

он препятствует выполнению кода, находящегося в области данных.


 
GuAV ©   (2005-01-27 00:26) [92]


>Piter ©   (27.01.05 0:12) [90]
>
> он препятствует выполнению кода, находящегося в
> области данных.

А как же UPX ы всякие ?


 
Kerk ©   (2005-01-27 00:28) [93]

GuAV ©   (27.01.05 0:26) [92]
А как же UPX ы всякие ?


а он не выполняет код в области данных.


 
Piter ©   (2005-01-27 00:41) [94]

Kerk ©   (27.01.05 0:15) [91]
он препятствует выполнению кода, находящегося в области данных


хм. грамотно...

Значит, функция CreateTemoteThread считай недееспособна для внедрения?

Kerk ©   (27.01.05 0:28) [93]
а он не выполняет код в области данных


как это? А куда же он распаковывает оригинальный EXE"шник?

P.S. А где настройки этой функции в XP SP2?


 
Kerk ©   (2005-01-27 00:44) [95]

Piter ©   (27.01.05 0:41) [94]
как это? А куда же он распаковывает оригинальный EXE"шник?


насколько я представляю (не уверен). он распаковывает код в секции PE, которые помечены как содержащие код.


 
Piter ©   (2005-01-27 15:18) [96]

Kerk ©   (27.01.05 0:44) [95]
насколько я представляю (не уверен). он распаковывает код в секции PE,


это как это? В секции зашифрованного EXE"шника?!
Но как минимум расшифрованный EXE"шник будет занимать больше места, он туда просто не влезет!


 
Kerk ©   (2005-01-27 15:26) [97]

Piter ©   (27.01.05 15:18) [96]

ты про формат PE почитай. у секции есть физический размер, а есть виртуальный. разные вещи.


 
kaZaNoVa ©   (2005-01-27 15:31) [98]

Удалено модератором


 
Игорь Шевченко ©   (2005-01-27 15:35) [99]

Удалено модератором


 
kaZaNoVa ©   (2005-01-27 15:59) [100]

Kerk ©   (27.01.05 15:26) [97]

> ты про формат PE почитай. у секции есть физический
> размер, а есть виртуальный. разные вещи.

я когда экспериментировал, физический где-то был 15кб, и один из "виртуальных" 45кб - если не путаю ..


 
alpet   (2005-01-27 17:38) [101]

когда то решал эту проблему. Использовал частично Hook"s и запись в процесс, а вот CreateRemoteThread не пользовал.
В архиве http://alpet.hotmail.ru/wgcsrc.zip можно посмотреть файл chspy.pas в котором через отладку грузится, и chhook.pas в котором через ловушки.


 
DeadMeat ©   (2005-01-27 19:57) [102]


> А как же UPX ы всякие ?

Насколько я понял, по умолчанию DEP проверяет только "свои", виндузовые проги.. В смысле "родные" процессы, которые являются "родными" для Windows. Но его можно настроить и на проверку всех процессов в системе. Но изначально, он держит только "свои"... К примеру Explorer из их числа.

---
...Death Is Only The Begining...


 
xShadow ©   (2005-01-29 22:31) [103]

Оффтоп:
В общем рузeльтаты экспериментов на WinXP SP2 c системой DEP настроеной на все приложения. Метод Kerk"a работает без проблем и метод kaZaNoVa тоже работает, как ни странно. В то время как половина других приложений перестала работать в частности Опера.
Отдельная история когда работает FireWall накрученный на всю, проверял Outpost и ZoneAlarm тут начинаются чудеса... Вылетают при попытке внедрения сразу же.
Что касается UPX и иже с ним то пакеры арудуют в своём адресном пространстве а это не запрещено.
Пока всё.


 
Piter ©   (2005-01-30 02:34) [104]

xShadow ©   (29.01.05 22:31) [103]
Вылетают при попытке внедрения сразу же.


А что, файерволы разве внедряются в приложения? Зачем им это?


 
xShadow ©   (2005-01-30 12:35) [105]


> Piter ©   (30.01.05 02:34) [104]

Возможно я не правильно описал, у файерволов есть опция как наблюдения за приложениями и за изменениями в них. А внедрения в чужой процес пробую я.


 
Piter ©   (2005-01-30 14:56) [106]

Piter ©   (30.01.05 2:34) [104]
у файерволов есть опция как наблюдения за приложениями и за изменениями в них


ну и что? А для этого им нужно внедряться в процесс?

Я просто не понял фразы:

проверял Outpost и ZoneAlarm тут начинаются чудеса... Вылетают при попытке внедрения сразу же

кто вылетают? Файерволы?


 
Kerk ©   (2005-02-01 12:42) [107]

xShadow ©   (29.01.05 22:31) [103]
В общем рузeльтаты экспериментов на WinXP SP2 c системой DEP настроеной на все приложения. Метод Kerk"a работает без проблем


DeadMeat сказал, что мой код не работает там. Не стыковочка.. так все-таки работает или нет?

Piter ©   (30.01.05 14:56) [106]
ну и что? А для этого им нужно внедряться в процесс?


Очередное мое скромное предположение. :)
Факт внедрения в процесс файрволы определяют перехватывая АПИ.. а как иначе? :) Хотя это легко проверить можно.. только лень :)


 
xShadow ©   (2005-02-01 12:59) [108]


> xShadow ©   (29.01.05 22:31) [103]

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


 
Kerk ©   (2005-02-01 13:07) [109]

http://www.maxpatrol.com/defeating-xpsp2-heap-protection.htm


 
Piter ©   (2005-02-01 14:13) [110]

Kerk ©   (01.02.05 12:42) [107]
Факт внедрения в процесс файрволы определяют перехватывая АПИ


не понял. Можно поподробнее?

Имхо, файерволы просто получают список всех модулей программы, которые она использует. После чего рассчитывает контрольную сумму этих модулей на диске.

И по полученным даным файеры и пишут про изменения...
Внедряться здесь, по-моему, совсем не обязательно. Что перехватывать?


 
kaZaNoVa ©   (2005-02-01 14:15) [111]

Piter ©   (01.02.05 14:13) [110]
ну, openprocess перехвати, что сложного то?  )))


 
Kerk ©   (2005-02-01 14:17) [112]

Piter ©   (01.02.05 14:13) [110]
не понял. Можно поподробнее?


ну я же сказал, что это просто предположение. имхо проще ловить момент внедрения, чем ПРИ КАЖДОМ коннекте пересчитывать контрольные суммы.


 
Piter ©   (2005-02-01 15:30) [113]

А как связаны OpenProcess и внедрение?


 
Piter ©   (2005-02-01 15:32) [114]

И как сам Firewall внедряется? Хуками? Так хуками далеко не в каждый процесс внедришься.
А CreateRemoteThread не реализован на win9x

Так что думаю никуда firewall не внедряется... ему это нафиг не нужно


 
Kerk ©   (2005-02-01 15:34) [115]

Piter ©   (01.02.05 15:30) [113]
А как связаны OpenProcess и внедрение?


перечитай ветку. посмотри исходники, что здесь висят.

Piter ©   (01.02.05 15:32) [114]
И как сам Firewall внедряется? Хуками? Так хуками далеко не в каждый процесс внедришься.
А CreateRemoteThread не реализован на win9x


что АПИ перехватывать нифига не надо никаких потоков добавлять.


 
Piter ©   (2005-02-01 16:14) [116]

Kerk ©   (01.02.05 15:34) [115]
перечитай ветку. посмотри исходники, что здесь висят


нафига мне это смотреть? Я и так знаю, что внедриться можно без всякого OpenProcess

что АПИ перехватывать нифига не надо никаких потоков добавлять

да ладно?
Ну а то, что нужно внедриться в удаленный процесс, чтобы перехватывать функции - хоть это ты признаешь? Или ты перехватываешь функции без внедрения? :)


 
Kerk ©   (2005-02-01 16:23) [117]

Piter ©   (01.02.05 16:14) [116]
Ну а то, что нужно внедриться в удаленный процесс, чтобы перехватывать функции - хоть это ты признаешь? Или ты перехватываешь функции без внедрения? :)


с внедрением. но потоки тут не при чем.

> Я и так знаю, что внедриться можно без всякого
> OpenProcess

можно.. второй способ - хук. добавление лишней ДЛЛ файрвол отловит.


 
kaZaNoVa ©   (2005-02-01 16:27) [118]

Piter ©   (01.02.05 16:14) [116]

> Я и так знаю, что внедриться можно без всякого
> OpenProcess

и без длл и изменения исходного файла можешь?
тогда я признаю, ты профи ..


 
kaZaNoVa ©   (2005-02-01 16:28) [119]

варианты с недокументированными Zw* функциями не рассматриваем))


 
Игорь Шевченко ©   (2005-02-01 17:19) [120]

firewall никуда не внедряется. А нафига ему внедряться ?


 
kaZaNoVa ©   (2005-02-01 17:21) [121]

Игорь Шевченко ©   (01.02.05 17:19) [120]

> А нафига ему внедряться ?

а как он ослеживает изменение модулей процессов?


 
Игорь Шевченко ©   (2005-02-01 17:30) [122]

kaZaNoVa ©   (01.02.05 17:21) [121]

А что такое модули процессов ?


 
kaZaNoVa ©   (2005-02-01 17:35) [123]

Игорь Шевченко ©   (01.02.05 17:30) [122]
имхо - загруженные и используемые процессом ДЛЛ.

проверял на АутПосте - при внедрении с помощью CreateRemoteThread с подружанием длл - он ругается с сообщением "изменились модули процесса" ..

а при внедрении по "легендарному" методу "поток без длл" - не ругается! - )


 
Игорь Шевченко ©   (2005-02-01 17:39) [124]

kaZaNoVa ©   (01.02.05 17:35) [123]

Outpost работает с использованием драйвера, так что ему доступна масса сервисов без всякого внедрения. Собственно, outpost, как и большинство firewall"ов - это всего лишь интерфейсная оболочка, а всю работу выполняет драйвер режима ядра.


 
kaZaNoVa ©   (2005-02-01 18:47) [125]

Игорь Шевченко ©   (01.02.05 17:39) [124]
Говорят, некоторые фаерволлы, в частности, ZoneAlarm  (я сам пока не проверял) реагируют на OpenProcess и спрашивают юзера, позволить или нет ..


 
Piter ©   (2005-02-01 18:58) [126]

Kerk ©   (01.02.05 16:23) [117]
с внедрением. но потоки тут не при чем


CreateRemoteThread просто один из способов внедрения, если ты не знал

добавление лишней ДЛЛ файрвол отловит

отловит. Но зачем ему при этом внедряться?

при внедрении с помощью CreateRemoteThread с подружанием длл - он ругается с сообщением "изменились модули процесса" ..

естественно. Потому что при перечислении модулей он увидел новый модуль (DLL твою) - об этом и написал

а при внедрении по "легендарному" методу "поток без длл" - не ругается!

естественно. Как он может ругаться? Если бы он ругался на каждый лишний поток - он бы ругался всегда...


 
Kerk ©   (2005-02-01 19:14) [127]

Piter ©   (01.02.05 18:58) [126]
CreateRemoteThread просто один из способов внедрения, если ты не знал


если ты мне покажешь каким боком она используется в перехвате АПИ, я пожму тебе руку (извраты не предлагать).

Piter ©   (01.02.05 18:58) [126]
добавление лишней ДЛЛ файрвол отловит
отловит. Но зачем ему при этом внедряться?


Для этого внедряться не надо. Внедряться надо для перехвата АПИ. Перехватывает он АПИ или нет мы пока не выяснили.


 
kaZaNoVa ©   (2005-02-01 21:56) [128]

по сабжу, поставил ZoneAlarm Pro 4.5 версию, да, точно, там есть настройка - спрашивать на разрешение OpenProcess - удивительно, работает))))


 
kaZaNoVa ©   (2005-02-01 22:14) [129]

провёл тесты с ZoneAlarm Pro  v4.5.538
впечатления- надёжная, мощная программа ...

главное - реагирует на OpenProcess ))

Дальше - интереснее, при попытке с помощью Process Explorer"a v8.60 завершить его процесс, либо его сервис, сразу, без попросов возникает отказ "отказано в доступе" ..

Но, самое интересное, если сперва Process Explorer"ом открыть процесс клиента (при этом он не спрашивает разрешения, уровень защиты был на максимуме) - и поочередно убить все его нити то процесс клиента вылетает .. ))))) (!!!)

после этого также лекго можно убить нити сервиса и сервис, соответственно вылетает, и, все, "свобода в инет" - защита исчезает(

Таким поведением ZA меня сильно разочаровал, видимо разработчики не подумали, что "юзера" могут убивать отдельные нити (Thread))))

//весь тест шёл на VMware с Windows XP SP2


 
Piter ©   (2005-02-01 23:49) [130]

Kerk ©   (01.02.05 19:14) [127]
если ты мне покажешь каким боком она используется в перехвате АПИ, я пожму тебе руку


хм. Странно. не знал бы тебя - сказал бы что дурак :)

Итак, ты вроде не отрицаешь два факта:

1) чтобы перехватить WinApi функцию, нужно внедрить свой код в удаленный процесс
2) функция CreateRemoteThread является одним из способов внедрения в удаленный процесс

Но я смотрю возникают вопросы как используется CreateRemoteThread в перехвате АПИ.

Она используется для ВНЕДРЕНИЯ в удаленный процесс, ибо это есть условие перехвата WinApi функции (см. пункт 1).

Не знаю как ты мне будешь жать руку по интернету... ну да ладно, обойдусь :)

Внедряться надо для перехвата АПИ

согласен. Но зачем firewall"у перехватывать АПИ? Какой смысл?

kaZaNoVa ©   (01.02.05 21:56) [128]
спрашивать на разрешение OpenProcess


а какой в этом смысл, никак не пойму?


 
Kerk ©   (2005-02-02 04:21) [131]

Piter ©   (01.02.05 23:49) [130]
1) чтобы перехватить WinApi функцию, нужно внедрить свой код в удаленный процесс
2) функция CreateRemoteThread является одним из способов внедрения в удаленный процесс


CreateRemoteProcess НЕ ИСПОЛЬЗУЕТСЯ для внедрения кода. Она используется для запуска потока в удаленном процессе. Скажи как оно связано с перехватом АПИ. (Руку жать пока не буду :P)

>Внедряться надо для перехвата АПИ
>
> согласен. Но зачем firewall"у перехватывать АПИ? Какой
> смысл?

Чтобы ловить вызов OpenProcess.

>спрашивать на разрешение OpenProcess
>
> а какой в этом смысл, никак не пойму?

Внедрение хуком ловим легко - там добавляются лишние модули. Все остальные способы внедрения кода используют OpenProcess.

P.S. По-прежнему не утверждаю, что они перехватывают АПИ. Мнение основано на косвенной информации (в частности о разрешении на OpenProcess)


 
Kerk ©   (2005-02-02 07:13) [132]

Внедрение кода - есть запись кода в АП другого процесса. Как этот код получит управление - другой вопрос. Перехват АПИ - один из способов передать управление на внедренный код.


 
kaZaNoVa ©   (2005-02-02 07:13) [133]

Piter ©   (01.02.05 23:49) [130]

> Но я смотрю возникают вопросы как используется
>CreateRemoteThread в перехвате АПИ.
>
> Она используется для ВНЕДРЕНИЯ в удаленный процесс,
> ибо это есть условие перехвата WinApi функции (см.
> пункт 1).

LOL, она имхо просто запускает поток ...


 
Piter ©   (2005-02-02 15:32) [134]

Kerk ©   (02.02.05 4:21) [131]
CreateRemoteProcess НЕ ИСПОЛЬЗУЕТСЯ для внедрения кода


:))
Ну ладно. Разжевываем еще проще, а то опять неясности.

Итак, CreateRemoteThread используется для внедрения в удаленный процесс. Порядок внедрения такой:

1) Создаем поток в удаленном процессе
2) Этот поток загружает нашу библиотеку
3) сам поток завершается
4) имеем загруженную DLL в "чужом" ВАП

То есть, фактически произошло внедрение, аналогичное хукам (почти), но мы не использовали хуки. Причем таким способом можно внедриться в процессы, в которые хуками не внедришься (например, консольное приложение, если там не делается выборка сообщений)
А внедрились мы для того, чтобы перехватывать WinApi функции.

ну теперь то наконец понятно зачем нужна CreateRemoteThread в перехвате WinApi функций, какую роль она играет?


 
Игорь Шевченко ©   (2005-02-02 16:18) [135]

Господа хорошие, для того, чтобы запустить хоть что-то, даже CreateRemoteThread, надо создать процесс. Вот он-то аудитом и будет пойман, или тем оповещателем, о котором на этом форуме неоднократно упоминал Digitman. И все ваши тайные замыслы станут явными. Лучше займитесь чем-нибудь более полезным, самодвижущееся пресс-папье изобретите или архитектурный институт закончите.


 
Kerk ©   (2005-02-02 16:45) [136]

Piter ©   (02.02.05 15:32) [134]
ну теперь то наконец понятно зачем нужна CreateRemoteThread в перехвате WinApi функций, какую роль она играет?


не понятно.

> 1) Создаем поток в удаленном процессе

раз создали поток, то код уже внедрен. нафига еще какие-то ДЛЛки подгружать?


 
Piter ©   (2005-02-02 17:04) [137]

А кто говорит про тайные замыслы?


 
Piter ©   (2005-02-02 18:36) [138]

Kerk ©   (02.02.05 16:45) [136]
раз создали поток, то код уже внедрен. нафига еще какие-то ДЛЛки подгружать?


у DLL"ки будут автоматически верно настроены все реллоки, а также импорт любых функций. Можно, конечно, и в удаленном потоке все организовать, но так геморройно.

Теперь понятно, каким образом CreateRemoteThread участвует в перехвате функций? :)


 
Kerk ©   (2005-02-02 18:49) [139]

Piter ©   (02.02.05 18:36) [138]

Ну хорошо. признаю, что этот метод имеет право на существование. :) Извратом, учитывая релоки, не назовешь... но я, все же, предпочел бы без ДЛЛ перехват делать.


 
Piter ©   (2005-02-02 19:53) [140]

Kerk ©   (02.02.05 18:49) [139]
но я, все же, предпочел бы без ДЛЛ перехват делать.


Перехват без DLL? Каким образом?


 
Kerk ©   (2005-02-02 20:36) [141]

Piter ©   (02.02.05 19:53) [140]

а в чем принципиальная разница? пишем свой код в процесс, тем же способом с помощью WriteProcessMemory меняем адрес в IAT. см, например, мой пример, выше ссылка была.


 
Piter ©   (2005-02-02 23:26) [142]

Kerk ©   (02.02.05 20:36) [141]
пишем свой код в процесс, тем же способом с помощью WriteProcessMemory меняем адрес в IAT


а как ты будешь импортировать функции в удаленном потоке? Как хотя бы ты узнаешь адрес WriteProcessMemory? Можно примерчик?


 
Kerk ©   (2005-02-03 06:24) [143]

Piter ©   (02.02.05 23:26) [142]
Как хотя бы ты узнаешь адрес WriteProcessMemory?

а зачем она мне когда я уже внедрился? :)

> Можно примерчик?

Ну посмотри ты мой пример по ссылке выше. :) Адреса функций определяются заранее и записываются в АП чужого процесса вместе с кодом. ImageBase кернела32 совпадает для всех процессов.


 
Digitman ©   (2005-02-03 09:44) [144]


> Piter ©   (02.02.05 23:26) [142]


достаточно параметром в стартуемый удаленный трэд передать адрес т.входа в ф-цию kernel32.GetProcAddress (этот адрес неизменен и актуален для всех прикл.процессов в системе).. можно, конечно, передать еще и kernel32 Imagebase (он же будет являться хэндлом модуля kernel32 в целевом процессе), но это уже - на вкус и цвет, ибо удаленный трэд сразу после старта в состоянии сам найти kernel32 Imagebase


 
Piter ©   (2005-02-03 15:34) [145]

Kerk ©   (03.02.05 6:24) [143]
а зачем она мне когда я уже внедрился? :)


а как ты собираешься править таблицы импорта?

Digitman ©   (03.02.05 9:44) [144]
этот адрес неизменен и актуален для всех прикл.процессов в системе


а это 100% для всех версий windows при любых настройках?


 
Kerk ©   (2005-02-03 15:35) [146]

Piter ©   (03.02.05 15:34) [145]
а как ты собираешься править таблицы импорта?


буду править "снаружи", т.е. не внедренным кодом, а из своего процесса.

> а это 100% для всех версий windows при любых
> настройках?

абсолютный факт.


 
Piter ©   (2005-02-03 15:46) [147]

Kerk ©   (03.02.05 15:35) [146]
буду править "снаружи", т.е. не внедренным кодом, а из своего процесса


а как ты узнаешь нужные адреса для правки извне?


 
Digitman ©   (2005-02-03 15:50) [148]


> Piter ©   (03.02.05 15:46) [147]


> как ты узнаешь нужные адреса для правки извне?


да точно так же как и при правке "изнутри".


 
Piter ©   (2005-02-03 16:40) [149]

Digitman ©   (03.02.05 15:50) [148]
да точно так же как и при правке "изнутри".


хм... вероятно, это расчитано на то, что ImageDirectoryEntryToData будет выполняться одинаково, что в нашем процессе, что в удаленном?
Но тогда такой метод перехвата подходит только для библиотек, которые обязательно грузятся по своему предпочтительному базовому адресу?

А если я хочу перехватить функцию из, например, USER32? Или он тоже грузится всегда по своему предпочтительному адресу?

В любом случае, метод не такой универсальный - так не перехватишь функции из любых библиотек...


 
Kerk ©   (2005-02-03 16:44) [150]

Piter ©   (03.02.05 16:40) [149]
если я хочу перехватить функцию из, например, USER32? Или он тоже грузится всегда по своему предпочтительному адресу?


А какая разница? Мы же IAT правим.


 
Eraser ©   (2005-02-03 17:27) [151]

Piter ©
При этом кстати в разных версиях видов адрес отличается...


 
Digitman ©   (2005-02-03 17:43) [152]


> Eraser ©   (03.02.05 17:27) [151]


ты же оба процесса имеешь не в разных версиях, а в одной и той же)



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

Форум: "WinAPI";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.92 MB
Время: 0.044 c
1-1110103366
ceval
2005-03-06 13:02
2005.03.20
Подскажите пожалуста процедуру


1-1110013855
msgipss
2005-03-05 12:10
2005.03.20
Вопрос заварника про this


11-1092815679
Platon
2004-08-18 11:54
2005.03.20
Не могу создать проект MCK


3-1108713713
AlexandrKu
2005-02-18 11:01
2005.03.20
Как в хранимой процедуре посчитать среднехронологические значения


14-1109196159
Случайно забредший
2005-02-24 01:02
2005.03.20
Где там галочку поставить, чтоб ехешник работал без Дельфи?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский