首页
论坛
课程
招聘
雪    币: 205
活跃值: 活跃值 (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝

[调试逆向] [分享]自我分析windows 1903相关函数,仅做参考,反正找不到工作,每天逆向windows吧

2020-7-12 21:39 2008

[调试逆向] [分享]自我分析windows 1903相关函数,仅做参考,反正找不到工作,每天逆向windows吧

2020-7-12 21:39
2008

内核函数

一.内存函数

1.ExAllocatePoolWithTag

原型:PVOID NTAPI ExAllocatePoolWithTag (
                _In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType,
                _In_ SIZE_T NumberOfBytes,
                _In_ ULONG Tag
                );
参数:
    1)虚拟内存页类型,分页还是非分页
    2)大小
    3)随便写,自定义一个TAG
返回值:
    成功,返回内存指针
    失败,返回NULL
作用:
    申请内存

2.RtlFillMemory

原型:
参数:
返回值:
作用:
    初始化内存

3.RtlMoveMemory

原型:
参数:
返回值:
作用:
    复制内存

4.ExFreePoolWithTag

原型:VOID ExFreePoolWithTag (
    _Pre_notnull_ __drv_freesMem(Mem) PVOID P,
    _In_ ULONG Tag
    );
参数:
返回值:
作用:
    释放内存

二. 句柄转换内核对象函数

1.ObReferenceObjectByHandle

导出函数
原型:NTSTATUS ObReferenceObjectByHandle(
                _In_ HANDLE Handle,
                _In_ ACCESS_MASK DesiredAccess,
                _In_opt_ POBJECT_TYPE ObjectType,
                _In_ KPROCESSOR_MODE AccessMode,
                _Out_ PVOID *Object,
                _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation
                );
参数:
    1)对象的句柄
    2)访问权限,GENERIC_ALL
    3)指向对象类型的指针。如果ObjectType不为NULL,则操作系统将验证提供的对象类型是否与Handle指定的对象的对象类型匹配。
    4)指定先前模式,UserMode或KernelMode
    5)返回句柄对应的内核对象的指针
    6)设置为NULL,即可
返回值:
    成功,返回STATUS_SUCCESS
    失败,返回
        STATUS_OBJECT_TYPE_MISMATCH    的对象类型参数指定要由所标识的对象的错误的对象类型句柄参数。
        STATUS_ACCESS_DENIED        无法授予调用方请求的对象访问权限。
        STATUS_INVALID_HANDLE        该句柄参数是不是有效的对象句柄。
作用:
    根据句柄找到相应的内核对象地址

2.ObReferenceObjectByHandleWithTag

原型:NTSTATUS ObReferenceObjectByHandleWithTag(
                _In_ HANDLE Handle,
                _In_ ACCESS_MASK DesiredAccess,
                _In_opt_ POBJECT_TYPE ObjectType,
                _In_ KPROCESSOR_MODE AccessMode,
                _In_ ULONG Tag,
                _Out_ PVOID *Object,
                _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation
                );
参数:
    除了多了一个自定义的标签值外,其它参数和ObReferenceObjectByHandle一样
    5)指定一个四字节的自定义标签值
返回值:
    和ObReferenceObjectByHandle一样
作用:
    和ObReferenceObjectByHandle一样

##三 线程相关函数

1.PspTerminateThreadByPointer(未导出)

原型:NTSTATUS __fastcall PspTerminateThreadByPointer(
            _In_ PETHREAD Thread,
            _In_ NTSTATUS ExitStatus,
            _In_ BOOLEAN DirectTerminate
            );
参数:
    1)要结束的线程结构体地址
    2)自定义退出码
    3) 第一个参数是当前线程,则使用TRUE。 
        第一个参数不是当前线程,则使用FALSE
返回值:
    成功,返回STATUS_SUCCESS
    失败
作用:
    结束线程
    当第一个参数是当前线程,并使用TRUE时,会调用PspExitThread函数来结束线程
    当第一个参数是当前线程,但强行使用FALSE时,会调用KeRequestTerminationThread函数,往当前线程插入APC
    当第一个参数是其它线程,无论使用TRUE和FALSE,都会调用KeRequestTerminationThread函数,往目标线程插入
        APC

###2.PspExitThread(未导出)

原型:__fastcall PspExitThread(
            In_ NTSTATUS ExitStatus,
            )
参数:
    自定义退出码
返回值:

作用:
    用来结束当前线程

3.PspClearProcessThreadCidRefs(未导出)

原型:VOID __fastcall PspClearProcessThreadCidRefs(
                _In_ PETHREAD pEThread,
                _In_ UINT TID,
                _In_ PETHREAD pEThread
                )
返回值:
    无
作用:
    未知,其中有可能处理内核APC机会

###4.KiSwapContext(未导出)

原型:BOOL __fastcall KiSwapContext(
                _In_ PETHREAD pEThread,
                _In_ PETHREAD pEThread,
                _In_ UCHAR irql
                )
参数:
    1)当前线程ETHREAD
    2)目标线程ETHREAD
    3)当前线程的IRQL
返回值:
    0 表示正常返回
    非0 表示有内核APC需要处理
作用:
    线程切换函数

##四 进程挂靠

 

###1.KeStackAttachProcess

原型:VOID KeStackAttachProcess (
            _Inout_ PRKPROCESS PROCESS,
            _Out_ PRKAPC_STATE ApcState
            );
参数:
    1)目标进程_KPROCESS地址
    2)KAPC_STATE结构体地址,必须把此结构体放到非分页内存或线程栈中
返回:
    无
作用:
    将当前线程挂靠到其它进程中,会调用KiAttachProcess

2. KiAttachProcess(未导出)

原型:__fastcall KiAttachProcess(
            _In_ PKTHREAD pKThread;
            _In_ PKPROCESS pKProcess;
            _In_ KIRQL    kIrql;
            _In_ 0;
            _In_ PKAPC_STATE pSavedApcState
            )
参数:
    1)挂靠线程的 _KTHREAD 基址
    2)挂靠目标进程的 _KPROCESS 基址
    3)要恢复的IRQL级别
    4)未知
    5)当前线程的SavedApcState基址
返回值:
作用:
    将当前线程挂靠到其它进程中

3.KiMoveApcState

原型:VOID __fastcall KiMoveApcState(
            _In_ PKAPC_STATE pApcState,
            _In_ PKAPC_STATE pSavedApcState
            );
参数:
    1)原来的_KAPC_STATE的基址
    2)要复制到的_KAPC_STATE的基址
返回值:
    无
作用:
    将一个线程中的ApcState复制到SavedApcState中。
    ApcState中如果没有内核APC,则[ApcState+0] == [ApcState+4] == ApcState基址
                [SavedApcState+0] == [SavedApcState+4] == SavedApcState基址
    ApcState中如果没有用户APC,则[ApcState+8] == [ApcState+c] == ApcState+8基址
                [SavedApcState+8] == [SavedApcState+c] == SavedApcState基址
    ApcState中如果有内核APC或用户APC,除了将ApcState的内容放到SavedApcState中,
                还会将SavedApcState基址放到ApcState+0,+4,+8,+c中

五IRQL

1.KeRaiseIrqlToDpcLevel

原型:KIRQL KeRaiseIrqlToDpcLevel (VOID);
参数:
    无
返回值:
    返回之前的IRQL
作用:
    提升当前线程的IRQL级别到dispacherLevel级

2.KeLowerIrql

原型:void KeLowerIrql(
          KIRQL NewIrql
        );
参数:
    要降低到的IRQL级
返回值:
    无
作用:
    将当前线程的IRQL降级

六 APC

1.PspExitThread


2.KiInsertQueueApc(未导出)

__fastcall KiInsertQueueApc(x)
参数:
    1) ecx中存放_KAPC基址
作用:
    插入APC

3. KiDeliverApc(未文档化)

原型: __stdcall KiDeliverApc(
                BOOL KerOrUserApc,
                ,

                )
参数:
    1) 0 表示只处理内核APC
        1 表示先处理内核APC,再处理用户APC
    2)

七 句柄

1.ExpLookupHandleTableEntry(未导出)

原型:PHANDLE_TABLE_ENTRY NTAPI ExpLookupHandleTableEntry(
                IN PHANDLE_TABLE HandleTable,
                IN EXHANDLE Handle
                )
参数:
    1)HANDLE_TABLE地址,此参数在ecx中
    2)线程或进程句柄            此参数在栈中
返回值:
    正确,返回一个地址,该地址是句柄对应的项在全局句柄表中的地址
    失败,返回NULL
作用:
    用来在全局句柄表中,找到HANDLE_TABLE_ENTRY的基地址

2.ExLockHandleTableEntry(未导出)

原型:UINT __fastcall ExLockHandleTableEntry(
            _In_ PHANDLE_TABLE pHandleTable,
            _In_ PHANDLE_TABLE_ENTRY pHandleTableEntry
            )
参数:
    1)全局句柄表_HANDLE_TABLE地址
    2) _HANDLE_TABLE_ENTRY 基地址
返回值:
    正常返回,al=1
作用:
    暂不清楚该函数作用

3. ExMapHandleToPointer(未导出)

原型:PHANDLE_TABLE_ENTRY __FastCall ExMapHandleToPointer(
                _In_ _HANDLE_TABLE hHandleTable,
                _In_ UINT ID
                )
参数:
    1)句柄表基址
    2)线程或进程ID
返回值:
    正确,返回TID或PID对应的HANDLE_TABLE_ENTRY的基地址
    错误,返回NULL
作用:
    使用TID或PID,在全局句柄表中找到对应的HANDLE_TABLE_ENTRY

八 异常

1. RtlGetExtendedContextLength(未导出)

NTSTATUS __fastcall RtlGetExtendedContextLength(
            _In_ DWORD ContextFlag,
            _Out_ PDORD ContextLength,
            )
参数:
    1)ContextFlag
    2)返回Context结构体的大小
返回值:
    正常,0
    其它,非0
作用:
    返回Context结构的大小

2. RtlpValidateContextFlags(未导出)

NTSTATUS __fastcall RtlpValidateContextFlags(
            _In_ DWORD Contextflag,
            _Out_ PDWORD value
            )
参数:
    1)标志
    2) 此值会返回两种结果,分别为1和3,1表示ContextFlag为1003F,3表示ContextFlag为1007F
返回值:
    成功,0,表示ContextFlag是有效标志
    失败,非0,表示ContextFlag是无效标志
作用:
    判断ContextFlag是否是有效标志

3.RtlGetLegacyContextLength(未导出)

VOID __fastcall RtlGetLegacyContextLength(
            _In_ DWORD Contextflag,
            _Out_ PDWORD pContextLength
            _Out_ PDWORD 未知
)
参数:
    1)标志
    2)返回传统Context的大小,0x2CC
    3)如果不为NULL,一般返回4
返回值:
    第三个参数中传进去是什么,就返回什么
作用:
    返回ContextLength的大小

4. RtlGetExtendedContextLength(未导出)

NTSTATUS __fastcall RtlGetExtendedContextLength(
            _In_ DWORD Contextflag,
            _Out_ PDWORD pContextLength
            )
参数:
    1)ContextFlag标志
    2)返回扩展Context的大小,一般为0x2e8,传统为2cc,多了18
返回值:
    正常,返回0
    错误,返回非0
作用:
    获得扩展CONTEXT的大小

5. RtlInitializeExtendedContext(未导出)

NTSTATUS __fastcall RtlInitializeExtendedContext(
            _In_    PCONTEXT    pContext,
            _In_    DWORD        ContextFlag,
            _Out_     DWORD        ExtendContextAddress
            )
参数:
    1)要初始化Context结构的基址
    2)ContextFlag
    3)返回Context扩展部分的地址,即Context基址+2cc
返回值:
    0,正常
    非0,错误
作用:
    用来初始化Context结构的扩展部分,共0x18
    0x00    0x2cc的补码
    0x04    扩展Context的总大小,即2cc+18
    0x08    0x2cc的补码
    0x0C    0x0cc
    0x10    0x19
    0x14    0

6. RtlpCopyExtendedContext(未导出)

__fastcall RtlpCopyExtendedContext(
            _In_     BOOL    isCopy.
            _Out_    PVOID     pDesBuffer,
            _In_    PDWORD    数组,
            _In_    DWORD    ContextFlag,
            _In-    PVOID    pSorBuffer,
            _Out_    DWORD    iCout
            )
参数:
    1)TRUE:表示复制        FALSE:表示不复制
    2)目的Context区的栈底
    3)
    4)ContextFlag
    5)源Context区的栈底
    6)

7. RtlpCopyLegacyContextX86

VOID __fastcall RtlpCopyLegacyContextX86(
            _In_    BOOL  isCopy,
            _Out_    PVOID pDesBuffer,
            _In_    DWORD ContextFlag,
            _In_    PVOID pSourBuffer
            )
参数:
    1)TRUE:表示复制        FALSE:表示不复制
    2)目的Context的栈顶
    3)ContextFlag
    4)源Context的栈顶
返回值:
    无
作用:
    仅复制Context本身,不包括扩展部分

4. KiDebugRoutine(未导出)

BOOL __fastcall KiDebugRoutine(
            _In_ PKTRAP_FRAME pTrapFrame,
            _In_ PKEXCEPTION_FRAME pExceptionFrame,
            _In_ PEXCEPTION_RECORD pExceptionRecord,
            _In_ PCONTEXT    pContext,
            _In_ KPROCESSOR_MODE    PreviousMode,
            _In_ BOOL    是否是第二次机会
            )
参数:
    1)TRAP_FRAME地址
    2)对NT386的系统总是为0,未使用
    3)异常结构信息
    4)Context地址,异常上下文
    5)发生异常时,CPU是内核模式还是用户模式
    6)是否是第二次机会处理,FALSE表示第一次,TRUE表示第二次
返回值:
    TRUE,表示异常已被正常处理
    FALSE,表示异常未被处理,可能的原因是不存在内核调试器,或内核调试器没有处理该异常
作用:
    第一次处理内核异常
注意:
     KiDebugRoutine仅是个全局变量,它指向kdpTrap或kdpStub

5. RtlDispatchException(未导出)

BOOL __stdcall RtlDispatchException(
            _In_ PEXCEPTION_RECORD pExceptionRecord,
            _In_ PCONTEXT    pContext
            )
参数:
    1)异常结构信息
    2)Context地址,异常上下文
返回值:
    TRUE:表示异常已被正常处理
    FALSE:表示异常未被处理
作用:
    遍历SEH链表,来处理异常

6.DbgkForwardException(未导出)

BOOL __fastcall DbgkForwardException(
            _In_ PEXCEPTION_RECORD pExceptionRecord,
            _In_ BOOL Port
            _In_ BOOL secondChance
            )
参数:
    1)EXCEPTION_RECORD
    2)TRUE 调试端口,FALSE 异常端口,表示将异常发给哪个端口
    3)FLASE表示第一次机会,TRUE表示第二次机会
返回值:
    TRUE 表示3环调试器处理了该异常
    FALSE 表示3环调试器未处理该异常
作用:
    将异常发给3环调试器,并调用3环调试器,

##其它

 

###1.MmGetSystemRoutineAddress

2.



2020,给你一个诚意满满的夏令营!

最新回复 (7)
雪    币: 7075
活跃值: 活跃值 (136)
能力值: ( LV5,RANK:68 )
在线值:
发帖
回帖
粉丝
万剑归宗 活跃值 1 2020-7-13 08:50
2
0
那你就很可能今年还是找不到
雪    币: 1538
活跃值: 活跃值 (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mydvdf 活跃值 2020-7-13 08:56
3
0
等待大佬公布流程
雪    币: 205
活跃值: 活跃值 (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xshacry 活跃值 2020-7-13 23:41
4
0
我想修改发的帖子,每天增加内容,怎么修改,我找不到修改按钮啊
雪    币: 605
活跃值: 活跃值 (36)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
ugvjewxf 活跃值 2020-7-15 09:00
5
0
你把pg逆向了,然后发帖,就可以找到工作了。
雪    币: 1060
活跃值: 活跃值 (286)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
昵称好麻烦 活跃值 2020-7-15 09:48
6
0
那你就很可能今年还是找不到
雪    币: 2635
活跃值: 活跃值 (82)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
昍昍 活跃值 2020-7-15 10:03
7
0
我只能说,,保持职业操守,这不,刚判了一个
https://wenshu.court.gov.cn/website/wenshu/181107ANFZ0BXSK4/index.html?docId=8698e8d882fb4a1c839fabf2009a52a2
加油,面包会有的,工作也会有的
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
渣男 活跃值 2020-7-19 03:42
8
0
不是吧,那么牛都找不到工作?广州来不来先20k一个月,后面慢慢加,工作轻松,一天8小时不加班
游客
登录 | 注册 方可回帖
返回