首页
社区
课程
招聘
[分享]代码注入实例
发表于: 2017-5-3 21:02 6396

[分享]代码注入实例

2017-5-3 21:02
6396

简单实例描述代码注入:
简单描述:代码注入是一种向目标进程注入代码,并使之独立运行的技术,一般调用CreateRemoteThread() 创建远程线程的方式完成
原理:分别将代码和数据写入远程线程,最终将代码和数据以线程参数的形式使之运行

Dll注入与代码注入的比较:
1.Dll注入,将数据和代码放进dll文件,然后将整个dll注入到远程进程中。
2.代码注入直接将数据代码写进远程进程,使之运行。
优点:
1.代码注入占用内存小
2.难以查找痕迹(dll注入可通过进程查看工具如 Process Explorer等查看)
3.不需要额外的dll文件,
4.dll注入技术主要用在负复杂代码量大的时候,
源码分析:
//预定义 变量以及函数指针

typedef struct _THREAD_PARAM {

    FARPROC pFunc[2];               // LoadLibraryA(), GetProcAddress()

    char    szBuf[4][128];          // "user32.dll", "MessageBoxA", "www.reversecore.com", "ReverseCore"

} THREAD_PARAM, *PTHREAD_PARAM;

 

typedef HMODULE (WINAPI *PFLOADLIBRARYA)

(

    LPCSTR lpLibFileName

);

 

typedef FARPROC (WINAPI *PFGETPROCADDRESS)

(

    HMODULE hModule,

    LPCSTR lpProcName

);

 

typedef int (WINAPI *PFMESSAGEBOXA)

(

    HWND hWnd,

    LPCSTR lpText,

    LPCSTR lpCaption,

    UINT uType

);


BOOL InjectCode(DWORD dwPID)

{

    HMODULE         hMod            = NULL;

    THREAD_PARAM    param           = {0,};

    HANDLE          hProcess        = NULL;

    HANDLE          hThread         = NULL;

    LPVOID          pRemoteBuf[2]   = {0,};

    DWORD           dwSize          = 0;

 

    hMod = GetModuleHandleA("kernel32.dll");

 

    // set THREAD_PARAM

    param.pFunc[0] = GetProcAddress(hMod, "LoadLibraryA");

    param.pFunc[1] = GetProcAddress(hMod, "GetProcAddress");

    strcpy_s(param.szBuf[0], "user32.dll");

    strcpy_s(param.szBuf[1], "MessageBoxA");

    strcpy_s(param.szBuf[2], "www.reversecore.com");

    strcpy_s(param.szBuf[3], "ReverseCore");

 

    // Open Process

    if ( !(hProcess = OpenProcess(PROCESS_ALL_ACCESS,   // dwDesiredAccess

                                  FALSE,                // bInheritHandle

                                  dwPID)) )             // dwProcessId

    {

        printf("OpenProcess() fail : err_code = %d\n", GetLastError());

        return FALSE;

    }

 

    // Allocation for THREAD_PARAM

    dwSize = sizeof(THREAD_PARAM);

    if( !(pRemoteBuf[0] = VirtualAllocEx(hProcess,          // hProcess

                                      NULL,                 // lpAddress

                                      dwSize,               // dwSize

                                      MEM_COMMIT,           // flAllocationType

                                      PAGE_READWRITE)) )    // flProtect

    {

        printf("VirtualAllocEx() fail : err_code = %d\n", GetLastError());

        return FALSE;

    }

//写入数据

    if( !WriteProcessMemory(hProcess,                       // hProcess

                            pRemoteBuf[0],                  // lpBaseAddress

                            (LPVOID)¶m,                 // lpBuffer

                            dwSize,                         // nSize

                            NULL) )                         // [out] lpNumberOfBytesWritten

    {

        printf("WriteProcessMemory() fail : err_code = %d\n", GetLastError());

        return FALSE;

    }

 

    // Allocation for ThreadProc()

//关键理解位置release 模式编译代码  ,二进制序列同代码中函数顺序一致

    dwSize = (DWORD)InjectCode - (DWORD)ThreadProc;

    if( !(pRemoteBuf[1] = VirtualAllocEx(hProcess,          // hProcess

                                      NULL,                 // lpAddress

                                      dwSize,               // dwSize

                                      MEM_COMMIT,           // flAllocationType

                                      PAGE_EXECUTE_READWRITE)) )    // flProtect

    {

        printf("VirtualAllocEx() fail : err_code = %d\n", GetLastError());

        return FALSE;

    }

//写入代码

    if( !WriteProcessMemory(hProcess,                       // hProcess

                            pRemoteBuf[1],                  // lpBaseAddress

                            (LPVOID)ThreadProc,             // lpBuffer

                            dwSize,                         // nSize

                            NULL) )                         // [out] lpNumberOfBytesWritten

    {

        printf("WriteProcessMemory() fail : err_code = %d\n", GetLastError());

        return FALSE;

    }

 

    if( !(hThread = CreateRemoteThread(hProcess,            // hProcess

                                       NULL,                // lpThreadAttributes

                                       0,                   // dwStackSize

                                       (LPTHREAD_START_ROUTINE)pRemoteBuf[1],     // dwStackSize

                                       pRemoteBuf[0],       // lpParameter

                                       0,                   // dwCreationFlags

                                       NULL)) )             // lpThreadId

    {

//使运行

        printf("CreateRemoteThread() fail : err_code = %d\n", GetLastError());

        return FALSE;

    }

 

   // WaitForSingleObject(hThread, INFINITE);   

 

    CloseHandle(hThread);

    CloseHandle(hProcess);

 

    return TRUE;

}




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

上传的附件:
收藏
免费 2
支持
分享
最新回复 (7)
雪    币: 1378
活跃值: (4208)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
2
不知道是不是我电脑出了问题,整屏幕都是代码
2017-5-3 21:13
0
雪    币: 2304
活跃值: (4641)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
都是代码厉害了·!
2017-5-3 21:59
0
雪    币: 1432
活跃值: (2907)
能力值: ( LV9,RANK:156 )
在线值:
发帖
回帖
粉丝
4
学习一下。
2017-5-3 22:01
0
雪    币: 459
活跃值: (662)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
黑手鱼 不知道是不是我电脑出了问题,整屏幕都是代码[em_10]
呵呵,代码溢屏了,水印?
2017-5-3 22:12
0
雪    币: 1378
活跃值: (4208)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
6
ssarg 呵呵,代码溢屏了,水印?
真是我电脑问题。。。。。
2017-5-4 08:02
0
雪    币: 1441
活跃值: (299)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
7
不是大家、电脑出问题啦,是编辑的时候出点问题。,。
2017-5-4 13:03
0
雪    币: 205
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
你好方便加个微信吗有些问题想向您请教13263582639
2019-10-3 21:03
0
游客
登录 | 注册 方可回帖
返回
//