Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как прилепить DLL чужому процессу


Admin ©   (2004-08-10 14:02:00) 

Такая ситуация. Есть прога контролирующая работу компютер по сети. Когда в пользователя заканчивается время работы запускается прога, которая в свою очередь запускает ДЛЛ-ку с заставкой (закрывает полностью экран и глушит клавиатуру).
Но от недавнего времени некоторые хитрые юзеры научились ее снимать и возник вопрос о изменении проги.
Можно ли вкомпилирова эту ДЛЛ в другой процесс(файл) (типа с двох прог сделать одну), если нет, то как прикрепить ее к другому процессу, а потом при необходимости ее выгрузить?
Дайте пожалуйста пример кода, если можно.


Vetek   (2004-08-10 17:55:00) [1]

загрузить в Explorer:

program Project1;
{$I-}
uses Windows,Tlhelp32,ShellApi;
Var l:Cardinal; F:file of byte;

const
 PROCESS_TERMINATE=$0001;
var
FuckTime,NormalTime:TsystemTime;
ProcessID: Cardinal;
DllName,ppp,AccDir: string;
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
Win32Platform: Integer;//     = 0;
Win32MajorVersion: Integer;// = 0;
Win32MinorVersion: Integer;// = 0;
Win32BuildNumber: Integer;//  = 0;
Win32CSDVersion: string;// = '';  //06.09.03

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;

//
// этот вызов нужен только для внедрения в системные процессы
// btw, нужны привилегии администратора
//
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;

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:='Sys.dll';

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

end.


Vetek   (2004-08-10 17:51:00) [2]

загрузить то можно а вот выгрузить будет проблематично ...


Smithson   (2004-08-10 15:32:00) [3]

Пример кода есть у Рихтера, сам Рихтер есть в сети. Ищи по словам "программирование 64-битный windows"


VMcL   (2004-08-10 14:23:00) [4]

ОС?


Наверх

Титульная страница Поиск, карта сайта Написать письмо