首页
社区
课程
招聘
[旧帖] [求助]网上一份示例代码 错误的? 0.00雪花
发表于: 2008-4-9 22:50 3125

[旧帖] [求助]网上一份示例代码 错误的? 0.00雪花

2008-4-9 22:50
3125
网上一份示例代码 我一眼看上去认为是错的 因为他把本进程的MSGBOX的地址 当成 notepad进程的msgbox地址用 因为动态加载DLL 有的时候代码位置会变 跟别人说了下 不这么认为 大家认为呢?

// aaa.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include "windows.h"

// ========== 定义一个代码结构,本例为一个对话框============
struct MyData
{
        char sz[64]; // 对话框显示内容
        DWORD dwMessageBox; // 对话框的地址
};

// ========== 远程线程的函数 ==============================
DWORD __stdcall RMTFunc(MyData *pData)
{
        typedef int(__stdcall*MMessageBox)(HWND,LPCTSTR,LPCTSTR,UINT);
        MMessageBox MsgBox = (MMessageBox)pData->dwMessageBox;
        MsgBox(NULL, pData->sz, NULL, MB_OK);
        return 0;
}
int main(int argc, char* argv[])
{
        // ===== 获得需要创建REMOTETHREAD的进程句柄 ===============================
        HWND hWnd = FindWindow("notepad", NULL); // 以NOTEPAD为例
        DWORD dwProcessId;
        ::GetWindowThreadProcessId(hWnd, &dwProcessId);
        HANDLE hProcess = OpenProcess(
        PROCESS_ALL_ACCESS,
        FALSE,
        dwProcessId);
       
        // ========= 代码结构 ================================================
        MyData data;
        ZeroMemory(&data, sizeof (MyData));
        strcat(data.sz, "对话框的内容.");
        HINSTANCE hUser = LoadLibrary("user32.dll");
        if (! hUser)
        {
                printf("Can not load library.\n");
                return 0;
        }
        data.dwMessageBox = (DWORD)GetProcAddress(hUser, "MessageBoxA");
        FreeLibrary(hUser);
        if (! data.dwMessageBox)
                return 0;
       
        // ======= 分配空间 ===================================================
        void *pRemoteThread
                = VirtualAllocEx(hProcess, 0,
                1024*4, MEM_COMMIT|MEM_RESERVE,
                PAGE_EXECUTE_READWRITE);
        if (! pRemoteThread)
                return 0;
        if (! WriteProcessMemory(hProcess, pRemoteThread, &RMTFunc, 1024*4, 0))
                return 0;
       
        MyData *pData
                = (MyData*)VirtualAllocEx(hProcess, 0,
                sizeof (MyData), MEM_COMMIT,
                PAGE_READWRITE);
        if (!pData)
                return 0;
       
        if (! WriteProcessMemory(hProcess, pData, &data, sizeof (MyData), 0))
                return 0;
       
        // =========== 创建远程线程 ===========================================
        HANDLE hThread
                = CreateRemoteThread(hProcess, 0,
                0, (LPTHREAD_START_ROUTINE)pRemoteThread,
                pData, 0, 0);
        if (! hThread)
        {
                printf("远程线程创建失败");
                return 0;
        }
        CloseHandle(hThread);
        VirtualFreeEx(hProcess, pRemoteThread, 1024*3, MEM_RELEASE);
        VirtualFreeEx(hProcess, pData, sizeof (MyData), MEM_RELEASE);
        CloseHandle(hProcess);
        printf("Hello World!\n");
        return 0;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
2
看不懂C..
2008-4-9 22:58
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
3
严格来说,是存在这个问题:在notepad进程中创建的远程线程,使用的MessageBoxA函数地址,是从示例程序进程中获取的。
不过,对于user32.dll这个系统dll来说,它在不同的进程中只要被加载,一般都是加载在同一个基址,因此本进程获取到的MessageBoxA函数地址,可以用于另一进程。
这份示例代码就是以这个为前提的。
2008-4-9 23:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
一看系统API就烦
2008-4-9 23:50
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
系统API加载都在同一地址.它这样应该可以滴.
2008-4-10 00:14
0
游客
登录 | 注册 方可回帖
返回
//