首页
社区
课程
招聘
[旧帖] [求助]远程进程代码注入失败,被注入的进程崩溃 0.00雪花
发表于: 2013-11-27 10:52 5626

[旧帖] [求助]远程进程代码注入失败,被注入的进程崩溃 0.00雪花

2013-11-27 10:52
5626
新人第一次发帖
自己是个业余的编程爱好者,再看了几本书之后自学的WINDOWS编程,前些天编了一个简单的远程注入程序,编译生成没问题,但是调试时一到HANDLE hThread=CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)c_injection,hAddr,0,NULL)这一步就会使得被注入进程崩溃,不知道是为什么,请各位不吝赐教,帮咱看看。

本人用的VS2010,按书上说的已经关闭了增量编译和ESP校验。
貌似可能是函数的内存地址传递出现问题,但不知道怎么改。

#include "stdafx.h"
#include "Windows.h"

static void WINAPI c_injection(LPVOID pParam)  //注入的线程函数(弹个没参数消息框)

{
_asm
{   pushad
        push 0
    push 0
        push 0
        push 0
        call [pParam]
        popad
}
}
static void  c_inj()
{}                     //空函数用来计算注入的线程函数大小

int _tmain(int argc, _TCHAR* argv[])
{
DWORD hprocessid=5476; //要注入的进程pid

printf("%d   %d\n",c_injection,c_inj);         //计算注入的函数大小以分配内存,得到线程函数大小32个字节

HMODULE Getmoduleaddr=LoadLibraryA("user32.dll");
LPVOID hAddr=GetProcAddress(Getmoduleaddr,"MessageBoxA");//获得函数的内存地址;

HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,TRUE,hprocessid);//获取进程句柄

LPVOID newbuffer=VirtualAllocEx(hProcess,NULL,32,MEM_COMMIT,PAGE_READWRITE);  //申请内存 (试过申请大点的内存,依然会使进程崩溃)
printf("newbuffer=%x\n",newbuffer);
WriteProcessMemory(hProcess,newbuffer,c_injection,32,NULL);//写入被注入的函数代码;

HANDLE hThread=CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)c_injection,hAddr,0,NULL);//,创建远方线程,线程函数注入

WaitForSingleObject( hThread, INFINITE);//等待远程线程结束
VirtualFreeEx( hProcess, newbuffer,32, MEM_DECOMMIT );

CloseHandle( hThread );
CloseHandle( hProcess );

        return 0;
}

在线坐等各位赐教

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

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
论坛里有很多也很详细,你自己搜搜吧~~
是不是 应该改为 CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)newbuffer,hAddr,0,NULL);??
2013-11-27 10:57
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
多谢回复,不过论坛里搜不到类似的。。。

另外,改成CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)newbuffer,hAddr,0,NULL);也会使进程崩溃。。
2013-11-27 11:10
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
某些函数是不是应该使用_declspec(naked)声明?
2013-11-27 11:29
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
望稍微详细赐教,把注入函数改为static void  _declspec(naked) c_injection(LPVOID pParam)还是不行。
2013-11-27 12:55
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
崩溃之后用od调试一下吧
2013-11-28 12:38
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
有Linux版本的吗?
2013-11-28 20:21
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
没有。。。
2013-11-29 10:54
0
雪    币: 28
活跃值: (223)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个问题很简单,因为你前面的
LPVOID hAddr=GetProcAddress(Getmoduleaddr,"MessageBoxA")
这个输入参数 hAddr
这个地址是你当前控制进程的,而不是被注入进程的MessageBoxA的地址,可能对于被注入的进程是一个非法地址,所以,你是会出现CRASHDUMP的情况,这个也就正常了。
如果你要解决这个问题,我这里有方案,但代码不太方便公开,你可以联系我。
2013-11-29 16:20
0
雪    币: 1453
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
hProcess = OpenProcess( dwDesiredAccess, FALSE, dwProcessId );
        if ( NULL == hProcess)
        {
                ....
        }

#ifdef UNICODE
        dwSize = (lstrlen(lpPluginPathName) + 1) * 2;
#else
        dwSize = lstrlen(lpPluginPathName) + 1;
#endif

        LPVOID lpBuffer = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);

        if ( NULL != lpBuffer )
        {
                if ( WriteProcessMemory( hProcess, lpBuffer, (LPVOID)lpPluginPathName, dwSize, &dwWritten ) )
                {
                        if ( dwWritten != dwSize )
                        {
                                VirtualFreeEx( hProcess, lpBuffer, dwSize, MEM_DECOMMIT );
                        }
                        else
                        {
                                DWORD dwID = 0;
                                PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)  
                                        GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
                                HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pfnStartAddr, lpBuffer, 0, &dwID );

                                WaitForSingleObject( hThread, INFINITE );
                                VirtualFreeEx( hProcess, lpBuffer, dwSize, MEM_DECOMMIT );
                                CloseHandle( hThread );
                                hThread = NULL;
                                                        }
                }
                else
                {
                        ...
                }
        }
        else
        {
                ...
        }

        if ( NULL != hProcess )
        {
                CloseHandle(hProcess);
                hProcess = NULL;
        }
2013-11-29 16:59
0
雪    币: 38
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
跑过看看,学习!!
2013-11-29 17:29
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
可是MessageBoxA是user32.dll导出的,我检查过,在不同的进程中,MessageBoxA的物理内存地址都是不变的,都是一个4字节的内存地址。我一直在想为什么不能直接将函数的内存地址直接传过去,然后在远方进程中CALL  (函数的内存地址)来调用。
2013-12-1 22:10
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
呃,只有代码吗?可以给点注释吗,亲?
2013-12-1 22:17
0
雪    币: 13
活跃值: (49)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
看下堆栈是否恢复平衡……OD跟下就行了贝`
2013-12-1 23:02
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
是不是ESP检查没关导致注入的函数被自动添加额外的代码呢?不过我在网上也找不到VS2010关闭esp检查的方法。
2013-12-2 19:27
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
问题解决木有呢?我也遇到类似问题
2014-6-15 03:05
0
雪    币: 53
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
这么申请内存大丈夫? MEM_COMMIT 分配物理内存分页  MEM_RESERVE 保留物理内存分页并分配虚拟内存  只申请的了个物理内存分页  没转化为进程虚拟内存分页   不信你自己在virtualallocex执行后  打开od查看虚拟内存页面是否申请成功。。。
2014-6-15 09:25
0
雪    币: 30
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
这个是因为你在debug版本下,所有的函数其实地址集中在调试符号表上了,你换成release版本就可以正常执行。
2015-7-13 21:56
0
雪    币: 1907
活跃值: (6004)
能力值: ( LV7,RANK:116 )
在线值:
发帖
回帖
粉丝
19
看了帖子后解决了
2018-5-24 16:46
0
游客
登录 | 注册 方可回帖
返回
//