首页
社区
课程
招聘
[分享]自己定义Object Type
发表于: 2012-8-27 12:06 5239

[分享]自己定义Object Type

2012-8-27 12:06
5239
如题,这东西我以前没搞过,现在自己弄下,分享出来。
没什么技术含量,会的请坐火箭。

基础知识可以参考这篇帖子:
http://bbs.pediy.com/showthread.php?t=150403&highlight=ParseProcedure

我就直接上码了,,

#define OBJECT_TO_OBJECT_HEADER( o )  CONTAINING_RECORD( (o), OBJECT_HEADER, Body )

OBJECT_TYPE g_obMyProcessTYPE;
WCHAR g_ProcType[ 24 ] = L"srocess";

VOID Test()
{
        NTSTATUS ntStatus1 = STATUS_SUCCESS;// Assume success
        HANDLE hProcess = NULL;
        CLIENT_ID ClientId;
        OBJECT_ATTRIBUTES ObjectAttributes;
        PVOID pEprocess = NULL;

        ClientId.UniqueProcess = (HANDLE)300;   // 这里自己填写一个进程id
        ClientId.UniqueThread = NULL;

        DbgBreakPoint();

        InitializeObjectAttributes( &ObjectAttributes, NULL, 0, NULL, NULL );
        ntStatus1 = ZwOpenProcess( &hProcess, PROCESS_ALL_ACCESS, &ObjectAttributes, &ClientId );
        if( NT_SUCCESS( ntStatus1 ) )
        {
                ntStatus1 = ObReferenceObjectByHandle( hProcess, PROCESS_ALL_ACCESS, NULL, KernelMode, &pEprocess, NULL );
                if( NT_SUCCESS( ntStatus1 ) )
                {
                        POBJECT_HEADER pHeader = OBJECT_TO_OBJECT_HEADER( pEprocess );

                        DbgOutput( "0 pHeader=%x,pType=%x,pBody=%x...", (ULONG)pHeader, (ULONG)pHeader->Type, (ULONG)pEprocess );

                       
                        RtlCopyMemory( &g_obMyProcessTYPE, pHeader->Type, sizeof(OBJECT_TYPE) );

                        // 修改进程类型
                        RtlInitUnicodeString( &g_obMyProcessTYPE.Name, g_ProcType );

                        pHeader->Type = &g_obMyProcessTYPE;


                        DbgOutput( "1 pHeader=%x,pType=%x,pBody=%x...", (ULONG)pHeader, (ULONG)pHeader->Type, (ULONG)pEprocess );

                        ObDereferenceObject( pEprocess );
                }

                ZwClose( hProcess );
        }
}


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 27
活跃值: (90)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
我喜欢guxinyi :)
2012-8-27 14:02
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
3

我只对女人有兴趣哈,
2012-8-27 17:15
0
雪    币: 219
活跃值: (738)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
4
这个哪里见过 好像有人也发过
2012-8-27 18:26
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
5
其实这个就是个对特定object的objectType进行修改劫持,从而防止object被打开,并没有产生新的objectType。
在XT里可以看到内核存在的ObjectType无变化。
2012-8-27 20:08
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
6
如果要产生新的objectType,需要去研究objectType存在哪里。然后才能考虑添加新的类型,
我明天再研究下。呵呵
2012-8-27 23:27
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
7
OBJECT_TYPE_INITIALIZER objectTypeInitializer;
    UNICODE_STRING nameString;

    //
    // Initialize the common fields of the Object Type Initializer record
    //

    RtlZeroMemory( &objectTypeInitializer, sizeof( objectTypeInitializer ) );
    objectTypeInitializer.Length = sizeof( objectTypeInitializer );
    objectTypeInitializer.InvalidAttributes = OBJ_OPENLINK;
    objectTypeInitializer.GenericMapping = IopFileMapping;
    objectTypeInitializer.PoolType = NonPagedPool;
    objectTypeInitializer.ValidAccessMask = FILE_ALL_ACCESS;
    objectTypeInitializer.UseDefaultObject = TRUE;

    //
    // Create the object type for adapter objects.
    //

    RtlInitUnicodeString( &nameString, L"Adapter" );
    // objectTypeInitializer.DefaultNonPagedPoolCharge = sizeof( struct _ADAPTER_OBJECT );
    if (!NT_SUCCESS( ObCreateObjectType( &nameString,
                                      &objectTypeInitializer,
                                      (PSECURITY_DESCRIPTOR) NULL,
                                      &IoAdapterObjectType ))) {
        return FALSE;
    }
2012-8-27 23:52
0
游客
登录 | 注册 方可回帖
返回
//