|
|
|
|
|
本人初中生在国外对黑客技术很感兴趣,想在这里拜个师,求求了,来个大佬请收我为徒吧,谢谢!
你找找CTF题库,国内国外都有类似的网站,从入门开始刷,刷到哪学到哪。检验一下自己是否真的对这些感兴趣,感兴趣的又具体是其中的哪一个方向。 |
|
[求助]大家有没有面向中小学生的关于网络安全教学的ppt或者教材呀
建议先学少儿编程,noi、noip课程安排上,看看孩子有没有兴趣。有兴趣就学几年,根基打好再根据孩子具体的兴趣方向具体引导,要真对安全有兴趣,就再学ctf的课程,看看对哪个安全方向感兴趣。网络安全这种东西,包罗万向,需要的前置知识很多,就算有针对中小学生的,也只是概念普及,用处不大。 |
|
[讨论]openedr的驱动代码里面kernelinjectlib可以单独拿出来做个静态库吧
openedr的注入方式挺常规的,参考他的自己写一个也很快,没必要硬拆。 |
|
求助,关于在verifier.exe开启Force IRQL Checking选项时,会导致MmIsAddressValid返回非预期结果的问题
参考WRK复原了MmIsAddressValid函数,但是发现在UnloadRoutine的时候,PTE页的P位和A2位都被置0,貌似不是页面被换出的情形?
#include <ntifs.h> UNICODE_STRING g_ustr = {0}; typedef struct _MMPTE_HARDWARE { unsigned long long P : 1; // present (1 = present) unsigned long long RW : 1; // read/write unsigned long long US : 1; // user/supervisor unsigned long long PWT : 1; // page-level write-through unsigned long long PCD : 1; // page-level cache disabled unsigned long long A : 1; // accessed unsigned long long Reserved : 1; // dirty unsigned long long PS : 1; // page size (0 = 4-KB page) unsigned long long G : 1; // global page unsigned long long A1 : 1; // available 1 aka copy-on-write unsigned long long A2 : 1; // available 2/ is 1 when paged to disk unsigned long long A3 : 1; // available 3 unsigned long long PFN : 28; // page-frame number unsigned long long reserved1 : 12; // reserved unsigned long long WS : 11; // SoftwareWsIndex unsigned long long NE : 1; // NoExecute } MMPTE_HARDWARE, *PMMPTE_HARDWARE; typedef struct _MMPTE { union { ULONG_PTR Long; MMPTE_HARDWARE Hard; } u; } MMPTE, *PMMPTE; #define PAGE_SHIFT 12L #define PXE_BASE 0xFFFFF6FB7DBED000UI64 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68UI64 #define PPE_BASE 0xFFFFF6FB7DA00000UI64 #define PDE_BASE 0xFFFFF6FB40000000UI64 #define PTE_BASE 0xFFFFF68000000000UI64 #define PTE_PER_PAGE 512 #define PDE_PER_PAGE 512 #define PPE_PER_PAGE 512 #define PXE_PER_PAGE 512 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1) #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1) #define PPI_MASK (PPE_PER_PAGE - 1) #define PXI_MASK (PXE_PER_PAGE - 1) #define VIRTUAL_ADDRESS_BITS 48 #define VIRTUAL_ADDRESS_MASK ((((ULONG_PTR)1) << VIRTUAL_ADDRESS_BITS) - 1) #define PTI_SHIFT 12 #define PDI_SHIFT 21 #define PPI_SHIFT 30 #define PXI_SHIFT 39 #define PTE_SHIFT 3 #define MiGetPxeOffset(va) ((ULONG)(((ULONG_PTR)(va) >> PXI_SHIFT) & PXI_MASK)) #define MiGetPxeAddress(va) ((PMMPTE)PXE_BASE + MiGetPxeOffset(va)) #define MiGetPpeAddress(va) \ ((PMMPTE)(((((ULONG_PTR)(va) & VIRTUAL_ADDRESS_MASK) >> PPI_SHIFT) << PTE_SHIFT) + PPE_BASE)) #define MiGetPdeAddress(va) \ ((PMMPTE)(((((ULONG_PTR)(va) & VIRTUAL_ADDRESS_MASK) >> PDI_SHIFT) << PTE_SHIFT) + PDE_BASE)) #define MiGetPteAddress(va) \ ((PMMPTE)(((((ULONG_PTR)(va) & VIRTUAL_ADDRESS_MASK) >> PTI_SHIFT) << PTE_SHIFT) + PTE_BASE)) #define MI_PDE_MAPS_LARGE_PAGE(PDE) ((PDE)->u.Hard.PS == 1) BOOLEAN MyMmIsAddressValid(PVOID Address) { ULONG_PTR StartAddress = (ULONG_PTR)Address; PMMPTE PointerPte = NULL; UINT_PTR kernelbase = 0x7fffffffffffffffULL; UINT_PTR toppart = 0; if (!StartAddress) { return FALSE; } // cannonical check. Bits 48 to 63 must match bit 47 toppart = (StartAddress >> 47); if (toppart & 1) { // toppart must be 0x1ffff if (toppart != 0x1ffff) return FALSE; } else { // toppart must be 0 if (toppart != 0) return FALSE; } PointerPte = MiGetPxeAddress (Address); if (PointerPte->u.Hard.P == 0) { return FALSE; } PointerPte = MiGetPpeAddress (Address); if (PointerPte->u.Hard.P == 0) { return FALSE; } PointerPte = MiGetPdeAddress (Address); if (PointerPte->u.Hard.P == 0) { return FALSE; } if (MI_PDE_MAPS_LARGE_PAGE (PointerPte)) { return TRUE; } PointerPte = MiGetPteAddress (Address); if (PointerPte->u.Hard.P == 0) { return FALSE; } if (MI_PDE_MAPS_LARGE_PAGE (PointerPte)) { return FALSE; } return TRUE; } VOID DriverUnload(PDRIVER_OBJECT pDrvObj) { /* * 当开启verifier的Force IRQL Checking时"MmIsAddressValid"会返回False,否则返回True */ KIRQL irql = KeGetCurrentIrql(); DbgPrint("Unload IRQL [%d] \n", irql); DbgBreakPoint(); DbgPrint("Ustr --> [%wZ][%d] \n", &g_ustr, MyMmIsAddressValid(g_ustr.Buffer)); RtlFreeUnicodeString(&g_ustr); } NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObj, PUNICODE_STRING pUstrRegPath) { NTSTATUS status = STATUS_SUCCESS; ANSI_STRING ansiString; RtlInitAnsiString(&ansiString, "abbccddee"); pDrvObj->DriverUnload = DriverUnload; status = RtlAnsiStringToUnicodeString(&g_ustr, &ansiString, TRUE); DbgPrint("RtlAnsiStringToUnicodeString return [0x%X] \n", status); if (!NT_SUCCESS(status)) { return STATUS_UNSUCCESSFUL; } /* * 此处不影响,"MmIsAddressValid"的返回值依然是True */ DbgBreakPoint(); DbgPrint("Ustr --> [%wZ][%d] \n", &g_ustr, MyMmIsAddressValid(g_ustr.Buffer)); return STATUS_SUCCESS; } |
|
求助,关于在verifier.exe开启Force IRQL Checking选项时,会导致MmIsAddressValid返回非预期结果的问题
所以原因是由于verifier导致分页内存被换出,而MmIsAddressValid只检查内存页面的P位,导致不识别分页内存被换出的情况? |
|
求助,关于在verifier.exe开启Force IRQL Checking选项时,会导致MmIsAddressValid返回非预期结果的问题
已测试,但看起来RtlAnsiStringToUnicodeString返回值是正常的,而且就算返回失败,紧接在它后面的MmIsAddressValid也应该失败。 (正文代码已更新) |
|
发一个自己写的简单32位游戏保护
cvcvxk 看到改进后的inlinehook了。还是继续吐槽:KeNumberProcessors 这个是尴尬的东西,会遇到你想不到的问题——Win7以上系统用KeQueryActivePro ...请问一下,使用KeIpiGenericCall就不会触发watchdog蓝屏了吗? |
|
[原创]三个反汇编库的简单介绍和使用
Hi, 可以评估一下Bitdefender开源的反汇编引擎:https://github.com/bitdefender/bddisasm,看起来还不错。
最后于 2021-5-17 10:55
被PeterZheng编辑
,原因:
|
|
|
|
|
|
[原创]沙箱:概述
不知道大佬对于驱动的虚拟化有什么好的解决方案呢?很多现成的沙箱是不让加载驱动的。 |
|
[求助](问题已解决)写了一段无dll的远程线程注入代码,可是为什么每次注入都会引发被注入程序的崩溃?一直没有找到原因,请大家帮个忙,谢谢!
问题已解决,感谢8楼大佬,学艺不精,见笑!!64位系统内存索引应该是64位的,不能用DWORD。 |
|
[求助](问题已解决)写了一段无dll的远程线程注入代码,可是为什么每次注入都会引发被注入程序的崩溃?一直没有找到原因,请大家帮个忙,谢谢!
在win7 64bits上LoadLibrary("Shell32.dll")报5号Windows Error(拒绝访问),但并不知道为什么。。。 |
操作理由
RANk
{{ user_info.golds == '' ? 0 : user_info.golds }}
雪币
{{ experience }}
课程经验
{{ score }}
学习收益
{{study_duration_fmt}}
学习时长
基本信息
荣誉称号:
{{ honorary_title }}
能力排名:
No.{{ rank_num }}
等 级:
LV{{ rank_lv-100 }}
活跃值:
在线值:
浏览人数:{{ visits }}
最近活跃:{{ last_active_time }}
注册时间:{{ user_info.create_date_jsonfmt }}
勋章
兑换勋章
证书
证书查询 >
能力值