代码注入之——c++代码注入

0x00  代码注入和DLL注入的区别

  1. DLL注入后DLL会通过线程常驻在某个process中,而代码注入完成之后立即消失。
  2. 代码注入体积小,不占内存

0x01  通过c++编写注入代码

1)编写注入程序

代码如下:

// CodeInjection.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。

//

#include "pch.h"

#include <iostream>

#include<stdio.h>

#include<Windows.h>

using namespace std;

//Thrad Parameter

typedef struct _THREAD_PARAM

{

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

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

} THREAD_PARAM, *PTHREAD_PARAM;

//LoadLibrary

typedef HMODULE(WINAPI *PFLOADLIBRARYA)

(

LPCSTR lpLibFileName

);

//GetProcessAddress

typedef HMODULE(WINAPI *PFGETPROCADDRESS)

(HMODULE hModule,LPCSTR lpProNmae );

//MessageBoxA()

typedef int (WINAPI *PFMESSAGEBOXA)

(

HWND hWnd,

LPCSTR lpText,

LPCSTR lpCaption,

UINT uType

);

//Thread Procedure

DWORD WINAPI ThreadProc(LPVOID lParam)

{

PTHREAD_PARAM   pParam = (PTHREAD_PARAM)lParam;

HMODULE         hMod = NULL;

FARPROC         pFunc = NULL;

// LoadLibrary()

hMod = ((PFLOADLIBRARYA)pParam->pFunc[0])(pParam->szBuf[0]);    // "user32.dll"

if (!hMod)

return 1;

// GetProcAddress()

pFunc = (FARPROC)((PFGETPROCADDRESS)pParam->pFunc[1])(hMod, pParam->szBuf[1]);  // "MessageBoxA"

if (!pFunc)

return 1;

// MessageBoxA()

((PFMESSAGEBOXA)pFunc)(NULL, pParam->szBuf[2], pParam->szBuf[3], MB_OK);

return 0;

}

//注入函数

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,FALSE,dwPID)))

{

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

return FALSE;

}

//Allocation for THREAD_PARAM

dwSize = sizeof(THREAD_PARAM);

if (!(pRemoteBuf[0]=VirtualAllocEx(hProcess,NULL,dwSize,MEM_COMMIT, PAGE_READWRITE)))

{

printf("VirtualAllocEx() failed :err_code=%d/n", GetLastError());

return FALSE;

}

//WriteProcessMemory

if (!WriteProcessMemory(hProcess,                       // hProcess

pRemoteBuf[0],                  // lpBaseAddress

(LPVOID)¶m,                 // lpBuffer

dwSize,                         // nSize

NULL))

{

printf("Write THREAD_PARAM to Memory failed :err_code=%d/n",GetLastError());

return FALSE;

}

//Allocation for ThreadProc()

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

if (!(pRemoteBuf[1]=VirtualAllocEx(hProcess,NULL,dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE)))

{

printf("Allocation for ThreadProc() failed :err_code=%d/n", GetLastError());

return FALSE;

}

//Write ThreadProc() to Memorary

if (!(WriteProcessMemory(hProcess, pRemoteBuf[1], (LPVOID)ThreadProc, dwSize, NULL)))

{

printf("Write ThreadProc to Memory failed :err_code=%d/n", GetLastError());

return FALSE;

}

//创建进程运行

if (!(hThread=CreateRemoteThread(hProcess,NULL,0, (LPTHREAD_START_ROUTINE)pRemoteBuf[1], pRemoteBuf[0], 0,NULL)))

{

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

return FALSE;

}

WaitForSingleObject(hThread, INFINITE);

CloseHandle(hThread);

CloseHandle(hProcess);

return TRUE;

}

//提权函数

BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)

{

TOKEN_PRIVILEGES tp;

HANDLE hToken;

LUID luid;

if (!OpenProcessToken(GetCurrentProcess(),

TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,

&hToken))

{

printf("OpenProcessToken error: %u\n", GetLastError());

return FALSE;

}

if (!LookupPrivilegeValue(NULL,           // lookup privilege on local system

lpszPrivilege,  // privilege to lookup

&luid))        // receives LUID of privilege

{

printf("LookupPrivilegeValue error: %u\n", GetLastError());

return FALSE;

}

tp.PrivilegeCount = 1;

tp.Privileges[0].Luid = luid;

if (bEnablePrivilege)

tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

else

tp.Privileges[0].Attributes = 0;

// Enable the privilege or disable all privileges.

if (!AdjustTokenPrivileges(hToken,

FALSE,

&tp,

sizeof(TOKEN_PRIVILEGES),

(PTOKEN_PRIVILEGES)NULL,

(PDWORD)NULL))

{

printf("AdjustTokenPrivileges error: %u\n", GetLastError());

return FALSE;

}

if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)

{

printf("The token does not have the specified privilege. \n");

return FALSE;

}

return TRUE;

}

int main( int argc,char * argv[])

{

DWORD dwPID;

//查看是不是少了参数

if (argc!=2)

{

printf("\n USAGE  : %s <pid>\n", argv[0]);

return 1;

}

//提权

if (!SetPrivilege(SE_DEBUG_NAME, TRUE))

return 1;

//代码注入

dwPID = (DWORD)atol(argv[1]);

InjectCode(dwPID);

return 0;

}

编译生成名称为CodeInjection.exe的Released文件。

2)将被注入DLL文件和CodeInjection文件放在同一部目录。打开指定要注入的目标程序,使用processExploer查看其PID。

如下图:

可知notePad.exe的PID为16864

3)使用管理权限打开cmd,输入d:转至CodeInjection.exe所在目录,输入CodeInjection.exe 16864

如下图:

很明显,已经成功注入。我们在看看processExlpoer中的结果。如下图:

我们发现注入的Msg.dll并没有驻留在notepade进程中,而是注入完毕就消失了。

0x02 使用OD进行代码注入调试

1)使用OD载入notepad.exe。点击F9正常运行,如下图:

2)点击选项,点击调试设置,点开事件,选择在中断与新线程(代码注入原理就是使用createRemoteThread创建新线程运行)。如下图:

3)依上一节所讲的再次进行代码注入:

4)此时OD停在了CodeInjection.exe程序的开始地址,如下图:

下面就可以对CodeInjection的代码进行逆向分析了。

再次按F9的话,程序就会注入成功。如下图:

代码注入——c++代码注入的更多相关文章

  1. 如何向AcmeAir注入问题代码

    为什么要注入问题代码? AcmeAir的常规代码是为了压测测试准备的,所以绝大部分的操作都是可以在几十毫秒中就可以正常返回的.为了向用户展示我们APM工具可以在源代码级别发现系统潜在问题,我们需要在A ...

  2. 注入攻击-SQL注入和代码注入

    注入攻击 OWASP将注入攻击和跨站脚本攻击(XSS)列入网络应用程序十大常见安全风险.实际上,它们会一起出现,因为 XSS 攻击依赖于注入攻击的成功.虽然这是最明显的组合关系,但是注入攻击带来的不仅 ...

  3. php防sql注入过滤代码

    防止sql注入的函数,过滤掉那些非法的字符,提高sql安全性,同时也可以过滤XSS的攻击. function filter($str) { if (empty($str)) return false; ...

  4. 跟bWAPP学WEB安全(PHP代码)--HTML注入和iFrame注入

    背景 这里讲解HTML注入和iFrame注入,其他的本质都是HTML的改变.那么有人会问,XSS与HTML注入有啥区别呢?其实本质上都是没有区别的,改变前端代码,来攻击客户端,但是XSS可以理解为注入 ...

  5. Ecshop 2.x_3.x SQL注入和代码执行漏洞复现和分析

    0x00 前言 问题发生在user.php的的显示函数,模版变量可控,导致注入,配合注入可达到远程代码执行 0x01 漏洞分析 1.SQL注入 先看user.php的$ back_act变量来源于HT ...

  6. php防止sql注入漏洞代码 && 几种常见攻击的正则表达式

    注入漏洞代码和分析                                                                                           ...

  7. 20.Ecshop 2.x/3.x SQL注入/任意代码执行漏洞

    Ecshop 2.x/3.x SQL注入/任意代码执行漏洞 影响版本: Ecshop 2.x Ecshop 3.x-3.6.0 漏洞分析: 该漏洞影响ECShop 2.x和3.x版本,是一个典型的“二 ...

  8. 调试LD_PRELOAD注入的代码

    LD_PRELOAD提供了平民化的注入方式固然方便,同一时候也有不便:注入库出错后调试比較困难. 我琢磨了几天找到了可行的调试方法,当然未必是最有效的办法.抛出陋文,希望引来美玉~ 首先.写一段代码作 ...

  9. Spring4 -03 -Dependency Injection (依赖注入) : 代码体现/配置xml/测试

    DI:中文名称:依赖注入 英文名称((Dependency Injection) DI 是什么? 3.1 DI 和IoC 是一样的,差不多一样的技术和模板! 3.2 当一个类(A)中需要依赖另一个类( ...

  10. 不修改源代码,动态注入Java代码的方法(转)

    转自:https://blog.csdn.net/hiphoon_sun/article/details/38707927 有时,我们需要在不修改源代码的前提下往一个第三方的JAVA程序里注入自己的代 ...

随机推荐

  1. sql server 连接种类

    一.连接种类 内连接 inner join 如果分步骤理解的话,内连接可以看做先对两个表进行了交叉连接后,再通过加上限制条件(SQL中通过关键字on)剔除不符合条件的行的子集,得到的结果就是内连接了. ...

  2. iOS-MapKit的使用笔记

    对于地图和定位,苹果公司提供给了两个框架: MapKit:用于地图展示 Core Location :用于地理定位 这次总结MapKit:       同样,在使用MapKit时首先要导入头文件: 与 ...

  3. Python 导入CSV、JSON、XML数据

    常见的机器可读格式包括: - 逗号分隔值(Comma-Separated Values,CSV)- 制表符分隔值(tab-separated values,TSV)- JavaScript 对象符号( ...

  4. 解决:Error:java: 无效的源发行版: 12

    一. spring cloud项目启动.遇到问题: 二. 解决,共两个地方. 第一个位置: Shift/Ctrl/Alt/S 快捷键一起按 Modules选择你的项目(以及父级项目,如果有的话)-&g ...

  5. sql server 取多条数据的最大值

    实列: SELECT a.BillDate '[开票时间]', a.Hdbh '[运单号]', a.Status '运单状态', a.DisplayStatus '运单状态字', b.name '开票 ...

  6. C# 9.0 新特性之模式匹配简化

    阅读本文大概需要 2 分钟. 记得在 MS Build 2020 大会上,C# 语言开发项目经理 Mads Torgersen 宣称 C# 9.0 将会随着 .NET 5 在今年 11 月份正式发布. ...

  7. idea同时选中多个相同的内容并编辑

    原文链接: 首先选中你需要编辑的内容,然后Ctrl+R屏幕上会出现如下的操作栏 第一个框是查询并选中所有相同的内容第二个框是输入你要修改的内容,最后点击Replace all,就可以把所有内容替换.

  8. 《Java并发编程的艺术》第4章 Java并发编程基础 ——学习笔记

    参考https://www.cnblogs.com/lilinzhiyu/p/8086235.html 4.1 线程简介 进程:操作系统在运行一个程序时,会为其创建一个进程. 线程:是进程的一个执行单 ...

  9. npm设置为淘宝镜像地址

    1. npm设置为淘宝镜像 $npm config set registry https://registry.npm.taobao.org 2. 检查一下 $npm config get regis ...

  10. 07.Easymock的实际应用

    第一步下载对应的java包添加到工程中 并静态导入所需要的j类 import static org.easymock.EasyMock.*; 这里有的注意点 package com.fjnu.serv ...