首页
社区
课程
招聘
[求助]远程注入
发表于: 2009-2-16 19:26 4494

[求助]远程注入

2009-2-16 19:26
4494
我在用远程载入dll的时候,dll是用BCB写的,里面有个窗体,一创建窗体就一闪消失了,我在网上查了下好像是当窗体创建后立即就调用摧毁函数摧毁了.
这是创建远程县城代码
// 试图打开目标进程
HANDLE hProcess = ::OpenProcess(PROCESS_VM_WRITE|PROCESS_CREATE_THREAD|
                                        PROCESS_VM_OPERATION, FALSE, dwProcessId);
if(hProcess == NULL)
        return FALSE;

// 在目标进程中申请空间,存放字符串pszDllName,作为远程线程的参数
int cbSize = (strlen(m_szDllName) + 1);
LPVOID lpRemoteDllName = ::VirtualAllocEx(hProcess, NULL, cbSize, MEM_COMMIT,
                                                PAGE_READWRITE);
::WriteProcessMemory(hProcess, lpRemoteDllName, m_szDllName, cbSize, NULL);

// 取得LoadLibraryA函数的地址,我们将以它作为远程线程函数启动
HMODULE hModule=::GetModuleHandle("kernel32.dll");
LPTHREAD_START_ROUTINE pfnStartRoutine =
        (LPTHREAD_START_ROUTINE)::GetProcAddress(hModule, "LoadLibraryA");
       

// 启动远程线程
HANDLE hRemoteThread = ::CreateRemoteThread(hProcess, NULL, 0,   pfnStartRoutine,
                                                lpRemoteDllName, 0, NULL);
if(hRemoteThread == NULL)
{
        ::CloseHandle(hProcess);
        return FALSE;
}
// 等待目标线程运行结束,即LoadLibraryA函数返回
::WaitForSingleObject(hRemoteThread, INFINITE);
       
::CloseHandle(hRemoteThread);
::CloseHandle(hProcess);
return TRUE;

下面是dll中的代码
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{

        switch(reason)
         {
            case DLL_PROCESS_ATTACH:
                    {
                        Form2=new TForm2(NULL);
                        Form2->Show();
                    }
            break;
            case DLL_PROCESS_DETACH:
                 break;
            case DLL_THREAD_ATTACH:
                 break;
            case DLL_THREAD_DETACH:
                 break;
         }
                return 1;
}
请问各位怎么样该才能使窗体一直存在.谢谢!~~~

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 476
活跃值: (307)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谁来救救我吧!~~~~~~~~
2009-2-17 09:13
0
雪    币: 92
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你把窗体的ESC事件过滤下。还有就是最好加一个触发事件的判断,不要在一加载的时候就show它。
2009-2-17 16:43
0
雪    币: 476
活跃值: (307)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好像是创建线程后,加载完了,线程结束,整个窗体就摧毁了,就是不知道该怎么弄!~~
2009-2-18 09:09
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
5
DllMain是在执行LoadLibrary的线程上下文中运行的。

只有创建窗口的操作,没有窗口的消息循环,窗口是无法正常使用的。

Delphi的窗体对象的消息循环是被封闭在Delphi的运行时内部的。外部dll中使用,恐怕不行。

只知道SDK的编程,不知道Delphi的结构,帮不上。
2009-2-18 09:45
0
雪    币: 476
活跃值: (307)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
哦,还是多谢各位了
2009-2-18 12:10
0
雪    币: 476
活跃值: (307)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
可是如果是在自己的程序里直接调用LoadLibrary,窗体能一直存在~~~~~~
2009-2-18 12:23
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
8
如果你用Delphi写程序来调用LoadLibrary,并且调用控制权就交回运行时,那当然可以显示了。因为运行的主循环就是一个线程范围的消息泵。

你试试LoadLibrary后马上将线程挂起,或睡眠,看看窗口还能不能正常工作。
2009-2-18 13:21
0
雪    币: 476
活跃值: (307)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
多谢版主的帮助,问题已解决了!~~~thx~~
问题是没加入消息循环,Dll的代码如下就对了。
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{

        switch(reason)
         {
            case DLL_PROCESS_ATTACH:
           {
                        Form2=new TForm2(NULL);
                        Form2->Show();
                        while(::GetMessage(&msg,NULL,0,0))
                        {
                          TranslateMessage(&msg);
                          DispatchMessage(&msg);
                        }
           }
            break;
            case DLL_PROCESS_DETACH:
                 break;
            case DLL_THREAD_ATTACH:
                 break;
            case DLL_THREAD_DETACH:
                 break;
         }
    return 1;
}
2009-2-19 09:27
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
10
123456
2009-2-19 22:34
0
游客
登录 | 注册 方可回帖
返回
//