吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8127|回复: 13
收起左侧

[C&C++ 转载] 代码注入

  [复制链接]
T_MAC仔 发表于 2017-5-3 21:00
简单实例描述代码注入:
简单描述:代码注入是一种向目标进程注入代码,并使之独立运行的技术,一般调用CreateRemoteThread() 创建远程线程的方式完成
原理:分别将代码和数据写入远程线程,最终将代码和数据以线程参数的形式使之运行

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

[C] 纯文本查看 复制代码
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;
}

完整代码见附件
如若有不理解的同学可以欢迎一块讨论
参考文献发《逆向工程核心原理》

demo.rar

351.05 KB, 下载次数: 144, 下载积分: 吾爱币 -1 CB

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Darenfy 发表于 2017-11-27 19:58
你的代码注入调试练习能很顺利通过吗
我的运行codeinjection.exe之后,od停在了这个位置
file:///C:\Users\超凡\AppData\Roaming\Tencent\Users\997705034\TIM\WinTemp\RichOle\6%W_GZ_%A)XYMB~NQVN)]JJ.png 6%W_GZ_%A)XYMB~NQVN)]JJ.png
并不像书上说的停在了theadproc()函数区,尝试了很多次都没成功,有什么问题需要注意的吗?
948413534 发表于 2017-5-3 21:13
segasonyn64 发表于 2017-5-3 22:11
如果需要注入64位程序,只需要编译成64位的就可以了吧?
xiaohua888 发表于 2017-5-3 22:29
学习了谢谢啊
 楼主| T_MAC仔 发表于 2017-5-3 22:51
环境是:xp  win7 32位
psx1lin 发表于 2017-5-4 12:55
研究学习了
谢谢啊
qq1239996785 发表于 2017-5-15 01:47 来自手机
技术性mark
吾爱luo 发表于 2018-4-6 12:50
哎  技术不够  下载了然后又放弃了
知足常乐999 发表于 2018-11-14 21:46
学习下,试试。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 03:11

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表