首页
社区
课程
招聘
[原创]滴水逆向学习收获1-双进程无dll注入(1楼,17楼,21楼,27楼,30楼,33楼)[已更新至33楼]
发表于: 2011-11-8 17:30 48863

[原创]滴水逆向学习收获1-双进程无dll注入(1楼,17楼,21楼,27楼,30楼,33楼)[已更新至33楼]

2011-11-8 17:30
48863

程序执行的过程为:
1.点击注入按钮:调用InitEGWork函数完成创建事件
2. CreateThread(NULL,NULL,CreateRemoteThreadProc,NULL,0,0);
        创建线程完成将注入代码写入到被注入进程中,并执行注入代码
3.注入到被注入进程的代码为
DWORD WINAPI RemoteThread(void *lpParameter)
{
        ThreadParam_t *ThreadParamp;

        DWORD Id;
        DWORD dwWaitResult;
        HANDLE hMapFile;
       
        IoEvnet_t IoEvnet;
        MapFile_t *MapFilep;

        VOID (__stdcall *LocalSleep)(DWORD dwMilliseconds);
        BOOL (__stdcall *LocalSetEvent)(HANDLE hEvent);
        DWORD (__stdcall *LocalWaitForSingleObject)(HANDLE hHandle,DWORD dwMilliseconds);

        //--------------------------------------------------------

        ThreadParamp = (ThreadParam_t*)lpParameter;
        ThreadParamp->ok = 1;

        LocalSleep = ThreadParamp->Sleep;
        LocalSetEvent = ThreadParamp->SetEvent;
        LocalWaitForSingleObject = ThreadParamp->WaitForSingleObject;

        Id = 0;
        dwWaitResult = 0;

        IoEvnet.InEvent = ThreadParamp->OpenEventA(EVENT_ALL_ACCESS, TRUE, ThreadParamp->EVENT_NAMEUI);
        IoEvnet.OutEvent = ThreadParamp->OpenEventA(EVENT_ALL_ACCESS, TRUE, ThreadParamp->EVENT_NAMEEG);
       
        if (IoEvnet.InEvent==NULL||
                IoEvnet.OutEvent==NULL)
        {
                ThreadParamp->MessageBoxA(NULL,ThreadParamp->OpenIoEvnetError,ThreadParamp->Tip,MB_OK);
        }
       
        hMapFile = ThreadParamp->OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,ThreadParamp->FILEMAP_NAME);
        if (hMapFile==NULL)
        {
                ThreadParamp->MessageBoxA(NULL,ThreadParamp->OpenFileMapError,ThreadParamp->Tip,MB_OK);
        }
        IoEvnet.MapViewpBuff =(BYTE *)ThreadParamp->MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,MAPFILESIZE);
        if (IoEvnet.MapViewpBuff==NULL)
        {
                ThreadParamp->MessageBoxA(NULL,ThreadParamp->MapViewOfFileError,ThreadParamp->Tip,MB_OK);
        }

        IoEvnet.MapViewpBuff += MAPFILEOFFSET;

        MapFilep = (MapFile_t *)(IoEvnet.MapViewpBuff+8);

        ThreadParamp->ok++;
        //if (ThreadParamp->ThreadId==1)
        {
                ThreadParamp->MessageBoxA(NULL,ThreadParamp->Text,ThreadParamp->Caption,MB_OK);
        }

       
        __asm
        {
                jmp tcgbegin
                __asm {__emit('T')} __asm {__emit('C')} __asm {__emit('G')}
                __asm {__emit('B')} __asm {__emit('E')} __asm {__emit('G')} __asm {__emit('I')} __asm {__emit('N')}

tcgbegin:
        }

        for (;;)
        {
                dwWaitResult =  LocalWaitForSingleObject(IoEvnet.InEvent,-1);

                if (dwWaitResult==WAIT_OBJECT_0)
                {       
                        //--------------------------------------
                        //decode
                        //------------------------------------------------------------------------------------------------------------------
                        Id = *(DWORD*)(IoEvnet.MapViewpBuff+0);
                        if (Id==1)
                        {
                                //------------------------------------------------------------------------------------------------------------------
                                ((void (*)(MapFile_t *MapFilep,ULONG* InBuffer,ULONG InLength,ULONG *OutBuffer,ULONG OutLength,ULONG *OutLengthp))(DWORD)MapFilep->PipeFunCodeBuffer)(
                                        MapFilep,MapFilep->PipeInBuffer,MapFilep->InLength,MapFilep->PipeOutBuffer,MapFilep->OutLength,&MapFilep->OutLengthReal);
                                //------------------------------------------------------------------------------------------------------------------
                        }

                       
                        //------------------------------------------------------------------------------------------------------------------
                        LocalSetEvent(IoEvnet.OutEvent);
                        //------------------------------------------------------------------------------------------------------------------
                }
        }

        __asm
        {
                jmp labelmark
                __asm {__emit('L')} __asm {__emit('A')} __asm {__emit('B')} __asm {__emit('E')} __asm {__emit('L')}
                __asm {__emit('M')} __asm {__emit('A')} __asm {__emit('R')}
labelmark:
        }

        FUNLENGTHMARK
        return 0;
}

4.点击Test按钮程序会把函数IoTGBTestFunction拷贝到被注入进程中并执行

该程序源码在附件里,欢迎大家下载和我交流。


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (48)
雪    币: 7024
活跃值: (4237)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
偶的沙发
2011-11-8 18:19
0
雪    币: 6976
活跃值: (1487)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
3
不错, 非常不错..
2011-11-8 18:24
0
雪    币: 287
活跃值: (583)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
2011-11-8 19:05
0
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这代码风格 怎么有股汇编的味道~~~
2011-11-8 19:13
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
早前写个一个无dll注入 就是弹个MSGBOX 没实现拷贝函数 而且必须编译为release
2011-11-9 00:56
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
7
看不懂,膜拜一下!
2011-11-9 08:34
0
雪    币: 277
活跃值: (114)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
我在CopyFunctions函数里处理了jmp和__chkesp可以使debug版本的函数copy到被注入进程中。
在CopyFunctions里还对call指令进行了处理,只要把函数放到列表里就可以在copy代码里调用了。比如有一个函数
int funsum(int a,int b)
{
       return a+b;
}
将他放入到列表
void *RemoteFunList[] =
{
        &funsum,
        &RemoteThread,
        NULL
};
就可以在函数RemoteThread中像调用本地函数一样调用了。
2011-11-9 09:53
0
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
嗯,关键要把编译工程设置下让编译的代码无“添加剂”就可以这样方便搞
2011-11-10 10:26
0
雪    币: 237
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
markkkkk
2011-11-11 03:30
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
360 拦截了.
2011-11-14 22:49
0
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
有点意思啊.............
2011-11-14 23:43
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
老大,看了你的贴,感触很深刻啊,就是看不懂啊。感觉以前都白学了,能不能图文并茂的讲解一下。
2011-11-17 23:21
0
雪    币: 47
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
能介绍一下调试方法吗?假如注入的过程中有问题,崩溃了 怎么调试呢?
2011-11-18 09:36
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
看不懂啊!稍微的注释一下吧!
2011-11-18 09:36
0
雪    币: 47
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
vs2010编译报 error C2365: “SystemPowerInformation”: 重定义;以前的定义是“枚举数”        e:\c++download\2processinject\2processinject\createremotecode.h        160
把SystemPowerInformation注释掉就可以了
2011-11-18 09:49
0
雪    币: 277
活跃值: (114)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
前段时间在滴水逆向培训班学习之余写了一个无dll注入程序发到坛上,详情请见(滴水逆向学习收获1-双进程无dll注入)。很多朋友反映看不懂,我把程序整理了一下,准备做一个系列进行图文并茂的详细讲解,希望对需要的朋友有所帮助。

目录:
1.        程序效果演示<本节>
2.        注入程序的注入原理<下节>
3.        <待定>

程序演示效果:
1.打开注入程序:

2.打开被注入程序:

3.点击注入程序的“注入”按钮,将会把注入代码拷贝到被注入程序中,弹出“注入成功”提示框则拷贝成功,就可以把注入程序的函数动态的拷贝到被注入程序中并执行。
4.点击“调用被注入程序的API”按钮,调用被注入成的MessageBoxA函数,并弹出对话框,如下图:

5.点击“调用被注入程序的函数显示字符串”按钮,调用被注入程序的函数,并显示传入的字符串到界面上,如下图:


程序源码下载地址:
2ProcessInject.rar
TestApp.rar
上传的附件:
2011-11-18 21:17
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
恩。很好。看后明白了,很多的东西。
继续等待你的下次更新
2011-11-22 18:54
0
雪    币: 7024
活跃值: (4237)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
这貼给力啊, 有图, 有码的...
2011-11-22 18:56
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
很好很强大啊
2011-11-22 20:28
0
雪    币: 277
活跃值: (114)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
目录:
1.      程序效果演示
2.      注入程序的注入原理<本节>
3.      程序的数据结构<下节>
4.      程序的初始化
5.   <待定>

上一篇演示了程序运行的效果,这一讲主要将介绍一下两个程序通信的原理和过程。
程序注入程序的注入原理
  两个程序主要用两个事件(Event_In,Event_Out)和一个FileMap进行通信。大致过程如下:
    1.注入进程创建两个事件(Event_In,Event_Out)和一个FileMap缓冲区(该缓冲区注入程序和被注入程序共用)。
    2.将主循环函数(RemoteThread)拷入到被注入进程中,创建远程线程执行主循环函数。
    3.在主循环函数中打开前面注入程序创建的事件(Event_In,Event_Out)和FileMap得到缓冲区地址,最后不断循环等待注入程序的事件(Event_In)。
    4.注入程序执行自定义函数时,注入程序先把输入参数和输出参数拷贝到FileMap缓冲区参数区,把函数代码拷贝到FileMap缓冲区的代码区,设置事件Event_In,然后等待事件Event_Out。
    5.被注入程序得到Event_In消息后执行FileMap缓冲区中代码区的代码,执行完后设置事件Event_Out并循环等待下一个Event_In事件。
    6.注入程序得到Event_Out事件后便知道被注入程序中的函数运行完了,并进行去返回值等操作。

程序源码下载地址:
上传的附件:
2011-11-23 12:33
0
雪    币: 277
活跃值: (114)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
感谢看雪老大加精,在看雪学到了不少东西,今后会发表更好的文章感谢看雪论坛的朋友!
2011-11-25 20:59
0
雪    币: 695
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
不错 的注入方式 啊
2011-12-1 09:08
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
老大,什么时候更新啊。都看完了。期待中。。。。
2011-12-1 22:15
0
雪    币: 45
活跃值: (51)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
25
汇编哥~~~~
营养哥~~
2011-12-2 12:21
0
游客
登录 | 注册 方可回帖
返回
//