怎么将程序Test.dll嵌入Explorer.exe进程(100分)

  • 主题发起人 主题发起人 linjifan
  • 开始时间 开始时间
L

linjifan

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么将程序Test.dll嵌入Explorer.exe进程
 
这个问题真的很难吗?
 
主要搞不懂你到底是想做什么
 
下面是我的一个demo(也是收集整理来的):
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Tlhelp32,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure FindAProcess(const AFilename:string; const PathMatch:Boolean; var ProcessID: DWORD);
//AFilename为要查找(进程ID)的文件名(可以包行路径)
//PathMatch为查找的时候是否匹配路径
var
lppe:TProcessEntry32;
SsHandle:Thandle;
FoundAProc, FoundOK:boolean;
begin
SsHandle := CreateToolHelp32SnapShot(TH32CS_SNAPALL,0);
FoundAProc := Process32First(Sshandle,lppe);
//枚举Process,然后判断是否是所要查找的Process
while FoundAProc do
begin
//根据PathMatch的值来决定匹配的方式
if PathMatch then
FoundOK:=AnsiStricomp(lppe.szExefile,PChar(AFilename))=0
else
FoundOK:=AnsiStricomp(PChar(ExtractFilename(lppe.szExefile)),PChar(ExtractFilename(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;

//激活或者停止指定的权限
function EnabledDebugPrivilege(const bEnabled: Boolean):Boolean;
var
hToken: THandle;
tp: TOKEN_PRIVILEGES;
a: DWORD;
const
SE_DEBUG_NAME = 'SeDebugPrivilege';
begin
Result:=False;
//打开当前Process的令牌(我一直叫Token为令牌)
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken)) then
begin
//调整令牌的权限,也就是加上或者取消调试权限(SE_DEBUG_NAME)
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;

//在指定的进程中插入一个DLL文件
function AttachToProcess(const HostFile, GuestFile : string;const PID:DWORD=0):DWORD;
//HostFile为要绑定的宿主文件(Exe文件),GuestFile为要嵌入的客户文件(Dll文件)
//如AttachToProcess('Notepad.exe','D:/TESTDLL.DLL') ;
var
hRemoteProcess: THandle;
dwRemoteProcessId:DWORD;
cb:DWORD;
pszLibFileRemote: Pointer;
iReturnCode:Boolean;
TempVar:DWORD;
pfnStartAddr:TFNThreadStartRoutine;
pszLibAFilename: PwideChar;
begin
Result:=0;
//激活当前Process的SE_DEBUG_NAME权限,如果不激活的话,一些服务进程将无法
//打开
EnabledDebugPrivilege(True);

//给pszLibAFilename分配内存,为什么是Length(GuestFile)*2+1呢,因为咱们
//等一会儿,要调用函数LoadLibraryW,而LoadLibraryW函数需要的参数是WideChar型
Getmem(pszLibAFilename,Length(GuestFile)*2+1);
StringToWideChar(GuestFile,pszLibAFilename,Length(GuestFile)*2+1);

if PID>0 then dwRemoteProcessID:=PID else FindAProcess(HostFile,False,dwRemoteProcessID);
//由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请
//足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。
//然后,我们可以建立LoadLibraryW函数这个线程来启动我们的DLL,LoadLibraryW
//函数是在kernel32.dll中定义的,用来加载DLL文件,它只有一个参数,就是DLL
//文件的绝对路径名pszLibAFilename,(也就是DLL的全路径文件名),但是由于
//DLL是在远程进程内调用的,所以我们首先还需要将这个文件名复制到远程地址空
//间:(否则远程线程是无法读到这个参数的)
hRemoteProcess := OpenProcess(PROCESS_CREATE_THREAD + //允许远程创建线程
PROCESS_VM_OPERATION+ //允许远程VM操作
PROCESS_VM_WRITE,//允许远程VM写
FALSE, dwRemoteProcessId);

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

procedure TForm1.Button1Click(Sender: TObject);
begin
AttachToProcess('notepad.exe','f:/hook.dll') ; //在这里你就可以随意注入进程啦
AttachToProcess('Explorer.exe','f:/hook.dll'); //将hook.dll注入到中
end;

end.


这是一种注入方法/
还有一种是进程三级跳,就是通过主程序调用a.dll,然后再由a.dll调用b.dll,这时卸掉主程序,
a.dll就会自动卸载掉,而b.dll利用windows 中IE的一个漏洞还继续存在里面,这篇文章当时是一98为例子来说的,
我在win2000下没是实现,一当主程序关闭啦,我后面的两个dll就相继卸载了,如果你用的是98系统的话,
可以尝试一下,不过上种方法还是非常好使的,比较暴力哦
 
我是想样WINDOWS任务管理器,结束了我的软件的进程后,我的软件再自动复活!

我看过的一篇文张上说,先做一个起动程序的DLL文件!放到explorer.exe中!
当EXPLORER.EXE运行的时候DLL文件也运行,实时检测,我的软件是不是在运行之中,如果没有
运行它!

这样,如结束我的软件进程,我的软件也会自己复活的!

 
原来是要这样啊,你利用tlhelp32中的TPROCESS32ENTRY就可以查到系统进程列表啦,时时
检测你的进程是否存在,不在的话就调出来RUN 不就可以了吗,还有把你的EXE写成后台RUN
的方式。
 
非常简单:
开始菜单-->运行命令 regsvr32 path/test.dll即可
 
感谢aq100
 
用进程三级跳
作一个DLL,获取你要进入的程序的入口地址
这样DLL,就成为他的子进程,再在DLL中调入其他的 DLL
然后卸掉第一个DLL
OK
 
liaojianwei
道理我知道!
我要代码!
linjifan@hrbec.com
 
exe1 和exe2互相监视最简单了
你那样麻烦,还占系统资源,还不稳定
你写完了也会后愧,哈哈
 
除了做木马还能做什么

没关系的,做得好也是为国争光
 
后退
顶部