关于进程代码注入的问题

wuzaixiang 2008-07-13 12:34:03
我的程序里有一段汇编的代码

我要将其注入到另一个进程内~

但是用WriteProcessMemory写进去以后用SYSER调试发现写进去的全是JMP代码

而我的汇编代码不是这些啊~是什么问题呢~?

请高手 解答~~谢谢
...全文
103 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaoteng1984 2008-07-16
  • 打赏
  • 举报
回复
关键是这里:

hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, processEntry.th32ProcessID);

WriteProcessMemory(hProcess,
&array,
writeContent,
10,
&realWritten);

PROCESS_ALL_ACCESS是对进程内存的访问权限,设的权限不够就不能写目标进程的内存。
gaoteng1984 2008-07-16
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>
#include <stdlib.h> // _MAX_PATH, _wsplitpath
#include <string.h> // wcscmp


int main()
{
char input;

char array[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
char buf[11];
char *writeContent = "1234567890";

WCHAR currentExeName[_MAX_PATH];
GetModuleFileName(NULL, currentExeName, _MAX_PATH);
wchar_t drive[_MAX_PATH];
wchar_t dir[_MAX_PATH];
wchar_t fname[_MAX_PATH];
wchar_t ext[_MAX_PATH];
_wsplitpath(currentExeName, drive, dir, fname, ext);
wsprintf(currentExeName, L"%s%s", fname, ext);

HANDLE snapShot = NULL;
snapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snapShot == INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot fails.\n");
return -1;
}

PROCESSENTRY32 processEntry;
processEntry.dwSize = sizeof(processEntry);
bool ret = FALSE;
ret = Process32First(snapShot, &processEntry);
while(ret)
{
//wprintf(L"Name:%s\tProcessId:%d\tThreads:%d\n",
// processEntry.szExeFile,
// processEntry.th32ProcessID,
// processEntry.cntThreads);
if (0 == wcscmp(processEntry.szExeFile, currentExeName))
{// exe文件名跟自己一样
if (processEntry.th32ProcessID != GetCurrentProcessId())
{// 进程id与自己不同
// 往别的进程里写数据。
HANDLE hProcess = NULL;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, processEntry.th32ProcessID);
if (NULL == hProcess)
{
printf("This process can't be opened.\n");
}
else
{
SIZE_T realWritten = 0;
WriteProcessMemory(hProcess,
&array,
writeContent,
10,
&realWritten);
}
CloseHandle(hProcess); hProcess = NULL;

// 从别的进程里读数据。
memset(array, 'a', 10); // 先把自己的array设成全a,再看别人的。
SIZE_T realRead = 0;
memset(buf, 0, 11);
Toolhelp32ReadProcessMemory(processEntry.th32ProcessID,
&array,
buf,
sizeof(array),
&realRead);
printf("%s\n", buf);
}
}
ret = Process32Next(snapShot, &processEntry);
}

CloseHandle(snapShot); snapShot = NULL;

system("pause"); // 暂停一下,让进程等着,别死。

return 0;
}


这是我写的一个写其他进程内存的例子,可以运行成功的。
使用方法:
在VS2005里,多次运行这个程序(别关闭以前的),后启动的进程,回往以前启动的进程里,写入数据,然后再读出来输出。
做鸡真好吃 2008-07-15
  • 打赏
  • 举报
回复
mark!
gaoteng1984 2008-07-15
  • 打赏
  • 举报
回复
楼主确信目标进程的内存被写入了吗?
我怀疑目标进程的内存根本没有被写入,原来就是些JMP代码。
使用WriteProcessMemory之前,要先用VirtualProtectEx将目标进程内存属性变成可读写。如果不使用VirtualProtectEx,目标进程代码区的内存默认应该是可读可执行的吧。
sunlin7 2008-07-13
  • 打赏
  • 举报
回复
你看一下罗云赋的win32汇编教程,里面有代码注入的例子。
wuzaixiang 2008-07-13
  • 打赏
  • 举报
回复
没错。。。

汇编没错~~写内存的代码也没错

但是写进去的东西和我写的东西不一样。。
babanake 2008-07-13
  • 打赏
  • 举报
回复


HOHOHOHO , 这个还用问, 写错了哈

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧