Форум: "WinAPI";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
ВнизКак прилепить DLL чужому процессу Найти похожие ветки
← →
Admin (2004-08-10 14:02) [0]Такая ситуация. Есть прога контролирующая работу компютер по сети. Когда в пользователя заканчивается время работы запускается прога, которая в свою очередь запускает ДЛЛ-ку с заставкой (закрывает полностью экран и глушит клавиатуру).
Но от недавнего времени некоторые хитрые юзеры научились ее снимать и возник вопрос о изменении проги.
Можно ли вкомпилирова эту ДЛЛ в другой процесс(файл) (типа с двох прог сделать одну), если нет, то как прикрепить ее к другому процессу, а потом при необходимости ее выгрузить?
Дайте пожалуйста пример кода, если можно.
← →
VMcL © (2004-08-10 14:23) [1]ОС?
← →
Smithson © (2004-08-10 15:32) [2]Пример кода есть у Рихтера, сам Рихтер есть в сети. Ищи по словам "программирование 64-битный windows"
← →
Vetek © (2004-08-10 17:51) [3]загрузить то можно а вот выгрузить будет проблематично ...
← →
Vetek © (2004-08-10 17:55) [4]загрузить в 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.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.051 c