第二个注入实例之代码注入

依旧是用远程注入线程的方式注入代码执行。

代码与数据得分两部分写入目标程序,然后再执行。

贴出实例

//CODETYPE.H

#include "windows.h"
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
);

typedef DWORD(WINAPI *THREADPROC)
(
LPVOID lParam
);

//injectcode.h

#pragma once
#include "codetype.h"
class InjectCode
{
public:
    InjectCode();
    ~InjectCode();

BOOL Inject(DWORD dwPID,int codesize,THREADPROC ThreadProc,THREAD_PARAM &param)
    {
        HANDLE          hProcess = NULL;
        HANDLE          hThread = NULL;
        LPVOID          pRemoteBuf[2] = { 0, };
        DWORD           dwSize = 0;

// 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)&param,                 // lpBuffer
            dwSize,                         // nSize
            NULL))                         // [out] lpNumberOfBytesWritten
        {
            printf("WriteProcessMemory() fail : err_code = %d\n", GetLastError());
            return FALSE;
        }

// Allocation for ThreadProc()
        dwSize = codesize;
        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;
    }
};

//调用

#include "stdafx.h"
#include "InjectCode.h"
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 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 _tmain(int argc, _TCHAR* argv[])
{
    HMODULE         hMod = NULL;
    THREAD_PARAM    param = { 0, };
    DWORD dwPID = 0;

if (argc != 2)
    {
        printf("\n USAGE  : %s <pid>\n", argv[0]);
        return 1;
    }

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");

// change privilege
    if (!SetPrivilege(SE_DEBUG_NAME, TRUE))
        return 1;

// code injection
    
    dwPID = (DWORD)_wtol(argv[1]);
    InjectCode ic;
    ic.Inject(dwPID, (DWORD)SetPrivilege - (DWORD)ThreadProc, ThreadProc, param);

return 0;
}

//这些都是基础的注入方法,若干年前的WINDOWS核心编程里就有详细的分析与实例,今天看这本韩国逆向高手写的逆向工程核心原理之书,依旧用的是旧技术,新的DLL代码注入没有提及(不是DLL注入,是DLL代码注入),有些小失望,看章节,后面还有机器码注入,这也是老技术了,新的APC之类的一概没有提及。。。

//附一点,此书中关于OD的断点方法倒是以前没有用过,挺好用,比如断DLL加载,断线程加载,选项-》调试设置-》事件-》中断于新线程,中断于新模块。。。很让人有些启发。。。惭愧,OD的好多功能居然还不知道。。。

时间: 2024-10-01 07:25:31

第二个注入实例之代码注入的相关文章

32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式

32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式 一丶RadAsm的配置和使用 用了怎么长时间的命令行方式,我们发现了几个问题 1.没有代码提醒功能 2.编写代码很慢,记不住各种声明 那么现在有大神,已经帮我们做了一个IDE环境,就是RadAsm,首先简单介绍一下界面 (对于这个IDE(最新版是3.0)我已经打包好了,有中文版本,和英文版本) 我们需要配置一下环境 1.配置编译环境,配置lib文件库,配置Debug调试器 打开后会弹出 首先这里我们注意下面的几个选项 1.

在net Core3.1上基于winform实现依赖注入实例

目录 在net Core3.1上基于winform实现依赖注入实例 1.背景 2.依赖注入 2.1依赖注入是什么? 2.1依赖注入的目的 2.2依赖注入带来的好处 2.2.1生命周期的控制 2.2.2 实现了展现层(调用者)与服务类之间的解耦 2.2.3 开发者不用再去考虑依赖之间的关系 2.3 依赖注入使用的设计模式 2.3.1 代理模式 2.3.2 工厂模式 3.在Net Core 3.1上基于winform实现依赖注入 3.1 Net Core 3.1中对winform的支持. 3.2 w

sql注入实例分析

什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句.[1]比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表

HTML5 App的代码注入攻击

原文链接 摘要 基于HTML5的手机app(译者注:以下简称HTML5 app)越来越流行了, 在大多数情况下它比native应用更容易适配不同的移动操作系统.它开发起来很方便,可以使用标准的web技术,包括HTML5.JavaScript 和  CSS,也可以借助一些现有的开发框架(比如PhoneGap)和手机操作系统进行交互. 众所周知,JavaScript是非常容易遭受代码注入攻击的,因此我们计划对HTML5 app进行一次系统的研究以评估基于web技术开发的手机app安全性是否可靠.成果

依赖注入——让iOS代码更简洁

原文链接:https://corner.squareup.com/2015/06/dependency-injection-in-objc.html 本文是自己通过阅读 Dependency Injection:Give Your iOS Code a Shot in the Arm 进行总结+翻译的,有错误之处请不吝啬的指出.下面是正文: 依赖注入可以通过初始化方法(或构造函数)传递所需要的参数,或者通过属性(setter)传递.这里将对这两种方法进行讲解. 初始化方法注入: - (insta

Win32环境下代码注入与API钩子的实现(转)

本文详细的介绍了在Visual Studio(以下简称VS)下实现API钩子的编程方法,阅读本文需要基础:有操作系统的基本知识(进程管理,内存管理),会在VS下编写和调试Win32应用程序和动态链接库(以下简称DLL). API钩子是一种高级编程技巧,常常用来完成一些特别的功能,比如词典软件的屏幕取词,游戏修改软件的数据修改等.当然,此技术更多的是被黑客或是病毒用来攻击其它程序,截获需要的数据或改变目标程序的行为.本文不探讨此技术的应用,只讲实现.同时希望掌握此技术的人都能够合法的应用它,不要去

android smali代码注入 实战一

有同学在通服里面干活,最近一直忙着4g基站搭建的干活,测试设备(android)测量移动网络数据,没有自动保存记录的功能,只能手动记录各种测试参数,不知道测试软件供应商是怎样想的,竟然不提供的这样的功能! 要我帮忙把测试数据自动导入excel表格中,我硬着头皮去尝试下.网上有smali的语法和注入的介绍,但参考价值不大,分享下自己的smali注入的过程和心得(这里smali语法就不讲了). 案例 1.需求 需要提取数据界面如下: 提取数据字段信息: 地点address 小区识别码 cellId,

sql注入攻击与防御第二版读书笔记二——SQL注入测试

寻找SQL注入 该阶段的主要目标是识别服务器响应中的异常并确定是否由SQL注入漏洞产生,随后确定在服务器端运行的SQL查询的类型(select,update,insert或delete),以及将攻击代码注入查询中的位置(比如from,where或者order by等) 我们需要关注:get,post,cookie,host,referer,useragent. 理解并利用SQL注入漏洞所涉及的主要技术包括:在心里重建开发人员在Web应用中编写的代码以及设想远程SQL代码的内容.如果能想象出服务器

phpMyAdmin setup.php脚本的任意PHP代码注入漏洞

phpMyAdmin (/scripts/setup.php) PHP 注入代码 此漏洞代码在以下环境测试通过:      phpMyAdmin 2.11.4, 2.11.9.3, 2.11.9.4, 3.0.0 及 3.0.1.1版本:      Linux内核版本 2.6.24-24-generic i686 GNU/Linux (Ubuntu 8.04.2):      攻击环境要求:      phpMyAdmin版本:早于2.11.9.5的2.11.x和早于3.1.3.1的3.x: