有人对远程线程比较了解嘛?(50分)

  • 主题发起人 主题发起人 绝对新手
  • 开始时间 开始时间

绝对新手

Unregistered / Unconfirmed
GUEST, unregistred user!
我在用远程线程向一个进程插入了一个DLL
这个DLL的内容只有
begin
Form1:=TForm1.Create(nil);
Form1.Show;
end.

远程线程在跑完了DLLMAIN 就是上面那段代码之后就退出了
Form1也跟着消失了,好像被free了一样,里面的控件也跟着失效了(例如timer)
EXE的代码是
function ToProcess(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;
Getmem(pszLibAFilename,Length(GuestFile)*2+1);
StringToWideChar(GuestFile,pszLibAFilename,Length(GuestFile)*2+1);
if PID > 0 then
dwRemoteProcessID:=PID else
FindAProcess(HostFile,False,dwRemoteProcessID);
{ hRemoteProcess:=OpenProcess(PROCESS_CREATE_THREAD+//允许远程创建线程
PROCESS_VM_OPERATION+//允许远程VM操作
PROCESS_VM_WRITE,//允许远程VM写
FALSE,dwRemoteProcessId);
}
hRemoteProcess:=OpenProcess(PROCESS_ALL_ACCESS,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');
//启动远程线程LoadLibraryW,通过远程线程调用用户的DLL文件
TempVar:=0;
Result:=CreateRemoteThread(hRemoteProcess,nil,0,pfnStartAddr,pszLibFileRemote,0,TempVar);
end;
WaitForSingleObject(Result, INFINITE);
Freemem(pszLibAFilename);
CloseHandle(hRemoteProcess);
CloseHandle(Result);
VirtualFreeEx(hRemoteProcess, pszLibFileRemote, 0, MEM_RELEASE);
end;

那么如何使得这个DLL里的Form1能够不被free呢??
谢谢大家了
 
DllMain再建立一个线程, 由这个线程创建窗口并且作消息循环, 即可……
 
谢谢 这个我已经试过了 先创建了一个线程用的是delphi给的线程控件 然后我定义的线程中创建窗口 但是同样的结果 连线程也被free了
 
不过或许是我的方法不对 请刘大哥能不能写一个简单的源代码 我欣赏下 谢谢
 
我的源代码
工程文件里的:
library Project2;
{ Important... }
uses
SysUtils,
Classes,
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Main:=TMain.Create(True);
Main.FreeOnTerminate := False;
Main.Resume;
end.

单元文件里的:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
Tmain = class(TThread)
private
{ Private declarations }
protected
procedure Execute;
override;
end;

var
Form2: TForm2;
main: TMain;
implementation
{$R *.dfm}
Procedure TMain.Execute;
begin
Form2:=TForm2.Create(Form2);
Form2.Show;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
showmessage('1122');
end;

end.

运行结果是(比如目标进程是notepad.exe)弹了个窗(showmessage)后主窗口(From2)一闪就消失了,但是notepad的窗口正常
 
这个是用消息钩子进去的, http://www.2ccc.com/article.asp?articleid=1717
 
你的代码可以这样改:
Procedure TMain.Execute;
var
Msg: TMsg;
begin
Form2:=TForm2.Create(Form2);
Form2.Show;
while GetMessage(Msg, 0, 0, 0)do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
 
楼主失踪了???
 
麻子大哥
你改的那一段 怎么不好使呀
而且http://www.2ccc.com/article.asp?articleid=1717 这个程序中一放入窗体的话
怎么有的机器不好使呀.请教麻子大哥 给一个更好点的例子.
万分感谢!!!!!!!!!!!!!
 
帮顶!
╭=========================================╮
80G海量源代码,控件,书籍全免费狂下不停!
http://www.source520.com

╰=========================================╯
 
接受答案了.
 

Similar threads

后退
顶部