自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

LYSM

[LYing SiMon] tells the lies that he [Loves You So Much]

  • 博客(22)
  • 收藏
  • 关注

原创 加密算法分类

单向散列算法也叫 Hash 算法,将任意长度的明文加密成固定长度的密文,且过程不可逆。常见的单向散列算法有 MD5,SHA名称组成长度MD50 - 9,a - z32SHA10 - 9,a - z40SHA2240 - 9,a - z56SHA2560 - 9 ,a - z64SHA3840 - 9,a - z96SHA5120 - 9,a - z128对称加密算法加密时使用的密钥和解密时使用的密钥是相同的,且每次加密

2020-07-30 17:47:28 287

转载 ShellCode —— 无线程注入

背景也叫进程内存替换,就是指将一个进程的内存数据清空,写入任意我们想写入的数据,并更改执行顺序,执行我们写入的数据代码。简单过程就是:创建一个挂起主线程的进程(也可以直接挂起目标进程,不自己创建)在新进程的地址空间内申请一块内存,写入我们的 Shellcode更改新进程执行顺序,执行我们的 Shellcode 代码函数介绍// 获取线程上下文 BOOL WINAPI GetThreadContext( _In_ HANDLE hThread,

2020-07-26 15:51:41 765 1

原创 ShellCode —— 入门

原理简单来说,shell code 的核心就是把代码写成 “与地址无关” 的风格,让它不论是在什么环境下都可以被执行。具体注意:使用 API 时应该动态调用(GetProAddress)不能使用全局变量,或者用 static 修饰的变量在 shellcode 工程中要自定义入口函数确保调用 API 之前都已经加载了与之对应的 DLL所有的字符串都要用字符串数组的方式代替环境搭建首先新建一个项目,这里我推荐 空项目,之后创建一个 main.cpp 文件:使用 Release 模式写

2020-07-22 15:30:20 4469 1

原创 DLL 注入 —— 反射式注入(内存手动映射)

介绍反射式注入 dll ,不会调用 LoadLibrary 这个 API,因此也无法使用 CreateToolhelp32Snapshot 遍历到这个模块。同时也不需要 DLL 留在磁盘上(可以通过网络下发,或加密后存放在磁盘),因此这种注入方式更加隐蔽。原理总的来说,就是我们要重新实现一遍 LoadLibrary 这个 API ????:假设现在我们已经使用 ReadFile 拿到了 DLL 的所有内容之后我们需要调用 VirtualAlloc 在目标进程中申请一块内存用来存放这个 DLL

2020-07-19 20:08:34 3221

转载 WinDbg 与被调试机的通信过程

原文摘自百度百科,讲实话这是我在百科里看到的最良心的文,可惜百科也是抄的别人的 ????。WinDBG和用户调试器一点很大不同是内核调试器在一台机器上启动,通过串口调试另一个相联系的以Debug方式启动的系统,这个系统可以是虚拟机上的系统,也可以是另一台机器上的系统(当然也可以是本地内核调试,不需要第二台机器)。windbg 提供的调试功能并不是都集成在了程序本身,很多功能被 windows集成进了内核,WinDBG 只是用来作为 “通讯工具” ,来让被调试机器和本机保持联系。当异常发生于内核态下,会调

2020-07-17 18:46:40 395

原创 反调试 - r3 使用 NtQuerySystemInformation 获取 KdKdDebuggerEnable 和 KdDebuggerNotPresent

原理NtQuerySystemInformation 被 ntdll.dll 导出,当第一个参数传入 0x23 (SystemInterruptInformation) 时,会返回一个 SYSTEM_KERNEL_DEBUGGER_INFORMATION 结构,里面的成员KdKdDebuggerEnable 和 KdDebuggerNotPresent 标志系统是否启用内核调试。代码示例// Test_Console_1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//

2020-07-14 18:32:41 1256

原创 反调试 - 调试对象

原理当一个程序被调试时,有两种情况:“打开” 和 “附加” ,分别调用 CreateProcess 和 DebugActiveProcess 创建一个调试对象,而通过检测系统中有无调试对象,可以判断出是否有进程正在被调试。这种方法适用于全局反调试,也就是说即使被调试的程序不是自身,也仍然会被检测到。代码示例// Test_Console_1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>#include <W

2020-07-14 10:52:05 555

原创 反调试 - OpenProcess 权限

原理在没有调试器的情况下,程序默认没有 “调试权限” 的,在默认权限下使用 OpenProcess 已 PROCESS_QUERY_LIMITED_INFORMATION 作为第一个参数是无法打开类似与 Csrss.exe 这种系统进程的。但如果程序处于被调试状态,就会被赋予一个 “调试权限”,这时 OpenProcess 就会成功。代码示例// Test_Console_1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream&

2020-07-13 17:47:04 860

原创 反调试 - 父进程是否为 explorer.exe

原理正常情况下,我们自己的进程的父进程是 explorer.exe ,当然也有很多进程的父进程不是 explorer.exe(比如服务进程)但这不是我们考虑的范畴。如果程序在调试则父进程是就是调试器进程。代码示例// Test_Console_1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>#include <Windows.h>#include <intrin.h>using na

2020-07-13 15:21:58 829

原创 反调试 - TrapFlag

原理TrapFlag(陷阱标志位)。这种反调试手段属于异常的范畴,通过设置 eflags 寄存器的值来触发某个异常,当存在调试器时这个异常由调试器接管(不走我们 的异常处理回调函数),但调试器也可以选择不接管这个异常,所以这属于一种低级的反调试手段 ????。代码(以单步异常为例)// Test_Console_1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>#include <Windows.h>

2020-07-13 11:22:57 947 1

原创 反调试 - int 2dh , int 3h

原理第 0x2d(45) 号中断处理函数是 KiDebugService,执行Int 2dh指令时,进程如果没有处于被调试状态,将会抛出异常,如果在被调试状态则能够正常执行。我们可以利用这一点检测调试器的存在。如果有调试器,调试器就会接管这个 int 2dh 产生的异常从而不走我们设置的异常回调处理函数,当然如果调试器选择不接管这个异常我们是无法检测出调试器的,所以这是一种比较低级的反调试手段。代码int2d_x64.asm:首先创建一个.cpp 文件,改下后缀为 .asm找到这个asm 文件

2020-07-12 23:22:44 1081

原创 反调试 - 硬件断点

原理如果程序设置了硬件断点,则 dr0 - dr7 寄存器的值就会改变,其中 dr0 - dr3存放硬件断点的地址,dr4 - dr5 保留,dr6 存放调试事件的详细信息,dr7 存放断点触发的条件。可以使用 GetThreadContext 获取线程上下文环境,然后读取当前的 dr0 - dr3 有没有值,有的话就说明调试器设置了硬件断点,说明有调试器。但是缺点就是如果调试器没有设置硬件断点的话就无法检测调试器,所以这种方法一般都和其他反调试计数配合使用。????函数介绍/* 检索线程上

2020-07-12 15:45:04 1226 2

原创 反调试 - SetUnhandledExceptionFilter

原理SetUnhandledExceptionFilter 可以注册一个异常处理函数,当一个异常产生且我们的 try - catch(或 try - expect)没有处理处理这个异常时,异常会转交给 SetUnhandledExceptionFilter ,这是我们的应用程序处理异常的最后机会。我们可以自己触发一个异常,然后不在 try-catch 中处理它,如果存在调试器则调试器就会接管这个异常,那么这个异常就不会走到我们的 SetUnhandledExceptionFilter 注册的异常处理

2020-07-12 14:48:45 5312

原创 x64驱动 关闭&开启 写时保护

背景在内核里想要写入“别人的”内存(一般指 NTOS 等系统模块的内存空间),需要遵守一个规则 : IRQL和内存保护。IRQL称为中断请求级别,从0~31 共32个级别内存保护可以打开和关闭,如果在内存处于保护状态时写入,会导致蓝屏一般来说,要写入“别人的”内核内存,必须关闭内存写保护,并把 IRQL提升到 2 才行(绝大多数候时候 IRQL 都为 0 ,当IRQL=2时,会阻断大部分线程执行,防止执行出错)。内存是否处于写保护的状态记录在 CR0 寄存器上,因此直接修改CR0寄存器的值即可

2020-07-06 18:17:50 1639

原创 x64 驱动 创建 dpc 定时器

初始化KTIMER my_timer;KDPC KiTimerExpireDpc;KTIMER:typedef struct _KTIMER { DISPATCHER_HEADER Header; ULARGE_INTEGER DueTime; LIST_ENTRY TimerListEntry; struct _KDPC *Dpc;#if !defined(KENCODED_TIMER_PROCESSOR) ULONG Processor;#en

2020-07-06 17:51:51 419

原创 反调试 - CloseHanlde,NtClose

原理就是调用 CloseHandle 释放一个无效句柄,如果没有被调试,那么函数返回FALSE,GetLastError = ERROR_INVALID_HANDLE;但如果被调试,那么系统将抛出异常 C0000008H。代码:// Test_Console_1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>#include <Windows.h>using namespace std;typed

2020-07-05 19:16:17 1144

原创 反调试 - WUDFPlatform.dll 导出函数

在 C:\Windows\System32 目录下有一个 WUDFPlatform.dll , 这个 dll 中有三个导出函数 —— WudfIsAnyDebuggerPresent,WudfIsKernelDebuggerPresent,WudfIsUserDebuggerPresent:代码示例:// Test_Console_1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>#include <Windo

2020-07-05 17:42:45 668

原创 反调试 - HeapFlags,HeapForceFlags

peb 中有一个成员 ProcessHeap,这个成员是一个 指针:进程 peb 地址可以用以下代码拿到:(拿 ProcessHeap 就再加上 ProcessHeap 在 _PEB 中的偏移)// x64ULONG64 ul_peb64 = __readgsqword(0x60);// x86ULONG64 ul_peb86 = __readgsqword(0x30);对于 x64 系统,vista 以上版本的 HeapFlags 位于 *ProcessHeap+ 0x70,剩余低

2020-07-04 18:50:29 811

原创 反调试 - CheckRemoteDebuggerPresent

和 IsDebuggerPresent 差不多简单的反调试技术 ????BOOL bIsDbgPresent = FALSE;if(CheckRemoteDebuggerPresent(GetCurrentProcess(), &bIsDbgPresent) != 0){ if(bIsDbgPresent == TRUE){ cout << "发现调试器" << endl; } else{ cout << "没有调试器" << end

2020-07-04 17:47:00 606

原创 反调试 - IsDebuggerPresent

目前这个是我知道的最简单的反调试方法了 ????if(IsDebuggerPresent() == 0){ cout << "没有调试器" << endl;}else{ cout << "发现调试器" << endl;}

2020-07-04 17:29:13 405

原创 [反调试 r0] —— KdDebuggerEnabled

理论基础无论是在 32 位系统内存分布,还是在 64 位系统内存分布中,我们知道高地址空间分配给系统内核使用,低地址空间分配给用户进程使用。事实上,用户空间和内核空间其实有一块共享区域(KUSER_SHARED_DATA),大小为 4 KB。它们的内存地址虽然不一样,但是它们都是有同一块物理内存映射出来的,KdDebuggerEnabled 就在存放这一块内存里。对于 32 位系统和 64 位系统来说,这块共享区域对应的内核地址范围以及对应用户空间的地址范围如下表所示:????内核起始地

2020-07-03 09:16:14 1907 5

原创 x64驱动 遍历驱动模块

_LDR_DATA_TABLE_ENTRY(未导出)以下是win10 1803(x64) 上的 _LDR_DATA_TABLE_ENTRY:lkd> dt _LDR_DATA_TABLE_ENTRY nt!_LDR_DATA_TABLE_ENTRY +0x000 InLoadOrderLinks : _LIST_ENTRY // 指向下一个 _LDR_DATA_TABLE_ENTRY 的 InLoadOrderLinks 成员 +0x010 InMemoryOrderL

2020-07-02 10:34:20 2187

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除