首页
社区
课程
招聘
[求助]masm32远程注入对话框资源
发表于: 2014-7-21 10:07 6426

[求助]masm32远程注入对话框资源

2014-7-21 10:07
6426
请教下各位,如果不想通过DLL注入这个方法,使用远线程将资源写入其它进程,要如何写入,我使用的是RADASM+MASM32 V10。
事先用资源编辑器编辑好对话框资源文件,生成了一个DLGLIAGDlg.rc,我要如何将他们写入远进程中。(不使用DLL注入)

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

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
如果实在不行。 试着别用资源呗。 直接动态创建窗口。 有API的。
2014-7-21 10:09
0
雪    币: 101
活跃值: (144)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
http://bbs.pediy.com/showthread.php?t=104336
这是我以前写的外挂,采用动态代码注入。有些麻烦,但很高效
2014-7-21 10:32
0
雪    币: 6664
活跃值: (957)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
那样创建就是累啊,想通过解单的办法来实现对话框,DialogBoxParam这样创建一个多解单,只是模版的资源不知道怎么弄了
2014-7-21 11:58
0
雪    币: 6664
活跃值: (957)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不错的文章,谢谢大牛,只是和我问的问题不相关啊,以后想学编写外挂的时候可以参考大牛的作品,很好很强大
2014-7-21 12:12
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
6
不使用DLL的话,很麻烦的,你创建对话框,肯定要模块基址吧。
这个对话框资源是和模块相关的。没有dll的话,你得在内存用修改主程序的资源。
这样还不如直接api窗口创建的简单呢。
2014-7-21 13:34
0
雪    币: 114
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
百度“远程代码注入”,有很多例子。
2014-7-21 13:47
0
雪    币: 6664
活跃值: (957)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
恩,是这样的,正因为麻烦,所以才会隐蔽,如果DLL注入远进程的话,就不容易找得到。你的意思就是需要将资源重定为,是吧。
我现在都不知道这个资源要怎么将他写入代码中,在将代码连同资源一起注入到远线程中去。
2014-7-21 16:31
0
雪    币: 6664
活跃值: (957)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
多是多,但不是我提问的相关内容,只是请远程注入,无程注入我也会啊,就是没有说不通过DLL怎么将资源代码也写到远线程中去。
2014-7-21 16:32
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
10
你可以参考一些关于exe的资源编辑器的源码。
2014-7-21 17:18
0
雪    币: 114
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
11
我说的不是dll注入。
你可以把rc也读入到内存,作为远程数据来传输。

//远程数据
typedef struct tag_RemoteData
{
        LOADlIBRARY fnLoadLibraryA; //LoadLibraryA函数地址
        GETPROCADDRESS fnGetProcAddress;
        char szUser32Dll[32] ;//"user32.dll"
        char szMessageBoxA[32] ;//"MessageBoxA"
        char szKernel32Dll[32] ;//"Kernel32.Dll"
        char szGetModuleFileName[32] ;//"GetModuleFileName"
}REMOTE_DATA , *PREMOTE_DATA ;

#pragma check_stack (off)
//远程线程函数
static void WINAPI RemoteThread(LPVOID pParam)
{
        PREMOTE_DATA pData = (PREMOTE_DATA)pParam ;
        //加载dll
        HMODULE hUser32Dll = (pData->fnLoadLibraryA)(pData->szUser32Dll);
        HMODULE hKernel32Dll =(pData->fnLoadLibraryA)(pData->szKernel32Dll);
        //查找函数地址
        MESSAGEBOX fnMessageBox = (MESSAGEBOX)(pData->fnGetProcAddress)(hUser32Dll, pData->szMessageBoxA);
        GETMODULEFILENAME fnGetModuleFileName = (GETMODULEFILENAME)(pData->fnGetProcAddress)(hKernel32Dll , pData->szGetModuleFileName);
        char pBuffer[256];
        //char* pBuffer = new char[256];
        //函数调用
        fnGetModuleFileName(0 , pBuffer , 256);
        fnMessageBox(0, pBuffer ,pData->szMessageBoxA,MB_OK);
}
static void AfterRemoteThread(){}
#pragma check_stack
DWORD dwSizeOfCode = (BYTE*)AfterRemoteThread - (BYTE*)RemoteThread;

//封装函数:向指定进程注入指定代码
bool InjectCode(DWORD dwProcessId , DWORD pThreadFunction , PREMOTE_DATA pParam , DWORD dwSizeOfCode)
{
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |  PROCESS_CREATE_THREAD
                  |PROCESS_VM_OPERATION |PROCESS_VM_WRITE,  FALSE, dwProcessId);
        if(hProcess == INVALID_HANDLE_VALUE){
                MessageBox(0,"无效的进程句柄",0,0);
                return false;
        }
        //在远程进程中分配内存(shellcode)
        HANDLE pMemOfCode = VirtualAllocEx(hProcess , 0 , dwSizeOfCode ,
                                                MEM_COMMIT , PAGE_EXECUTE_READWRITE); //属性:可执行PAGE_EXECUTE);
        if(pMemOfCode == NULL ){
                MessageBox(0,"内存分配失败",0,0);
                return FALSE;
        }
        //在远程进程内存中写入 被注入代码
        bool bWritten = WriteProcessMemory(hProcess , pMemOfCode, //进程和buffer地址
                                        (LPVOID)(DWORD)pThreadFunction ,  dwSizeOfCode ,0);//原始数据地址和size                               
        if(!bWritten){
                MessageBox(0,"写入代码失败",0,0);
                return FALSE;
        }

        //在远程进程中分配内存(data)
        HANDLE pMemOfData = VirtualAllocEx(hProcess , 0 , dwSizeOfCode ,
                                                MEM_COMMIT , PAGE_EXECUTE_READWRITE); //属性:可读写
        if(pMemOfCode == NULL ){
                MessageBox(0,"内存分配失败",0,0);
                return FALSE;
        }
        //在远程进程内存中写入参数
        bWritten = WriteProcessMemory(hProcess , pMemOfData , //进程和buffer地址
                                        pParam,  sizeof(REMOTE_DATA) ,0);//原始数据地址和size                               
        if(!bWritten){
                MessageBox(0,"写入失败",0,0);
                return FALSE;
        }

        //创建远程线程,使其加载dll(线程函数为LoadLibrary)
        DWORD dwThreadId ;
        HANDLE hRemoteThread = CreateRemoteThread(hProcess , 0,0, //远程进程
                        (LPTHREAD_START_ROUTINE)pMemOfCode,//线程函数地址
                        (LPVOID)pMemOfData , //线程函数参数
                        0 , &dwThreadId) ;
          if(hRemoteThread ==INVALID_HANDLE_VALUE){
                MessageBox(0,"创建远程线程失败",0,0);
                return FALSE;
        }   
        //等待线程退出(dll加载完毕)
//        WaitForSingleObject(hRemoteThread , INFINITE) ;
//        VirtualFreeEx(hProcess , pMemOfData , 0 , MEM_RELEASE);
//        VirtualFreeEx(hProcess , pMemOfCode , 0 , MEM_RELEASE);
        CloseHandle(hProcess);
        CloseHandle(hRemoteThread);
        return TRUE;
}
2014-7-21 17:20
0
雪    币: 114
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
12
算了,、,、、
2014-7-21 17:26
0
雪    币: 6664
活跃值: (957)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
怎么算了啊,我还想学习下呢,请大神继续说说。
2014-7-21 18:16
0
雪    币: 6664
活跃值: (957)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
额这样的话估计写入的代码不会小吧。
2014-7-21 18:18
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
15
那你还有别的办法么。。
2014-7-21 18:34
0
雪    币: 6664
活跃值: (957)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
唉还是动态写吧,谢谢了
2014-7-21 19:34
0
雪    币: 101
活跃值: (144)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
我给你的代码,确实是动态注入的,并不是Dll注入。
2014-7-22 15:04
0
游客
登录 | 注册 方可回帖
返回
//