Форум: "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
Смотрим ThreadProcDWORD WINAPI ThreadProc(
LPVOID lpParameter // thread data
);
WINAPI означает использование модели stdcall.
Это значит что один параметр должен быть прочитан из стека и удалён оттуда при возврате.
Смотрим LoadLibraryHMODULE 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