ke vinsID:iiprogram
1157103次访问,排名19好友0人,关注者49
残云收夏暑,新雨带秋岚!
[加为好友] [即时聊天] [发私信]
iiprogram的文章
原创 1354 篇
翻译 0 篇
转载 1238 篇
评论 344 篇
Kevins的公告
    留言


自2005年07月20日

Kevins的聯係方式:
unix@yiii.net


天氣預報


最近评论
山东啥:你好 下载已经失效了 可以再提供吗?
山东啥:你好 下载已经失效了 可以再提供吗?
山东啥:你好 下载已经失效了 可以再提供吗?
ZeroChou:Kernel driver? 第一次看到这种插DLL的方法。
ZeroChou:Kevins, 您好, 我是这方面的新手, 有些问题不明白,为什么要用这种方式来找API的地址,直接用LoadLibrary和GetProcAddress不可以吗,是不是为了防止被AV查杀?
文章分类
收藏
相册
1
test
美女
*NUX技术
delphij
hitbsecconf2005
knoppix-std
linux admin
linuxsir
LWN.net
最爱chinaunix
HOT SITES
cnbeta
et8论坛
eyeos 中文
ntdebugging
rootkit
taiwan.cnet
techeblog
web代理
三联生活周刊
中国传统节日
中日文翻译
国学网
深度
看雪学院
驱动开发网
编程技术和代码下载
80x86 Opcodes
awarenetwork
bo2k-plugins
borland update site
C++/C电子书籍
c++builder 研究
chinaaspx文档
code source
codecomments
codeguru
codegurus
codeproject
coffee个人
cprogramming
crack-warez
CrackZ's Reverse Engineering
csdn
csdnbbs文档简易
dd调试技巧代码
debugman
delphi盒子
dephi goo site
diybl
Doron Holan's Blog: Kernel-Mode Drivers
driverdevelop
driverdevsite
electronicstalk_driver
EliCZ
ext2fsd
Flier's Sky
FWB
icode
itconsult_vc
jiurl系统研究
kernel resource
kernel source
kernel-mode development link
krugle.com
LCC
lookcode
mad hook api
mfc
Michael Howard's Web Log
ms_srv protocol
msdn magazine
network code
newhua_deve
ntkernel.com
osronline
pcvc
planet-source-code
putty code
reactos
RECON
reverse-engineering
shadowgo 个人blog
smartphone开发
sockaddr.com
Source Code Search Engine
tty64
tutorialdownloads
txakynetwork(driver,firewall)
undocumented.ntinternals
uty oldblog(driver&kernel)
vbs脚本
vccode
VCFORGE
vchelp
vckbase
vc-qq
vczx
vc原动力
vc原动力
vc在线
wasm.ru
webcrazyjp
Windows network services internals
世纪站长
中国站长源码
免费ie代理1
免费代理2
拼搏
操作系统开发研究
服务器开发技术
源代码
源代码下载2
电子书
编程网摘
藏鲸阁
豆豆源码
個人輔站
another blog?
个人blog-3
人气第一的台湾小美女
個人blog
個人技術輔2
资料blog
软件工具下载
0DAY 下载
0DAY-ART
chinaitpwo资料
flash下载
icwin资料
infoxa
MYEBOOK.CN
scitech.susx
soft8
source520
tooooold_searcj
torrentreactor.net
VCBOOK
xpbook
卡饭
文学ebook
核心编程
水电
源码天空
绿色下载
计算机与信息技术杂志
超好电子书籍站
非凡绿色下载
高校教材
硬件系统
hri.sourceforge.net
juniper mannel
资讯安全国内站
艾克索夫實驗室
0GINR
0ginr
0ginr论坛
51tiger.com安全
5eCur!ty Labs
5iliby
6code
77169
aloner
Alter's home page
antiprotect
astalavista
axis#ph4nt0m BLOG
ayarei/
bluehack
c.i.s.r.t
chinafe
CISRT
cncert
cto技术圈-ddos
cvcvxk
darkshell
debugman
debugman_wintools
dm-0day
dummy24
enet安全
eva
FCG
flowercode
FreeWin
friend-hsy
greatdong
h31home
H4x0r's Blog
hackee
heifou team
http://hi.baidu.com/yuange1975
huaidan's blog
icylife
inkings
insigma
internet worm
isip.cn
Juniper-bbs
kendivblog
KIJS
lenmo
loveshell
loveshell
luoluo
LYSOFT
lzx
majun 's blog
micropoint
mj0011
n4ry
NCPh
ne365-virus
neeao's blog
neeao's millow exp
Nethackonline 网络黑客在线
nop
nosec.org
open-bug
open-bug
PANTAO
raystyle
redhyphone union
regeliu
regshot
sometips
sudami
sysadmin.cn
System Repair Engineer安全检测
System Repair Engineer安全检测
T4NK's blog
team509
techtarget中文
TINK'S BLOG
unpack
unpackcn
uuty
vfocus
vxk
vxk大侠
Windows PowerShell及微软脚本
windowssky
xizi1023 blog
xwind
yiming 管理
yunshu-blog
ZUOJIE
zwell
一蓑烟雨
东来blog
中国x黑客小组
中国信息安全研究小组(CISRG)
中国信息安全组织
中国协议分析网
中国安全信息网-企业安全方案
从c开始
冷漠blog
刘涛涛blog
华夏同盟bbs
南域剑盟
危特网安
大牛蛙
安 翼 网 络
安全中国(RSS)
安全警戒
幻影
当下放下
影子鹰安全
微点blog
成都黑客在线
攻防blog
木马帝国
武汉黑客联盟
源码网
溢出专题study
白细胞
立华软件园安全防线
第八个男人
网安俱乐部
网络安全日志
艾克索夫實驗室.
补天
邪恶八进制
邪恶八进制
邪恶的hackza镜像
邪恶的oldexp
陆麟的主页
飞花堂
鬼仔blog
黑客百宝箱
資訊安全国外站
(kernel,virus code)
0DAY
158apps
62nds virus source
62nds-virus-code
advdbg.com
alexfedoto
allife(RSS)
Alter.Org.UA
anticode(RSS)
antirootkit
ANTIrootkit
ANYSIDE-EXP
anyside-exploit
arteam
astalavista.com
auscert
bifrost
bjwever
Black Hats Manual Software Security Auditing, Cracking,
blackcode.com(RSS)
blackhat mirror
blacksecurity
blogs.borland
bluemicro.digibase
bugtraq
bugtraq2
cert.org
chasenet.org-birfost
codebreakers-journal
community.reverse-engineering
Computer Forensics
computerterrorism
cool linux hack tool site
crackserver
CrackZ's Reverse Engineering
CVC电脑病毒
dark it sec
defcon
determina
dkcs security
DOXARA
eeye_0day_tra
eggheadcafe
elicz
elitehackers
elitehaven
European Hacker Conference
EVA的回收站
Evilcry
Expcode
exploit-1
exploitdatabase
foro.elhacke
Fortinet Security Research Team(RSS)
fredeyk
freexploit
freon-security
frsirt(RSS)
f-secure.weblog
Full Disclosure
full-disclosure
full-disclosure
gmc9
gmer
governmentsecurity(RSS)
h4cky0u
hackcoza
hackerscenter(RSS)
hackersclub
hackersplayground
hackwire(RSS)
haking.pl
he4dev
heapoverflow(RSS)
hexview
hick.org
hitbsecconf
hi-tech.nsys
hsc.fr(RSS)
icst.org.tw(RSS)
igniteds
infosecdaily
infosecwriters
infosyssec
insecure.org
internals
invisiblethings
jav.ch(RSS)
jeffrey.vanderstad
kd-team
l33tsecurity
labs.idefense
lcamtuf.coredump
malware analyze & reverse engineering
Mark Russinovich blog(cool)
markrussinovich
MC AV-Test site
Memory Forensic
metasploit-SHELLCODE(RSS)
microsoft安全(RSS)
milw0rm-shellcode(RSS)
MSDN杂志
msuiche
mtaulty(RSS)
mwcollect
nessus
nessus_plugin
net-security
net-security
network-file-explorers
networksecurityarchive(cool)
neworder.box.sk
neworder.box.sk
ngssoftware(RSS)
nirsoft
niscc.gov.uk(RSS)
NIST
nmd-labs
nnove-exploits
northsecuritylabs
noxusfiles
ntbugtraq
ntcore
nteam.ru
ntsecurity
Obsidis
offensivecomputing
offensivecomputing
omcd
only4gurus
Open Source Vulnerability Database
opennet.ru-exp
openrce(RSS)
openrce
openrce-articles
opensc
open-security
opferman
osvdb
packetstorm(RSS)
phenoelit.de
progenic
pulltheplug
PWDUMP6
Raymond Chen(msdn)
RECON
remoteassessment-exploit-file
remote-exploit
Reverse Compilation Techniques
reverse engineering team
ring 0 debugger
rootkit.com
rootkitunhooker(unreal)
ruder.cdut
RUS-CERT
s0ftpj.org
sabre-security
sabre-security
sec-consult(RSS)
seclist-fulldisclosure
secunia.com
secunia.com
secureworks
secureworks
securiteam
security.ittoolbox
security.nnov.ru
security.org.sg-code
securityarchitects
security-briefings
securitycatalyst(RSS)
securitydot-exploit
securityfocus(RSS)
securityforest
securitylab.ru
security-protocols(RSS)
securityreasonExploitAlert
securitysearch.net
securitytracker
sensepost
spywareinfo
Stanford's stinson
SUCK-O
sweRAT
sysinternals forum
taosecurity
taosecurity.blogspot(cool)
techmeme
techmeme.
tenablesecurity
THC(RSS)
thc.org
The 20 Most Critical Internet Security Vulnerabilities
the Month of Kernel Bugs
The Open Source Vulnerability Database
theaimsgroup bug
thebugs.ws
thenetworksecurity
tibbar(RSS)
tibbar
tippingpoint
topix-tech
triviasecurity
undergroundnews(RSS)
undocumented
undocumented.ntinternals
uninformed
uninformed
uninformed
uninformed.org
US-CERT
virustotal detect
vuln-search
VX Heavens
wd-3(RSS)
websense
WebSense Security Labs
whitehat
wilderssecurity
Win NT, Win 2000, and Win XP Security Tips
Windows network services internals
windowsecurity(RSS)
WOODMANN
woodmann.com
xatrix.org
xzziroz
yorn security
ZDNET_security
zdnet's security
zero day (RSS)
zone-h
zone-h.
反汇编引擎distorm
最新被黑站点
查询windows不明进程
汇编引擎yasm
经典phrack(RSS)
经典ussrback(RSS)
存档
订阅我的博客
XML聚合  FeedSky

转载 hotpatch逆向代码~HotPatch.c收藏

新一篇: ring3文件占坑大法 | 旧一篇: HookFunction


#include <ntddk.h>
#include <KerStr.h>
#include <RtlHelp.c>

#define MEM_HOT_PATCH 'HotP'
PVOID _MmSystemLoadLock ;
#define HotPatchSectionName '.hotp1'
LIST_ENTRY _MiHotPatchList ;
ERESOURCE _PsLoadedModuleResource ;
LIST_ENTRY _PsLoadedModuleList ;
ULONG_PTR _MiSessionImageStart ;
ULONG_PTR _MiSessionImageEnd ;

extern ULONG RtlGetHotPatchHeader(ULONG ImageBase) ;
extern ULONG
RtlFindRtlPatchHeader(LIST_ENTRY  HotPatchList,
                     PLDR_DATA_TABLE_ENTRY  LdrData );

extern BOOL RtlpIsSameImage(PRTL_PATCH_HEADER PatchHeader,
                     PLDR_DATA_TABLE_ENTRY LdrData);

extern NTSTATUS RtlCreateHotPatch(PRTL_PATCH_HEADER *ImageBase ,
                           PHOTPATCH_HEADER HPSectionData ,
                           PLDR_DATA_TABLE_ENTRY LdrData,
                           NTSTATUS Flags);
extern NTSTATUS
ExLockUserBuffer (
    __inout_bcount(Length) PVOID Buffer,
    __in ULONG Length,
    __in KPROCESSOR_MODE ProbeMode,
    __in LOCK_OPERATION LockMode,
    __deref_out PVOID *LockedBuffer,
    __deref_out PVOID *LockVariable
    );

extern VOID
ExUnlockUserBuffer (
    __inout PVOID LockVariable
    );

//two function form Windows Research Kernel source code

extern void RtlFreeHotPatchData(PRTL_PATCH_HEADER PatchData) ;


NTSTATUS
MiPerformHotPatch(PLDR_DATA_TABLE_ENTRY LdrData ,
                 ULONG ImageBase ,
                 NTSTATUS Flags)
{

ULONG TempLdr = 0;
PHOTPATCH_HEADER HPSectionData ;
NTSTATUS stat ;
PLDR_DATA_TABLE_ENTRY Link1 ;
PRTL_PATCH_HEADER PatchHeader ;
PVOID LockedBuffer ;
PVOID LockVariable ;


HPSectionData = RtlGetHotPatchHeader(ImageBase) ;

//获得HotPacth文件中的HotPacth数据


if (!HPSectionData)
{
    return STATUS_INVALID_IMAGE_FORMAT ;
}

ImageBase = RtlFindRtlPatchHeader(_MiHotPatchList ,LdrData) ;

//查找HotPatch是否已安装

if (!ImageBase )
{
    if (!Flags && 1)
    {
        return STATUS_NOT_SUPPORTED;

        //如果RtlPatchHeader不存在而HOTP_PATCH_APPLY=0
        //则出错
    }
   
    stat = RtlCreateHotPatch(&ImageBase, HPSectionData, LdrData ,Flags);

    PatchHeader = (PRTL_PATCH_HEADER)ImageBase ;
   
    //创建HotPacth头

    if (!NT_SUCCESS(stat))
    {
        return stat ;
    }
    ExAcquireResourceExclusiveLite(_PsLoadedModuleResource ,TRUE) ;
   
    //开始遍历PsLoadedModuleList
   
    //寻找符合的模块
   
    Link1 = _PsLoadedModuleList.Blink ;
    while (Link1 != _PsLoadedModuleList)
    {
        TempLdr = Link1 ;
        if (Link1->DllBase < _MiSessionImageStart ||
            Link1->DllBase >= _MiSessionImageEnd)
        {
            if (RtlpIsSameImage(PatchHeader ,Link1))
            {
                break ;
            }
           
        }

        Link1 = _PsLoadedModuleList.Blink ;
   
    }
    //验证模块

    ExReleaseResourceLite(_PsLoadedModuleResource) ;
    if (!PatchHeader->TargetDllBase)
    {
        return STATUS_DLL_NOT_FOUND ;
    }
    stat = ExLockUserBuffer(LdrData->DllBase,
        LdrData->SizeOfImage ,
        KernelMode,
        &LockedBuffer,
        &LockVariable
        ) ;
    //锁定用户内存
   
    if (!NT_SUCCESS(stat))
    {
        RtlFreeHotPatchData(PatchHeader );
        return stat ;
    }

    stat = RtlInitializeHotPatch(PatchHeader ,(ULONG)LockedBuffer - LdrData->DllBase) ;
    ExUnlockUserBuffer(LockVariable);
    if (!NT_SUCCESS(stat))
    {
        RtlFreeHotPatchData(PatchHeader );
        return stat ;

    }
       


}


}
NTSTATUS RtlpApplyRelocationFixups(PRTL_PATCH_HEADER PatchHeader , PVOID DllBase)
{
   
}
NTSTATUS RtlInitializeHotPatch(PRTL_PATCH_HEADER PatchHeader , PVOID DllBase)
{
    NTSTATUS stat ;
    stat = RtlpApplyRelocationFixups()
        if (!NT_SUCCESS(stat))
        {
            return stat ;
        }
    stat = RtlpValidateTargetRanges(PatchHeader ,TRUE) ;
        if (!NT_SUCCESS(stat))
        {
            return stat ;
        }
    stat = RtlReadHookInformation(PatchHeader) ;
    return stat ;
}
NTSTATUS MmHotPatchRoutine(PSYSTEM_HOTPATCH_CODE_INFORMATION RemoteInfo)
{
    UNICODE_STRING HotPatchName ;
    ULONG ImageBase ;
    HANDLE ImageHandle;
    NTSTATUS stat ;
    NTSTATUS stat2 ;

    stat2 = RemoteInfo->Flags ;
    HotPatchName.Length = RemoteInfo->KernelInfo.NameLength ;
    HotPatchName.MaximumLength = RemoteInfo->KernelInfo.NameLength  ;
    HotPatchName.Buffer = (ULONG)RemoteInfo + RemoteInfo->KernelInfo.NameOffset ;
    __asm
    {
        push    eax
        mov        eax, fs : 0x124   
        dec        dword ptr [eax + 0xd4]
        pop        eax
    }
    //enable the KTHREAD->KernelApcDisable

    KeWaitForSingleObject(_MmSystemLoadLock ,
        WrSuspended,
        NULL,
        NULL,
        NULL) ;

    //wait for mmsystemLoadLock

   
    stat = MmLoadSystemImage(&HotPatchName ,
        NULL,
        NULL,
        NULL,
        &ImageHandle,
        &ImageBase
        ) ;
   
    //加载hotpatch驱动程序

   
    if (!NT_SUCCESS(stat))
    {
        if (stat == STATUS_IMAGE_ALREADY_LOADED )
        {
            goto OK1;
               
            
        }
        goto Failed;

    }


    //如果驱动加载失败,返回
    //如果加载成功或镜象已经加载,则返回Image Base Address


OK1:
    stat = MiPerformHotPatch((PLDR_DATA_TABLE_ENTRY)ImageHandle , ImageBase , stat2) ;

    //执行补丁

   
    if (!NT_SUCCESS(stat))
    {
        if (stat == STATUS_IMAGE_ALREADY_LOADED)
        {
            goto OK2;

        }
        MmUnloadSystemImage(ImageHandle);

   
    }

    //如果执行失败,卸载镜象


OK2:
    stat = stat2 ;


Failed:
    KeReleaseMutant(_MmSystemLoadLock , 1 , NULL,NULL) ;
        __asm
        {
            push    eax
            push    esi
            mov        eax, fs : 0x124   
            inc        dword ptr [esi + 0xd4]
            jnz        end1
            lea        eax, [esi + 0x34]

            ;ApcState
            cmp        [ eax ], eax
            jz        end1
            mov        cl , 1
            mov        byte ptr [esi + 0x49] ,1
            call    HalRequestSoftwareInterrupt
           
            pop        esi
            pop        eax
        }
        //disable the KTHREAD->KernelApcDisable
        return stat ;

}

Hotpatch逆向代码(2) KerStr.h和RtlHelp.c~

enum assembly_type
{
    APPLICATION_MANIFEST,
    ASSEMBLY_MANIFEST
};

struct entity
{
    DWORD kind;
    union
    {
        struct
        {
            WCHAR *tlbid;
            WCHAR *version;
            WCHAR *helpdir;
    } typelib;
        struct
        {
            WCHAR *clsid;
    } comclass;
    struct {
            WCHAR *iid;
            WCHAR *name;
    } proxy;
        struct
        {
            WCHAR *name;
        } class;
        struct
        {
            WCHAR *name;
            WCHAR *clsid;
        } clrclass;
        struct
        {
            WCHAR *name;
            WCHAR *clsid;
        } clrsurrogate;
    } u;
};

struct assembly_identity
{
    WCHAR                *name;
    WCHAR                *arch;
    WCHAR                *public_key;
    WCHAR                *language;
    WCHAR                *type;
    struct version        version;
    BOOL                  optional;
};
struct dll_redirect
{
    WCHAR                *name;
    WCHAR                *hash;
    struct entity_array  entities;
};
struct entity_array
{
    struct entity        *base;
    unsigned int          num;
    unsigned int          allocated;
};



struct assembly
{
    enum assembly_type      type;
    struct assembly_identity id;
    struct file_info        manifest;
    WCHAR                  *directory;
    BOOL                    no_inherit;
    struct dll_redirect    *dlls;
    unsigned int            num_dlls;
    unsigned int            allocated_dlls;
    struct entity_array      entities;
};

struct file_info
{
    ULONG              type;
    WCHAR              *info;
};

typedef struct _ACTIVATION_CONTEXT
{
    ULONG              magic;
    int                ref_count;
    struct file_info    config;
    struct file_info    appdir;
    struct assembly    *assemblies;
    unsigned int        num_assemblies;
    unsigned int        allocated_assemblies;
} ACTIVATION_CONTEXT;


typedef struct _LDR_DATA_TABLE_ENTRY {
    LIST_ENTRY InLoadOrderLinks; //0x00
    LIST_ENTRY InMemoryOrderLinks; //00x08
    LIST_ENTRY InInitializationOrderLinks; //0x10
    PVOID DllBase; //0x18
    PVOID EntryPoint; //0x01c
    ULONG SizeOfImage; // 0x20
    UNICODE_STRING FullDllName; //0x24
    UNICODE_STRING BaseDllName; //0x2c
    ULONG Flags; //0x3
    USHORT LoadCount;
    USHORT TlsIndex;
    union {
        LIST_ENTRY HashLinks;
        struct {
            PVOID SectionPointer;
            ULONG CheckSum;
        };
    };
    union {
        struct {
            ULONG TimeDateStamp;
        };
        struct {
            PVOID LoadedImports;
        };
    };
    struct _ACTIVATION_CONTEXT * EntryPointActivationContext;
    PVOID PatchInformation;

} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;


typedef struct _RTL_PATCH_HEADER {
  LIST_ENTRY PatchList;
  HMODULE PatchImageBase;
  struct _RTL_PATCH_HEADER * NextPatch;
  ULONG PatchFlags;
  LONG PatchRefCount;
  PHOTPATCH_HEADER HotpatchHeader;
  UNICODE_STRING TargetDllName;
  HMODULE TargetDllBase;
  PLDR_DATA_TABLE_ENTRY TargetLdrDataTableEntry;
  PLDR_DATA_TABLE_ENTRY PatchLdrDataTableEntry;
  PSYSTEM_HOTPATCH_CODE_INFORMATION CodeInfo;
} RTL_PATCH_HEADER, *PRTL_PATCH_HEADER;

//_RTL_PATCH_HEADER & _HOTPATCH_HEADER

//this two struct is form OpenRCE

typedef struct _HOTPATCH_HEADER {
  DWORD Signature; //0x00
  DWORD Version; //0x04
  DWORD FixupRgnCount; //0x08
  DWORD FixupRgnRva; //0x0c
  DWORD ValidationCount; //0x10
  DWORD ValidationArrayRva; //0x14
  DWORD HookCount; //0x18
  DWORD HookArrayRva; //0x1c
  ULONGLONG OrigHotpBaseAddress; //0x20
  ULONGLONG OrigTargetBaseAddress; //0x28
  DWORD TargetNameRva; //0x30
  DWORD ModuleIdMethod; //0x34
  union {
    ULONGLONG Quad;
    GUID Guid;
    struct {
      GUID Guid;
      DWORD Age;
    } PdbSig;
    BYTE Hash128[16];
    BYTE Hash160[20];
  } TargetModuleIdValue;
} HOTPATCH_HEADER, *PHOTPATCH_HEADER;


typedef struct _FILE_RENAME_INFORMATION {
    BOOLEAN ReplaceIfExists;
    HANDLE RootDirectory;
    ULONG FileNameLength;
    WCHAR FileName[1];
} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;

typedef struct _HOTPATCH_HOOK_DESCRIPTOR{
    ULONG_PTR TargetAddress; //0x0c
    PVOID MappedAddress; //00x10
    ULONG CodeOffset; //0x14
    ULONG CodeSize; //0x18
    ULONG OrigCodeOffset; //0x1c
    ULONG ValidationOffset; //0x20
    ULONG ValidationSize; //0x24
} HOTPATCH_HOOK_DESCRIPTOR, *PHOTPATCH_HOOK_DESCRIPTOR;

typedef struct _SYSTEM_HOTPATCH_CODE_INFORMATION {

    ULONG Flags;  //0x00
    ULONG InfoSize; //00x04
   
    union {
   
        struct {
       
            ULONG DescriptorsCount; //00x08
           
            HOTPATCH_HOOK_DESCRIPTOR CodeDescriptors[1]; // variable size structure
           
        } CodeInfo;
       
        struct {
       
            USHORT NameOffset; //0x08
            USHORT NameLength; //0x0a
           
        } KernelInfo;
       
        struct {
       
            USHORT NameOffset; //0x8
            USHORT NameLength; //0x0a
           
            USHORT TargetNameOffset; //0x0c
            USHORT TargetNameLength; //0x0e
           
        } UserModeInfo;
       
        struct {
       
            HANDLE FileHandle1;
            PIO_STATUS_BLOCK IoStatusBlock1;
            PFILE_RENAME_INFORMATION RenameInformation1;
            ULONG RenameInformationLength1;
            HANDLE FileHandle2;
            PIO_STATUS_BLOCK IoStatusBlock2;
            PFILE_RENAME_INFORMATION RenameInformation2;
            ULONG RenameInformationLength2;
           
        } RenameInfo;
       
        struct {
       
            HANDLE ParentDirectory;
            HANDLE ObjectHandle1;
            HANDLE ObjectHandle2;
           
        } AtomicSwap;
    };

    //
    //  NOTE Do not add anything after CodeDescriptors array as
    //  it is assumed to have a variable size
    //
   
} SYSTEM_HOTPATCH_CODE_INFORMATION, *PSYSTEM_HOTPATCH_CODE_INFORMATION;


NTSTATUS MmLoadSystemImage(
    IN PUNICODE_STRING ImageFileName,
    IN PUNICODE_STRING NamePrefix OPTIONAL,
    IN PUNICODE_STRING LoadedBaseName OPTIONAL,
    IN ULONG LoadFlags,
    OUT PVOID *ImageHandle,
    OUT PVOID *ImageBaseAddress
    );

//the routine to load the image into system kernel

NTSYSAPI
LONG
KeReleaseMutant (
    __inout PRKMUTANT Mutant,
    __in KPRIORITY Increment,
    __in BOOLEAN Abandoned,
    __in BOOLEAN Wait
    );

NTHALAPI
VOID
FASTCALL
HalRequestSoftwareInterrupt (
    KIRQL RequestIrql
    );

NTSTATUS
MmUnloadSystemImage (
    IN PVOID ImageHandle
    ) ;
PIMAGE_NT_HEADERS
NTAPI
RtlImageNtHeader(
    PVOID Base
    );





PIMAGE_SECTION_HEADER
RtlpFindSectionHeader(PIMAGE_NT_HEADERS ImageNtHeader ,
                     LPCSTR SectionName)
{
    ULONG    OHeaderSize ;
    ULONG    NumberOfSection ;
    ULONG    SectionHeaderStart ;
    ULONG    i ;
    OHeaderSize = ImageNtHeader->FileHeader.SizeOfOptionalHeader ;
    NumberOfSection = ImageNtHeader->FileHeader.NumberOfSections ;
    SectionHeaderStart = (ULONG)ImageNtHeader->OptionalHeader + OHeaderSize ;
    if (NumberOfSection <= 0)
    {
        return 0;
    }
    for (i= 0 ; i < NumberOfSection ; i++)
    {
        if (RtlCompareMemory(SectionHeaderStart ,
            SectionName ,
            IMAGE_SIZEOF_SHORT_NAME) == IMAGE_SIZEOF_SHORT_NAME)
        {
            return SectionHeaderStart ;
        }
        SectionHeaderStart += sizeof(IMAGE_SECTION_HEADER) ;
       
       
       
    }   
    return 0;



}



//该函数的作用是从PE镜象中找到指定Section名的Section Header并返回



ULONG RtlGetHotPatchHeader(ULONG ImageBase)
{
PIMAGE_NT_HEADERS ImageNtHeader ;
PIMAGE_SECTION_HEADER SectionStart ;
PHOTPATCH_HEADER HPSectionData ;

    ImageNtHeader = RtlImageNtHeader(ImageBase) ;
    if (!ImageBase)
    {
        return 0 ;
    }
    SectionStart = RtlpFindSectionHeader(ImageNtHeader , HotPatchSectionName );
    if (!SectionStart)
    {
        return 0 ;
    }
    if (SectionStart->Misc.VirtualSize < sizeof(HOTPATCH_HEADER))
    {
        return 0;
    }
    HPSectionData = SectionStart->VirtualAddress ;
   
    if (HPSectionData->Signature != 0x31544F48 )
    {
        //Char 'HOT1'
        return 0 ;
    }
    if (HPSectionData->Version = 0x10000)
    {
        return HPSectionData;
       
    }
    return 0;
   
   
}

// 该函数的作用从PE镜象中找到HOTPATCH节的地址,并进行一些基本验证



ULONG
RtlFindRtlPatchHeader(LIST_ENTRY  HotPatchList,
                     PLDR_DATA_TABLE_ENTRY  LdrData )
{
LIST_ENTRY HotPatchList1 ;

HotPatchList1 = HotPatchList1.Blink ;

while (HotPatchList1 != HotPatchList)
{
    if (*(ULONG*)HotPatchList1 + 0x2c == (ULONG)LdrData)
    {
        return HotPatchList1 ;
    }
    HotPatchList1 = HotPatchList1.Blink ;
   
    
}
return 0 ;
}


// 从目前已安装的补丁列表中寻找当前的补丁是否是已经安装的
//即是从MiHotPatchList这个双向链表中寻找是否有符合的RTL_PATCH_HEADER



BOOLEAN RtlpValidatePeHeaderHash2(PRTL_PATCH_HEADER PatchHeader,
                     PVOID DllBase)
{
    //not implement
    return FALSE ;
}
BOOLEAN RtlpValidatePeChecksum(PRTL_PATCH_HEADER PatchHeader,
                     PLDR_DATA_TABLE_ENTRY LdrData)

{
    //not implement
    return FALSE
}

BOOLEAN RtlpValidateTargetModule(PRTL_PATCH_HEADER PatchHeader,
                     PVOID DllBase)

{
    ULONG Method ;

    Method = PatchHeader->HotpatchHeader->ModuleIdMethod ;
    switch (Method)
    {
    case 0x0 :
             DbgPrintEx(0x57 ,0x2 ,"HOTP_ID_None\n" ) ;
                return TRUE ;
    case 0x1 :
             DbgPrintEx(0x57, 0x2 , "HOTP_ID_PeHeaderHash1") ;
             return FALSE ;
    case 0x2 :
             DbgPrintEx(0x57, 0x2 , "HOTP_ID_PeHeaderHash2") ;
             return RtlpValidatePeHeaderHash2(PatchHeader , LdrData->DllBase ) ;
    case 0x3 :
             return RtlpValidatePeChecksum(PatchHeader , LdrData->DllBase ) ;
    case 0x10 :
        DbgPrintEx(0x57, 0x2 ,"HOTP_ID_PeDebugSignature") ;
             return FALSE ;
    default :
        DbgPrintEx(0x57 ,0x2 ,"Unrecognized" ) ;
        return FALSE ;

            

    }
    return FALSE ;

}
BOOL RtlpIsSameImage(PRTL_PATCH_HEADER PatchHeader,
                     PLDR_DATA_TABLE_ENTRY LdrData)
{
    ULONG ImageNtHeader ;
    ImageNtHeader = RtlImageNtHeader(LdrData->DllBase) ;
    if (!ImageNtHeader)
    {
        return FALSE ;   
    }
    if (!RtlEqualUnicodeString(PatchHeader->TargetDllName, LdrData->BaseDllName , TRUE) )
    {
        return FALSE ;
    }
    if (!RtlpValidateTargetModule(PatchHeader , LdrData ))
    {
        return FALSE ;
    }
    PatchHeader->TargetLdrDataTableEntry = LdrData ;
    PatchHeader->TargetDllBase = LdrData->DllBase ;
   
    return TRUE ;

}


void RtlpFreeHotPatchMemory(PVOID Pool)
{
    ExFreePoolWithTag(Pool,
        MEM_HOT_PATCH);
    return ;
}
void RtlFreeHotPatchData(PRTL_PATCH_HEADER PatchData)
{

    if (PatchData->CodeInfo)
    {
        RtlpFreeHotPatchMemory(PatchData->CodeInfo) ;
   

    }
        RtlFreeAnsiString(&PatchData->TargetDllName) ;
        RtlpFreeHotPatchMemory(PatchData);
       
    return ;
}
   
NTSTATUS RtlCreateHotPatch(PRTL_PATCH_HEADER *ImageBase ,
                           PHOTPATCH_HEADER HPSectionData ,
                           PLDR_DATA_TABLE_ENTRY LdrData,
                           NTSTATUS Flags)
{
PRTL_PATCH_HEADER PatchHeader ;
ANSI_STRING AnsiDllName ;
UNICODE_STRING UniDllName ;
NTSTATUS stat ;

    PatchHeader = ExAllocatePoolWithTag(PagedPool , 0x34 ,MEM_HOT_PATCH) ;
    if (!PatchHeader)
    {
        return STATUS_NO_MEMORY ;
    }
    RtlZeroMemory(PatchHeader , 0x0d);
   
    PatchHeader->PatchFlags = Flags & 0xfffffffe ;
    PatchHeader->HotpatchHeader = HPSectionData ;
    PatchHeader->PatchLdrDataTableEntry = LdrData ;
    PatchHeader->PatchImageBase = LdrData->DllBase ;
    PatchHeader->PatchList.Blink = PatchHeader ;
    PatchHeader->PatchList.Flink = PatchHeader ;
    RtlInitAnsiString(&AnsiDllName ,
        (LPCSTR)(HPSectionData->TargetNameRva + LdrData->DllBase));
    stat = RtlAnsiStringToUnicodeString(&UniDllName , &AnsiDllName , TRUE) ;
    if (!NT_SUCCESS(stat))
    {
        RtlFreeHotPatchData(PatchHeader);
        return stat ;
    }
    ImageBase = PatchHeader ;
    return stat ;
   
   
}
#define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8

VOID
ExUnlockUserBuffer (
    __inout PVOID LockVariable
    )

{
    MmUnlockPages ((PMDL)LockVariable);
    ExFreePool ((PMDL)LockVariable);
    return;
}

NTSTATUS
ExLockUserBuffer (
    __inout_bcount(Length) PVOID Buffer,
    __in ULONG Length,
    __in KPROCESSOR_MODE ProbeMode,
//    __in LOCK_OPERATION LockMode,
    __deref_out PVOID *LockedBuffer,
    __deref_out PVOID *LockVariable
    )

    //modify to Windows xp module
   

/*++

Routine Description:

    Wrapper for MmProbeAndLockPages.  Creates an MDL and locks the
    specified buffer with that MDL.       

Arguments:

    Buffer - pointer to the buffer to be locked.
    Length - size of the buffer to be locked.
    ProbeMode - processor mode for doing the probe in MmProbeAndLockPages.
    LockMode - the mode the pages should be locked for.
    LockedBuffer - returns a pointer to the locked buffer for use by the
                  caller.
    LockVariable - returns a context pointer.  This must be passed into
                  ExUnlockUserBuffer when complete so the MDL can be freed.                 

Return Value:

    Returns one of the following status codes:

        STATUS_SUCCESS - Normal, successful completion.

        STATUS_ACCESS_VIOLATION - The buffer is not accessible with the
                specified LockMode.
               
        STATUS_INSUFFICIENT_RESOURCES - not enough memory to allocate the MDL.                                         
               

--*/

{
    PMDL Mdl;
    SIZE_T MdlSize;

    //
    // It is the caller's responsibility to ensure zero cannot be passed in.
    //

    ASSERT (Length != 0);

    *LockedBuffer = NULL;
    *LockVariable = NULL;

    //
    // Allocate an MDL to map the request.
    //

    MdlSize = MmSizeOfMdl( Buffer, Length );
    Mdl = ExAllocatePoolWithQuotaTag (NonPagedPool | POOL_QUOTA_FAIL_INSTEAD_OF_RAISE,
                                      MdlSize,
                                      'ofnI');
    if (Mdl == NULL) {
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    //
    // Initialize MDL for request.
    //

    MmInitializeMdl(Mdl, Buffer, Length);

    try {

        MmProbeAndLockPages (Mdl, ProbeMode, 1);

    } _except (EXCEPTION_EXECUTE_HANDLER) {

        ExFreePool (Mdl);

        return GetExceptionCode();
    }

    Mdl->MdlFlags |= MDL_MAPPING_CAN_FAIL;
    *LockedBuffer = MmGetSystemAddressForMdl (Mdl);
    if (*LockedBuffer == NULL) {
        ExUnlockUserBuffer (Mdl);
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    *LockVariable = Mdl;
    return STATUS_SUCCESS;
}

发表于 @ 2008年05月08日 16:34:12|评论(loading...)|编辑

新一篇: ring3文件占坑大法 | 旧一篇: HookFunction

评论

#kaizitop 发表于2008-05-08 16:47:28  IP: 221.2.164.*
崇拜做加解密的,逆的好!改天在来详读!
#Chninfo 发表于2008-05-17 09:45:50  IP: 116.18.227.*
您的文章写的很不错,受益匪浅, 流水线www.sunlsx.com.cn 衷心佩服您,希望事业更上一层楼,发表更多好文章和大家一起分享!
发表评论  


登录
Csdn Blog version 3.1a
Copyright © Kevins