|
|
[求助]网络上OBJECT_TYPE的定义怎么这么多?
我也遇见这个问题了,等待大牛回复。 |
|
|
[原创]inline hook ObReferenceObjectByHandle() 实现拒绝指定进程执行
竹君: 我一开始就想改流程和框架了,可惜没改成。现在我研究object hook,inline hook之后还研究,到时候就先copy你的code. ps:你是sysdog ? |
|
|
[原创]inline hook ObReferenceObjectByHandle() 实现拒绝指定进程执行
谢谢,希望我以后可以写出更好的 inline hook |
|
|
[求助]请教iat hook方面的知识
lordPe 和 peView一样吗 |
|
|
|
|
|
[求助]请教iat hook方面的知识
《探索pe文件内幕》 我已经有了,可是还是没找到啊。 |
|
|
[求助]第一次inline hook蓝屏了。。。
恩恩,现在我正在看<rootkits - windows kernel 的安全防护>,呵呵,之后还打算做做无法删除进程的hook...到时候难免要请教你呢~ |
|
|
[求助]请教学习rootkit方法与步骤
书好贵呀~ 能读电子版的就先看看电子版的吧。 |
|
|
[求助]请教学习rootkit方法与步骤
我有个自己的计划,但是确实短期的。大家看看对不对,因为我也没老师,自己的话,担心走错路,浪费时间。 1 阅读<windows驱动编程基础教程> - 楚狂人 2 调试helloworld.c和ioctrl.c 对照<windows驱动编程基础教程> 3 阅读并调试inline hook代码 4 学会使用windbg和了解windows内核中的常用结构体 接下来打算阅读一些电子书,比如<rootkits windows内核的安全防护>... 可是我知道的资料并不多,希望大家给推荐点学习的资料。谢谢 to sudami: 有没有什么好的资料呀~ 还有可以简单的说下学习的步骤吗? |
|
|
[原创]inline hook ObReferenceObjectByHandle() 实现拒绝指定进程执行
to achillis: 那该怎么学呀~教主兄,告诉我学习的方法和步骤,加我QQ呀~ 我给你发消息了。 |
|
|
[求助]第一次inline hook蓝屏了。。。
to 轩辕小聪: 呵呵,我们都大意了,犯了一个最常见的错误。 open_write_protected(); KeLowerIrql(irql); 上面的2条代码永远不可能被执行,所以我在return之前调用这2条就可以了。问题已经解决了,谢谢你的帮助。 请看:http://bbs.pediy.com/showthread.php?t=93757 to 菊冬: 还可以这样啊? 我不会呀~ 要不就不用这么麻烦了。还猜测。 |
|
|
[求助]第一次inline hook蓝屏了。。。
to 轩辕小聪: 谢谢你一直的关注与帮助,你分析的流程和我之前理解的很接近,而且我又对照了你的流程分析和sysnap的原始代码重新修改了我的代码,但是又一次蓝屏,大概看了下dump的分析,貌似和irql有关系,你帮我看下,我现在去google上熟悉下irql的知识。 to achillis: 教主兄,帮帮我啊。 最近的inline hook ObReferObjectByHandle()代码: #include <ntddk.h> #include <string.h> extern POBJECT_TYPE *PsProcessType; //mov edi,edi //push ebp //mov ebp,esp unsigned char routine_head[5] = {0x8b,0xff,0x55,0x8b,0xec}; //jmp address unsigned char jmp_code[5] = {0xe9,0x00,0x00,0x00,0x00}; void close_write_protected() { //cancel write protected __asm { CLI MOV eax, CR0 AND eax, NOT 10000H MOV CR0, eax } } void open_write_protected() { __asm { MOV eax, CR0 OR eax, 10000H MOV CR0, eax STI } } //this routine unload current driver VOID DriverUnload(IN PDRIVER_OBJECT DriverObject) { KIRQL irql; irql = KeRaiseIrqlToDpcLevel(); close_write_protected(); //unload inline hook RtlCopyMemory(ObReferenceObjectByHandle,routine_head,5); open_write_protected(); KeLowerIrql(irql); DbgPrint("inline hook success unload."); return; } //this routine return 0 success run ObReferenceObjectByHandle() //this routine return 1 failed run ObReferenceObjectByHandle() int call_failed( IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInfo ) { PEPROCESS process; KIRQL irql; //this object is a process if(ObjectType == *PsProcessType) { irql = KeRaiseIrqlToDpcLevel(); close_write_protected(); //Unload inline hook in ObReferenceObjectByHandle() RtlCopyMemory(ObReferenceObjectByHandle,routine_head,5); //run the kernel routine ObReferenceObjectByHandle(Handle,DesiredAccess,ObjectType,AccessMode,&process,NULL); //install inline hook to ObReferenceObjectByHandle() RtlCopyMemory(ObReferenceObjectByHandle,jmp_code,5); //this request point to notepad.exe if(_stricmp((char *)((char *)process+0x174),"notepad.exe") == 0) return 1; else return 0; open_write_protected(); KeLowerIrql(irql); } else //this object not a process { return 0; } } //jmp this routine __declspec(naked) my_routine( IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInfor ) { __asm { mov edi,edi //create next stack for sub routine using push ebp mov ebp,esp //parameter enter the stack push [ebp+0x1c] push [ebp+0x18] push [ebp+0x14] push [ebp+0x10] push [ebp+0xc] push [ebp+8] //enter the routine call call_failed cmp eax,1 jz start_new mov eax,ObReferenceObjectByHandle add eax,5 jmp eax start_new: mov [ebp+8],-1 mov eax,ObReferenceObjectByHandle add eax,5 jmp eax } } //in this routine install inline hook NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) { //this is offset of jmp to my routine int jmp_offset; KIRQL irql; //set current driver unload routine DriverObject->DriverUnload = DriverUnload; irql = KeRaiseIrqlToDpcLevel(); close_write_protected(); //count and get to my_routine offset jmp_offset = (char *)my_routine - (char *)ObReferenceObjectByHandle - 5; //create the jmp offset to jmp_offset RtlCopyMemory(jmp_code+1,&jmp_offset,4); //inline hook ObReferenceObjectByHandle routine RtlCopyMemory(ObReferenceObjectByHandle,jmp_code,5); open_write_protected(); KeLowerIrql(irql); DbgPrint("install inline hook success."); return STATUS_SUCCESS; } windbg分析的dump信息: DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1) An attempt was made to access a pageable (or completely invalid) address at an interrupt request level (IRQL) that is too high. This is usually caused by drivers using improper addresses. If kernel debugger is available get stack backtrace. Arguments: Arg1: 0041f4a4, memory referenced Arg2: 00000002, IRQL Arg3: 00000000, value 0 = read operation, 1 = write operation Arg4: 0041f4a4, address which referenced memory Debugging Details: ------------------ PEB is paged out (Peb.Ldr = 7ffde00c). Type ".hh dbgerr001" for details PEB is paged out (Peb.Ldr = 7ffde00c). Type ".hh dbgerr001" for details READ_ADDRESS: 0041f4a4 CURRENT_IRQL: 2 FAULTING_IP: +41f4a4 0041f4a4 ?? ??? PROCESS_NAME: Dbgview.exe DEFAULT_BUCKET_ID: DRIVER_FAULT BUGCHECK_STR: 0xD1 LAST_CONTROL_TRANSFER: from 0041f4a4 to 804e287f FAILED_INSTRUCTION_ADDRESS: +41f4a4 0041f4a4 ?? ??? STACK_TEXT: f318c854 0041f4a4 badb0d00 0012f370 00000000 nt!KiTrap0E+0x233 WARNING: Frame IP not in any known module. Following frames may be wrong. 0012f354 00000000 00000000 00000000 00000000 0x41f4a4 STACK_COMMAND: kb FOLLOWUP_IP: nt!KiTrap0E+233 804e287f f7457000000200 test dword ptr [ebp+70h],20000h SYMBOL_STACK_INDEX: 0 SYMBOL_NAME: nt!KiTrap0E+233 FOLLOWUP_NAME: MachineOwner MODULE_NAME: nt IMAGE_NAME: ntoskrnl.exe DEBUG_FLR_IMAGE_TIMESTAMP: 42250ff9 FAILURE_BUCKET_ID: 0xD1_CODE_AV_BAD_IP_nt!KiTrap0E+233 BUCKET_ID: 0xD1_CODE_AV_BAD_IP_nt!KiTrap0E+233 Followup: MachineOwner |
|
|
[求助]第一次inline hook蓝屏了。。。
我摸索了一下sysnap那份代码,流程大概如下。如果不对,还请各位指出来: 1 代理函数以naked形式编写,并且函数体要用asm来实现,形式参数与ObRef相同。 2 代理函数体中的开辟新栈帧并且调用过滤函数: push ebp mov ebp,esp 3 然后使用push指令把实参入栈: push [...] push [...] 4 现在就可以直接call 过滤函数了 5 过滤函数返回int,并且代理函数根据这个int判断,是否正确调用原始ObRef,过滤函数的形参与ObRef相同。 6 首先判断用户所请求的Object是不是一个Process。 7 关闭写保护,改写ObRef前5字节为jmp address。 8 调用ObRef以获得用户想要的Object,然后判断这个Object中的ImageFileName是不是要保护的进程。 9 过滤函数返回1或0来告诉调用者是否正却调用ObRef |
|
|
[求助]第一次inline hook蓝屏了。。。
谢谢 轩辕小聪,我看了几遍sysnap的代码也没有把详细的流程摸清楚,而且我并不想完全按照他的流程和框架去写,所以总是有问题。再次谢谢你提供的例子,我先看下,有进一步结果了在来和大家分享。 |
|
|
|
|
|
[求助]第一次inline hook蓝屏了。。。
to 轩辕小聪: 昨天在QQ群,flowercode帮我解答了很久,最后他总结: 1. 你覆盖了ObRef前五个字节实现Hook。(正确) 2. my_routine()执行了原来的前五个字节。(正确) 3. my_routine()调用了call_failed()。(没问题) 4. call_failed()里Unhook了ObRef。(于是又变成了原来的前五个字节) 5. 你又调用了原版的ObRef。(蓝屏) 我今天早上修改了下,准备晚上调试看看,因为我白天还要在公司写代码。 很谢谢你2个帖子都打了这么多汉字。 第1条,我确实没做判断,不过貌似不应该失败呀~ 不过我这样写确实不严谨,不过我现在写第一个inline hook,只要可以实现功能就可以了,其它我没想。 第2条,我已经加上了处理其它对象类型的代码了,这个确实是很大的问题。 第3条,push ebp mov ebp,esp 我写了,不过my_routine()我没有接收call_failed()的返回值,因为我打算在call_failed()中把所有操作做完。 第4条,晕,原来还有一个销毁对象的函数要调用呀~ 之前看sysnap的代码也没看到,自己就不知道了,好的,我会添加进去的。我会慢慢把这个代码写好的。 |
操作理由
RANk
{{ user_info.golds == '' ? 0 : user_info.golds }}
雪币
{{ experience }}
课程经验
{{ score }}
学习收益
{{study_duration_fmt}}
学习时长
基本信息
荣誉称号:
{{ honorary_title }}
勋章
兑换勋章
证书
证书查询 >
能力值