首页
社区
课程
招聘
关于不同进程的loadlibrary,输入表的问题
发表于: 2010-2-9 13:30 3786

关于不同进程的loadlibrary,输入表的问题

2010-2-9 13:30
3786
不知道问题放在这里合适不合适,望版主见谅

typedef struct _RemoteParam
{
        char szMsg[12];     //MessageBox函数显示的字符串
        DWORD dwMessageBox;//MessageBox函数的入口地址
        DWORD dwExitThread;//ExitThread函数的入口地址
        DWORD dwSleep;                //Sleep函数的入口地址
        DWORD dwLoadLib;
        char szdll[256];
} RemoteParam, * PRemoteParam;

//定义MessageBox类型的函数指针
typedef int (__stdcall * PFN_MESSAGEBOX)(HWND, LPCTSTR, LPCTSTR, DWORD);

typedef int (__stdcall * PFN_EXITTHREAD)(DWORD);

typedef int (__stdcall * PFN_LOADLIBRARY)(LPCTSTR);

        RemoteParam remoteData;
        ZeroMemory(&remoteData, sizeof(RemoteParam));
       
        HINSTANCE hUser32 = LoadLibrary("User32.dll");
        HINSTANCE hKernel32 =  LoadLibrary("Kernel32.dll");

        remoteData.dwMessageBox = (DWORD)GetProcAddress(hUser32, "MessageBoxA");
        remoteData.dwExitThread = (DWORD)GetProcAddress(hKernel32,"ExitThread");
        remoteData.dwLoadLib = (DWORD)GetProcAddress(hKernel32,"LoadLibraryA");
        strcat(remoteData.szMsg, "Hello");
        strcat(remoteData.szdll, "D:\\project\\vc6\\csCrack\\bin\\ogc.dll");

        //在宿主进程中分配存储空间
        RemoteParam* pRemoteParam = (RemoteParam*)/*VirtualAllocExPtr*/VirtualAllocEx(pProcInfo->hProcess, 0, sizeof(RemoteParam), MEM_COMMIT, PAGE_READWRITE);
        if (!pRemoteParam)
        {
                MessageBox(NULL, "Alloc memory failed !", "Notice", MB_ICONINFORMATION | MB_OK);
                return 0;
        }
        //将字符串和MessageBox函数的入口地址写入宿主进程
        if (!WriteProcessMemory(pProcInfo->hProcess,pRemoteParam, &remoteData, sizeof(remoteData), 0))
        {
                MessageBox(NULL, "Write data to target process failed !", "Notice", MB_ICONINFORMATION | MB_OK);
                return 0;
        }
        hRemoteThread = CreateRemoteThread(        pProcInfo->hProcess, NULL, 0,
                (DWORD(__stdcall *)(void*))pRemoteThread, pRemoteParam, 0, &dwRemoteThreadID);       
        // wait until the thread finishes
        WaitForSingleObject(hRemoteThread, INFINITE);

//线程函数定义
DWORD __stdcall threadProc(LPVOID lParam)
{
        RemoteParam* pRP = (RemoteParam*)lParam;
        PFN_EXITTHREAD pfnExitThread = (PFN_EXITTHREAD)pRP->dwExitThread;
        PFN_MESSAGEBOX pfnMessageBox = (PFN_MESSAGEBOX)pRP->dwMessageBox;
        PFN_LOADLIBRARY pfnLoadLib = (PFN_LOADLIBRARY)pRP->dwLoadLib;
        pfnMessageBox(NULL, pRP->szdll, pRP->szdll, 0);
//        pfnLoadLib(pRP->szdll);
        pfnMessageBox(NULL, pRP->szMsg, pRP->szMsg, 0);
//        pfnExitThread(5);
        return 0;
}

这个通过一个结构把函数的ExitThread等函数地址传给远程线程,但是他们并不是在同一地址空间,难道在两个不同的进程中用LoadLibrary后GetProcAddress得到的某动态库的某个函数的地址是一样的么?很质疑

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 172
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
“在任何版本的Windows中,3个基本的DLL总是被加载(Kernel32.DLL,User32.DLL,GDI32.DLL),而且对于同一个版本的Windows,它们的Image Base,和导出函数的地址总是固定的。”
找到了一些这样的解释,希望高手们可以出来谈谈你自己的看法
2010-2-9 13:50
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
3
呵呵,Kernel32.DLL,User32.DLL,GDI32.DLL 这些个动态库都是系统启动时加载在内存中的。
在新进程建立的时候会从内存中映射一份到自己的4G内存当中,他们基址在不同进程中都是一样的。
可以看看有关 KnownDLL的知识
2010-2-9 13:55
0
雪    币: 172
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢版主的回答。关于你说的KnownDLL我搜索了下,但是没有查到什么。
但是我做了一个实验,我把连接的基地址设置在了0x7c800000,连接程序运行成功,但是生产的程序不能运行,在运行时提示“系统的kernel32.dll在内存中重定位,应用程序将不能运行....”
---------是不是knowndll还包括shell32.dll,ntdll.dll,secur32.dll等等系统的动态库。
我试了一下,并不是所有的系统动态库都不可重定位,例如shell32.dll,这些事可以重定位的,我试出来的有Kernel32.DLL,User32.DLL,GDI32.DLL(这个没试),ntdll.dll这些事不能被重定位的。
2010-2-9 16:33
0
游客
登录 | 注册 方可回帖
返回
//