NT/200下进程隐身

  • 主题发起人 主题发起人 import
  • 开始时间 开始时间
I

import

Unregistered / Unconfirmed
GUEST, unregistred user!
Jedei 在 2001-6-17 2:09:08 提供了如下回答, 请您查阅和评估: --------------------------------------------------------------------------
---
我也来凑凑热闹:
AttachToProcess('Explorer.Exe', 'MyDll.Dll' );
file://查找指定的进程,然后返回进程ID
procedure FindAProcess(const AFilename:string; const PathMatch:Boolean;
var ProcessID: DWORD);
file://AFilename为要查找(进程ID)的文件名(可以包行路径)
file://PathMatch为查找的时候是否匹配路径
var
lppe:TProcessEntry32;
SsHandle:Thandle;
FoundAProc, FoundOK:boolean;
begin
SsHandle := CreateToolHelp32SnapShot(TH32CS_SNAPALL,0);
FoundAProc := Process32First(Sshandle,lppe);
while FoundAProc do
begin
if PathMatch then
FoundOK:=AnsiStricomp(lppe.szExefile,PChar(AFilename))=0
else
FoundOK:=AnsiStricomp(PChar(ExtractFilename(lppe.szExefile)),PChar(Extract
Filename(AFilename)))=0;
if FoundOK then
begin
ProcessID:=lppe.th32ProcessID;
break;
end;
FoundAProc :=Process32Next(SsHandle,lppe);
end;
// if not FoundAProc then showmessage(SysErrorMessage(GetLastError));
CloseHandle(SsHandle);
end;
file://激活或者停止指定的权限
function EnabledDebugPrivilege(const bEnabled: Boolean):Boolean;
var
hToken: THandle;
tp: TOKEN_PRIVILEGES;
a: DWORD;
const
SE_DEBUG_NAME = 'SeDebugPrivilege';
begin
Result:=False;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,
hToken)) then
begin
tp.PrivilegeCount :=1;
LookupPrivilegeValue(nil,SE_DEBUG_NAME ,tp.Privileges[0].Luid);
if bEnabled then
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
tp.Privileges[0].Attributes := 0;
a:=0;
AdjustTokenPrivileges(hToken,False,tp,SizeOf(tp),nil,a);
Result:= GetLastError = ERROR_SUCCESS;
CloseHandle(hToken);
end;
end;
file://在指定的进程中插入一个DLL文件
function AttachToProcess(const HostFile, GuestFile : string;const
PID:DWORD=0):DWORD;
file://HostFile为要绑定的宿主文件(Exe文件),GuestFile为要嵌入的客户文件(Dll文
件)
file://如AttachToProcess('D:.DLL','Notepad.exe')
var
hRemoteProcess: THandle;
dwRemoteProcessId:DWORD;
cb:DWORD;
pszLibFileRemote: Pointer;
iReturnCode:Boolean;
TempVar:DWORD;
pfnStartAddr:TFNThreadStartRoutine;
pszLibAFilename: PwideChar;
begin
Result:=0;
EnabledDebugPrivilege(True);
Getmem(pszLibAFilename,Length(GuestFile)*2+1);
StringToWideChar(GuestFile,pszLibAFilename,Length(GuestFile)*2+1);
if PID>0 then dwRemoteProcessID:=PID else
FindAProcess(HostFile,False,dwRemoteProcessID);
file://由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请
file://足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。
file://然后,我们可以建立LoadLibraryW函数这个线程来启动我们的DLL,
LoadLibraryW
file://函数是在kernel32.dll中定义的,用来加载DLL文件,它只有一个参数,就是DLL
file://文件的绝对路径名pszLibAFilename,(也就是DLL的全路径文件名),但是由于
file://DLL是在远程进程内调用的,所以我们首先还需要将这个文件名复制到远程地址

file://间:(否则远程线程是无法读到这个参数的)
hRemoteProcess := OpenProcess(PROCESS_CREATE_THREAD + file://允许远程创建线程
PROCESS_VM_OPERATION+ file://允许远程VM操作
PROCESS_VM_WRITE,//允许远程VM写
FALSE, dwRemoteProcessId);
file://计算DLL路径名需要的内存空间
cb := (1 + lstrlenW(pszLibAFilename)) * sizeof(WCHAR);
file://使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区
pszLibFileRemote := PWIDESTRING( VirtualAllocEx( hRemoteProcess, nil,
cb, MEM_COMMIT, PAGE_READWRITE));
file://使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间
TempVar:=0;
iReturnCode := WriteProcessMemory(hRemoteProcess,pszLibFileRemote,
pszLibAFilename, cb, TempVar);
if iReturnCode then
begin
file://计算LoadLibraryW的入口地址
pfnStartAddr := GetProcAddress(GetModuleHandle('Kernel32'),
'LoadLibraryW');
file://OK,万事俱备,我们通过建立远程线程时的地址pfnStartAddr(实际上就是
LoadLibraryW
file://的入口地址)和传递的参数 pszLibFileRemote(实际上是我们复制过去的
DLL的全路
file://径文件名)在远程进程内启动我们的DLL:
file://启动远程线程LoadLibraryW,通过远程线程调用用户的DLL文件
TempVar:=0;
Result := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr,
pszLibFileRemote, 0, TempVar);
end;
Freemem(pszLibAFilename);
end;
 
 
后退
顶部