首页
社区
课程
招聘
[求助]关于内存写入注入的问题
发表于: 2020-6-6 17:21 4138

[求助]关于内存写入注入的问题

2020-6-6 17:21
4138

本人练习使用内存写入的方式来注入dll的练习,但是在练习的过程中出现这样的问题,具体情况如图,我的思路是在创建远程线程的时候自己写它的线程函数,把参数设置为我远程注入dll的模块基址,这样的目的是远程线程执行的时候,将远程注入的dll的IAT表进行修复,但是好像是远程线程创作失败了,不知道什么原因,求指导一下
特别说明一下:问题难搞,特别想知道怎么解决,求各位大神能详细一点,也请水贴的绕过,诚心求教


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 15
活跃值: (3581)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

网上有远程线程注入源码,自己对比看看。

最后于 2020-6-7 06:00 被麻木的时间编辑 ,原因:
2020-6-7 04:08
0
雪    币: 9218
活跃值: (1640)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
3
是不是要VirtualProtect修改模块属性,可以用getLastError获取值看看是什么原因吧
2020-6-7 09:08
0
雪    币: 1151
活跃值: (244)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
严启真 是不是要VirtualProtect修改模块属性,可以用getLastError获取值看看是什么原因吧
我想原因找到了,是因为我的线程函数是在自己的代码里面写的,地址不是目标函数的地址,所以远程的时候在目标进程中找不到线程函数,拿着怎么修改啊??有点不会了
2020-6-7 11:02
0
雪    币: 248
活跃值: (1096)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
用SHELLCODE把要用的函数地址找出来。
2020-6-7 12:36
0
雪    币: 1151
活跃值: (244)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
sixL 用SHELLCODE把要用的函数地址找出来。
不用shellcode可以吗??我的线程函数就是实现修复IAT表的功能,但是如果在本地的程序运行的话,就错了,我是想把这个修复IAT表的代码写到目标的进程中去,然后在目标进程中运行修复,这个操作怎么做啊??有点不会
2020-6-7 15:44
0
雪    币: 9218
活跃值: (1640)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
7
你搞个dll注入不就解决了?注入加载dll的代码…
2020-6-7 19:06
0
雪    币: 1151
活跃值: (244)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
严启真 你搞个dll注入不就解决了?注入加载dll的代码…
我这个本来就是注入,就是注入加载dll的
2020-6-7 21:55
0
雪    币: 9218
活跃值: (1640)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
9
没懂,我也小白,不过我认为,所有操作应放dll里,包括创建线程和线程函数,exe只负责加载dll,dll注入了远程进程成功就可为所欲为…
2020-6-7 22:31
0
雪    币: 15
活跃值: (3581)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10

把代码全部贴出来,我帮你调试一下。你远程线程运行了吗? 要是运行了就没问题了。

最后于 2020-6-7 23:23 被麻木的时间编辑 ,原因:
2020-6-7 23:22
0
雪    币: 1151
活跃值: (244)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
麻木的时间 把代码全部贴出来,我帮你调试一下。你远程线程运行了吗? 要是运行了就没问题了。

代码有些多,而且还有界面等东西,所以只能给你发一下实现的函数,另外这个是滴水课程的隐藏模块那一节的练习

我写的代码是这样的
BOOL writemem(HWND hdlg)
{
HWND wen1;
HWND wen2;
DWORD pid;
HMODULE hdllname=NULL;
DWORD dllcode=0;
//获得注入文件路径
TCHAR buffer[30];
memset(buffer,0,30);
wen1=GetDlgItem(hdlg,IDC_EDIT1);
wen2=GetDlgItem(hdlg,IDC_EDIT2);
GetWindowText(wen2,buffer,30);
void* pfilebuffer=NULL;
peread(buffer,&pfilebuffer);
if(!pfilebuffer)
{
return FALSE;
}
PIMAGE_DOS_HEADER pdos=NULL;
PIMAGE_FILE_HEADER pfile=NULL;
PIMAGE_OPTIONAL_HEADER32 poptional=NULL;
PIMAGE_DATA_DIRECTORY pdata=NULL;
PIMAGE_BASE_RELOCATION pbase=NULL;
pdos=(PIMAGE_DOS_HEADER)pfilebuffer;
pfile=(PIMAGE_FILE_HEADER)((DWORD)pfilebuffer+pdos->e_lfanew+4);
poptional=(PIMAGE_OPTIONAL_HEADER32)((DWORD)pfile+20);
pdata=(PIMAGE_DATA_DIRECTORY)((DWORD)poptional+96);
pbase=(PIMAGE_BASE_RELOCATION)((DWORD)pfilebuffer+rvatofoa(pfilebuffer,(pdata+5)->VirtualAddress));
DWORD sizeofimage=poptional->SizeOfImage;
//打开注入进程
memset(buffer,0,30);
GetWindowText(wen1,buffer,30);
sscanf(buffer,"%d",&pid);
HANDLE hproc=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
char* mem=(char*)VirtualAllocEx(hproc,NULL,sizeofimage,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
//修复重定位表
DWORD oldimagebase=poptional->ImageBase;
poptional->ImageBase=(DWORD)mem;
while(pbase->SizeOfBlock && pbase->VirtualAddress)
{
PWORD pnum=(PWORD)((DWORD)pbase+8);
for(DWORD i=0;i<((pbase->SizeOfBlock)-8)/2;i++)
{
WORD low=pnum[i]&0x0fff;
WORD hig=(pnum[i]&0xf000)>>12;
if(hig==3)
{
DWORD rva=(DWORD)low+pbase->VirtualAddress;
//修改重定位地址
PDWORD offset=(PDWORD)((DWORD)pfilebuffer+rvatofoa(pfilebuffer,rva));
*offset=*offset-oldimagebase+poptional->ImageBase;
}
}
pbase=(PIMAGE_BASE_RELOCATION)((DWORD)pbase+pbase->SizeOfBlock);
}
WriteProcessMemory(hproc,mem,pfilebuffer,sizeofimage,0);
free(pfilebuffer);
HANDLE thread=CreateRemoteThread(hproc,NULL,0,(LPTHREAD_START_ROUTINE)mem,0,0,NULL);
if (!thread)
{
VirtualFreeEx(hproc,mem,0,MEM_RELEASE);
CloseHandle(hproc);
return FALSE;
}
WaitForSingleObject(thread,-1);
GetExitCodeThread(thread,&dllcode);
hdllname=(HMODULE)dllcode;
VirtualFreeEx(hproc,mem,sizeofimage,MEM_DECOMMIT);
CloseHandle(hproc);
return TRUE;
}

2020-6-8 10:43
0
游客
登录 | 注册 方可回帖
返回
//