Текущий архив: 2005.03.20;
Скачать: CL | DM;
Вниз
CreateRemoteThread??? Найти похожие ветки
← →
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...
Страницы: 1 2 3 4 вся ветка
Текущий архив: 2005.03.20;
Скачать: CL | DM;
Память: 0.67 MB
Время: 0.043 c