DLLInject.pas
上传用户:sinothink
上传日期:2022-07-15
资源大小:459k
文件大小:6k
源码类别:

远程控制编程

开发平台:

Delphi

  1. {
  2.   DLLInject Unit One For 9x,nt,2k,xp,2k3 By Anskya
  3.   Email:Anskya@Gmail.com
  4.   Web:http://Www.Anskya.Net
  5.   DLL进程插入单元 For Delphi
  6.   可以在9x,Nt,2K,Xp,2K3下工作
  7.   采用远程线程注入LoadLibraryA('xxx.dll');代码
  8.   来进行DLL插入
  9. example:
  10. DNADLL('explorer.exe','c:test.dll');
  11. }
  12. unit DLLInject;
  13. interface
  14. uses windows;
  15.   function DNADLL(Name: string;DLLPath: PChar):Boolean;  //进程插入函数
  16.   procedure killbyPID(PID: DWORD);                      //关闭进程
  17. function xVirtualAllocEx(hProcess: LongWord; lpAddress: Pointer; dwSize: LongWord; flAllocationType: LongWord; flProtect: LongWord): Pointer; stdcall; external;
  18. function xVirtualFreeEx(hProcess: LongWord; lpAddress: Pointer; dwSize: LongWord; dwFreeType: LongWord): Boolean; stdcall; external;
  19. function xCreateRemoteThread(hProcess: LongWord; lpThreadAttributes: Pointer; dwStackSize: LongWord; lpStartAddress: Pointer; lpParameter: Pointer; dwCreationFlags: LongWord; lpThreadId: Pointer): LongWord; stdcall; external;
  20. implementation
  21. {$L EliRT_OMF_B.obj}
  22. //function xVirtualAllocEx(hProcess: LongWord; lpAddress: Pointer; dwSize: LongWord; flAllocationType: LongWord; flProtect: LongWord): Pointer; stdcall; external;
  23. //function xVirtualFreeEx(hProcess: LongWord; lpAddress: Pointer; dwSize: LongWord; dwFreeType: LongWord): Boolean; stdcall; external;
  24. //function xCreateRemoteThread(hProcess: LongWord; lpThreadAttributes: Pointer; dwStackSize: LongWord; lpStartAddress: Pointer; lpParameter: Pointer; dwCreationFlags: LongWord; lpThreadId: Pointer): LongWord; stdcall; external;
  25. const
  26.  TH32CS_SnapProcess = 2;
  27. type
  28.   TProcessEntry32 = record
  29.     dwSize: DWORD;
  30.     cntUsage: DWORD;
  31.     th32ProcessID: DWORD;
  32.     th32DefaultHeapID: DWORD;
  33.     th32ModuleID: DWORD;
  34.     cntThreads: DWORD;
  35.     th32ParentProcessID: DWORD;
  36.     pcPriClassBase: integer;
  37.     dwFlags: DWORD;
  38.     szExeFile: array [0..MAX_PATH-1] of char;
  39.   end;
  40. procedure killbyPID(PID: DWORD);
  41. var
  42.   hp : THANDLE;
  43. begin
  44.   hp := OpenProcess(PROCESS_TERMINATE, False, PID);
  45.   TerminateProcess(hp, 0);
  46. end;
  47. Const SE_DEBUG_NAME = 'SeDebugPrivilege' ;
  48. procedure GetDebugPrivs;                    //提升进程权限
  49. var
  50.   hToken: THandle;
  51.   tkp: TTokenPrivileges;
  52.   retval: dword;
  53. begin
  54.   If (OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)) then
  55.   begin
  56.     LookupPrivilegeValue(nil, SE_DEBUG_NAME  , tkp.Privileges[0].Luid);
  57.     tkp.PrivilegeCount := 1;
  58.     tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
  59.     AdjustTokenPrivileges(hToken, False, tkp, 0, nil, retval);
  60.   end;
  61. end;
  62. function LowerCase(const S: string): string;
  63. var
  64.   Ch: Char;
  65.   L: Integer;
  66.   Source, Dest: PChar;
  67. begin
  68.   L := Length(S);
  69.   SetLength(Result, L);
  70.   Source := Pointer(S);
  71.   Dest := Pointer(Result);
  72.   while L <> 0 do
  73.   begin
  74.     Ch := Source^;
  75.     if (Ch >= 'A') and (Ch <= 'Z') then Inc(Ch, 32);
  76.     Dest^ := Ch;
  77.     Inc(Source);
  78.     Inc(Dest);
  79.     Dec(L);
  80.   end;
  81. end;
  82. function InjectLibrary(Process: LongWord; DLLPath: PChar): Boolean;
  83. var
  84.   Parameters: Pointer;
  85.   BytesWritten, Thread, ThreadID: dword;
  86. begin
  87.   Result := False;
  88.   Parameters := xVirtualAllocEx(Process, nil, 4096, MEM_COMMIT, PAGE_READWRITE);
  89.   if Parameters = nil then Exit;
  90.   WriteProcessMemory(Process, Parameters, Pointer(DLLPath), 4096, BytesWritten);
  91.   Thread := xCreateRemoteThread(Process, nil, 0, GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'LoadLibraryA'), Parameters, 0, @ThreadId);
  92.   WaitForSingleObject(Thread, 3000);
  93.   xVirtualFreeEx(Process, Parameters, 0, MEM_RELEASE);
  94.   if Thread = 0 then Exit;
  95.   CloseHandle(Thread);
  96.   Result := True;
  97. end;
  98. var
  99.   pCreateToolhelp32Snapshot : function (dwFlags, th32ProcessID: cardinal) : cardinal; stdcall = nil;
  100.   pProcess32First :  function (hSnapshot: cardinal; var lppe: TProcessEntry32) : bool; stdcall = nil;
  101.   pProcess32Next  :  function (hSnapshot: cardinal; var lppe: TProcessEntry32) : bool; stdcall = nil;
  102. function TestToolhelpFunctions : boolean;
  103. var c1 : cardinal;
  104. begin
  105.   c1:=GetModuleHandle('kernel32');
  106.   @pCreateToolhelp32Snapshot:=GetProcAddress(c1,'CreateToolhelp32Snapshot');
  107.   @pProcess32First:=GetProcAddress(c1,'Process32First');
  108.   @pProcess32Next:=GetProcAddress(c1,'Process32Next');
  109.   result := (@pCreateToolhelp32Snapshot<>nil) and (@pProcess32First<>nil) and (@pProcess32Next<>nil);
  110. end;
  111. function CreateToolhelp32Snapshot (dwFlags,th32ProcessID: cardinal) : cardinal;
  112. begin
  113.   result := 0;
  114.   if @pCreateToolhelp32Snapshot = nil then if not TestToolhelpFunctions then exit;
  115.   result := pCreateToolhelp32Snapshot( dwFlags , th32ProcessID );
  116. end;
  117. function Process32First(hSnapshot: cardinal; var lppe: TProcessEntry32) : bool;
  118. begin
  119.   result := false;
  120.   if @pProcess32First = nil then if not TestToolhelpFunctions then exit;
  121.   result := pProcess32First(hSnapshot,lppe);
  122. end;
  123. function Process32Next(hSnapshot: cardinal; var lppe: TProcessEntry32) : bool;
  124. begin
  125.    result := false;
  126.    if @pProcess32Next = nil then if not TestToolhelpFunctions then exit;
  127.    result := pProcess32Next(hSnapshot,lppe);
  128. end;
  129. function DNADLL(Name: string;DLLPath: PChar):Boolean;
  130. var
  131.   FSnapshotHandle: THandle;
  132.   FProcessEntry32: TProcessEntry32;
  133.   ProcessHandle:dword;
  134.   ContinueLoop: BOOL;
  135. begin
  136.   Result := False;
  137.   GetDebugPrivs;
  138.   FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  139.   FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
  140.   ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
  141.   Name:=LowerCase(Name);
  142.   While ContinueLoop do
  143.   begin
  144.     If Name = LowerCase(FProcessEntry32.szExeFile) then
  145.     begin
  146.       ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, FProcessEntry32.th32ProcessID);
  147.       if InjectLibrary(ProcessHandle, DLLPath) then Result := True;
  148.       Break;
  149.     end;
  150.     ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
  151.   end;
  152.   CloseHandle(FSnapshotHandle);
  153. end;
  154. end.