自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(248)
  • 收藏
  • 关注

原创 KTHREAD 结构体属性介绍

typedef struct _KTHREAD { // // The dispatcher header and mutant listhead are fairly infrequently // referenced. // DISPATCHER_HEADER Header; // KTHREAD 是可等待对象,线程结束时有信号 // 此链表存储了属于该线程的所有 mutant(对应3环的 mutex) // 一旦该线程获得了 mu

2021-03-10 11:30:05 1708

原创 EPROCESS 结构体属性介绍

typedef struct _EPROCESS { // KPROCESS 和 EPROCESS 地址相同 KPROCESS Pcb; // // Lock used to protect: // The list of threads in the process. // Process token. // Win32 process field. // Process and thread affinity setting. /

2021-03-10 11:29:58 1958

原创 ETHREAD 结构体属性介绍

typedef struct _ETHREAD { KTHREAD Tcb; // 线程创建时间 LARGE_INTEGER CreateTime; union { // 线程退出时间 LARGE_INTEGER ExitTime; // 用于跨进程通信 LIST_ENTRY LpcReplyChain; // 带键事件等待链表 LIST

2021-03-10 11:29:51 1432

原创 vs2019 编译 WRK 踩坑记录

一、回顾上一篇博客介绍了命令行编译 WRK 到调试的所有步骤,理论上我们已经可以开始学习了。但是 IDE 可以方便的查找和修改函数,好处多多,所以这篇博客介绍如何使用 visual studio 编译 WRK。这篇博客会沿用上一篇博客的部分配置,建议读者先跟着上一篇博客配置一下。二、Windows-Research-Kernel-WRK-https://github.com/HighSchoolSoftwareClub/Windows-Research-Kernel-WRK-里面有详细的用法介绍

2021-03-10 11:29:15 1590

原创 进程线程创建过程

一、进程创建过程所有进程都通过 PspCreateProcess 函数创建,包括 System 进程。它被三个函数调用,分别是NtCreateProcessEx、PsCreateSystemProcess 和 PspInitPhase0 。NtCreateProcessEx 是 CreateProcess 的内核服务;PspInitPhase0 函数是系统初始化早期调用的,它创建了 System 进程,System 进程的句柄保存在全局变量 PspInitialSystemProcessHandle

2021-03-10 10:26:23 1775

原创 几种常见的反调试方法

#include <Windows.h>#include <stdio.h>BOOL IsDebug1(){ return IsDebuggerPresent();}BOOL IsDebug2(){ HANDLE hProcess = GetCurrentProcess(); BOOL bDebug; if (0 == CheckRemoteDebuggerPresent(hProcess, &bDebug)) { return TRUE; }

2021-03-08 09:37:56 1349

原创 使用SEH实现跳转

这是一个很粗糙的demo,它的功能是添加了一个异常处理函数到SEH链表的头部。然后触发一个除零异常,跳转到我们指定的函数中执行。没有仔细研究SEH的工作原理,只是知道了有这么一种跳转方式而已,详细的内容请看《加密与解密4》第八章内容。// SEH.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <Windows.h>void fool(){ Mess

2021-03-06 20:25:38 345 3

原创 花指令——多个指令共用字节

一、原理一个字节属于两条指令。短跳转的指令机器码是 EB XX,XX是指跳转位置到JMP指令的下一条指令的偏移,例如 EB 00 就是跳转到JMP 的下一条指令,相当于啥也不做,如图:那么如果是 EB FF ,就会跳转到JMP指令本身的第二字节:对于这个特性,稍加利用,可以编写出这样的代码:跳转执行后,跳到JMP第二字节,FF C0 被识别成 INC EAX,48 被识别成 DEC EAX,执行后反汇编的结果如下:这就是无效汇编指令的原理,EB FF C0 48 这段硬编码可以添加到程序

2021-03-06 16:25:29 485

原创 CreateProcess 重定向CMD实现反弹shell

这段代码比我还老了,哈哈~功能很简单,就是一直尝试向某个ip:port反弹shell,C2用nc就能接收这个反弹shell。// RedirectCmd.cpp : Defines the entry point for the console application.// 还原《恶意代码分析实战》第九章练习样本2#include "stdafx.h"#include <WinSock2.h>#include <Windows.h>#pragma comment(l

2021-03-01 23:53:53 409 1

原创 timestomping 修改文件时间戳

Attribute Changer 是一款免费的修改文件时间戳的工具,使用简单,不多介绍。下面给出代码修改的方法:#include <Windows.h>// 修改文件2的时间戳使其和文件1一样void Timestomping(LPCSTR lpszFile1, LPCSTR lpszFile2){ HANDLE hFile1 = CreateFileA(lpszFile1,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_A

2021-03-01 14:43:45 418 1

原创 CreateService / SC 创建自启动服务

下面的代码创建了一个服务,然后把自己复制到C盘下,通过服务实现开机自启动。如果要卸载这个服务,只需执行一下命令:sc delete AutoStartServiceDemo// AutoStartServiceDemo.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <windows.h>char lpszServiceName[MAX_PATH]

2021-03-01 12:05:22 3982

原创 repne scasb + rep movsd + rep movsb 内联实现 strcat

我在前面写了两篇博客分别介绍内联实现 strlen 和 strcpy,这次介绍的 strcat 其实是 strlen + strcpy ,没什么新东西。.text:0040265A lea edi, [ebp+lpszExeName].text:00402660 lea edx, [ebp+Src].text:00402666 or ecx, 0FFFFFFFFh.text:0

2021-02-28 23:14:29 223

原创 rep movsd + rep movsb 内联实现 strcpy

下面的代码片段是一个内联的 strcpy ,not ecx 为止是计算源字符串的长度(含NULL),00402646 到 00402651 是以4字节为单位复制,最后3行是把剩下的0-3字节复制过去。.text:00402632 mov edi, offset aSystemrootSyst ; "%SYSTEMROOT%\\system32\\".text:00402637 lea edx, [ebp+Src].tex

2021-02-28 21:09:52 319

原创 repne scasb 内联实现 strlen

逆向时如果见到这种代码,记住这是 strlen:0040251B |. 33C0 xor eax,eax ; search NULL0040251D |. F2:AE repne scas byte ptr es:[edi] ; search...0040251F |. F7D1 not ecx

2021-02-28 15:39:28 222

原创 “/c del %s >> NUL“ 删除自身demo

#include <Windows.h>int _tmain(int argc, _TCHAR* argv[]){ char szFile[MAX_PATH] = {0}; char param[0x1000] = {0}; GetModuleFileNameA(NULL,szFile,MAX_PATH); GetShortPathNameA(szFile,szFile,MAX_PATH); sprintf(param,"/c del %s >> NUL", szF

2021-02-28 15:00:35 292 1

原创 CreateFileMapping 内存映射读写文件

传统的文件读写ReadFile WriteFile 是以流的方式读写;可以通过下面的API组合,将文件映射到内存中进行读写,这样比流的方式处理起来更方便。读文件HANDLE hFile = CreateFileA("C:\\Users\\Administrator\\Desktop\\aa.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,0);HANDLE hMap = CreateFileMappingA(hFile,NULL,PAGE_

2021-02-25 09:55:58 1511

原创 逆向分析使用COM组件对象模型的代码

《恶意代码分析实战》第七章实验7-2的程序使用了COM进行联网通信。首先把书上第七章关于COM介绍的原文贴出来:总结一下,就是说恶意程序有时会通过另一个服务程序提供的接口函数实现一些操作,书上给的例子就是调用IE浏览器的 IWebBrowser2 接口的 IWebBrowser2Vtbl.Navigate 函数实现访问WEB地址。逆向分析实验7-2,我们会看到如下代码(已注释):HRESULT CoCreateInstance( REFCLSID rclsid, LPUNKNOWN

2021-02-24 10:06:43 652

原创 reflective dll injection 反射注入

一、reflective dll injection 反射注入介绍网上对反射注入的定义是只通过内存把DLL注入到特定进程中,也就是说整个过程都不涉及文件操作。优点规避杀软基于文件系统的检测不会在进程的DLL链表里留下记录通过特殊处理,可以使用正常的方式编写DLL,实现shellcode的效果缺点DLL体积较大,相比于shellcode注入,更容易被检测二、修改dos头,填入精心构造的 bootstrap shellcodemetasploit 实现的bootstrap

2021-02-20 13:55:04 1427

原创 apatedns unhandled exception

运行 apatedns 会提示安装 .NET ,它会自动下载最新版,NO!我们要下载 2.0 的,不然会闪退。

2021-02-04 14:02:06 436

原创 Win10 EPROCESS 断链

介绍参考了 https://github.com/landhb/HideProcess/动态获取 ActiveProcessLinksOffset ,可兼容不同版本的win10 x64系统。运行结果隐藏加载器自身隐藏成功驱动加载#include <windows.h> #include <winsvc.h> #include <conio.h> #include <stdio.h>#include <winioctl.h&

2021-01-29 10:51:54 1133

原创 Win10 KMD驱动模板,应用层向内核传一个字符串,内核把它转成大写

说明没什么特别的,只是用来测试在WIN10上写驱动,包含最基本的通信代码。又水了一篇博客,哈哈哈。注意驱动路径发生改变时,不要忘了修改注册表的值。https://blog.csdn.net/Kwansy/article/details/113182501驱动#include <ntddk.h>#define DEVICE_NAME L"\\device\\ntdrv"#define LINK_NAME L"\\dosdevices\\ntdrv"#define IOCTRL

2021-01-26 16:21:54 381

原创 StartService返回2的解决方法

出现这种情况一般是因为驱动路径发生改变了,注册表中存储了旧路径,因此找不到驱动。解决方法是删除注册表中这个位置下这个驱动的项:HKLM\SYSTEM\CurrentControlSet\Service\驱动都会在这里创建一个键,把对应的那个驱动的键删掉,重启机器即可。...

2021-01-26 16:06:06 2877

原创 通过windows启动流程分析rootkit的潜在位置

通过学习windows启动流程,我们可以了解该过程中系统启动了什么服务,加载了什么驱动,运行了什么程序,这对学习rootkit有参考意义。下图是windows从引导开始,到windows子系统启动完成的整个流程:我将跟随书本的顺序,将一些我认为可以藏rootkit的位置加粗表示出来。固件启动书上介绍了两种固件启动方式,分别是BIOS和EFI。BIOS固件启动机器启动时进行加电自检(Power-on Self-test, POST),POST的工作有确定板载内存大小,对内存进行循环检测,枚举主板

2021-01-22 16:47:12 594 2

原创 /GS 编译选项,_security_cookie,软件强制DEP

如果启用了 /GS 编译选项,那么编译器会在可能出现缓冲区溢出的地方插入 cookie 校验代码,检查是否存在溢出。原理是在缓冲区末尾,高地址处存储一个校验值,如果发生溢出,那么这个校验值会被覆盖,函数返回时检查这个值,如果被覆盖了,就代表出现溢出。...

2021-01-21 15:47:55 331

原创 双机调试在线下载符号文件

一、设置调试串口设置调试串口2,管理员身份打开cmd,执行下列指令:bcdedit /dbgsettings serial baudrate:115200 debugport:2bcdedit /copy {current} /d Win7X64DebugBlaBlaBla// ID is generated by order above...bcdedit /displayorder {current} {ID}// ID is generated by order above...b

2021-01-21 14:13:28 912

原创 使数据区“可执行”的几种常规办法

一、VirtualProtect这个函数可以修改缓冲区的页面属性,传入 PAGE_EXECUTE_READWRITE 让缓冲区可执行。BOOL VirtualProtect( LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);二、SetProcessDEPPolicy这个函数可以在运行时修改进程的DEP属性。BOOL SetProcessDEPPolicy( DWORD

2021-01-21 11:34:55 803

原创 使用 donut 将 exe 转成 shellcode

donut可以将C语言编写的EXE 转成shellcode,免杀shellcode比免杀exe简单得多。donut 可以在github上下载,下面直接给出命令,将一个32位EXE转成shellcode。.\donut -f .\Sharphound.exe -a1具体参数请看文档。执行该命令会得到一个payload.bin,是二进制shellcode,你可以写一个程序把它转成C语言的数组,在程序中调用就行了。...

2021-01-19 17:13:56 4201 4

原创 自用 x86 GetProcAddress + GetModuleHandle

写项目时自己实现了这两个函数,记录下来以后方便复习。// 从PEB的_PEB_LDR_DATA里获取已加载模块的句柄HMODULE GetLoadedModuleW(LPCWSTR lpModuleName){ typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING, *PUNICODE_STRING; typedef struct _

2021-01-01 21:56:20 670

原创 (8)JMP FAR段间跳转

一、回顾在前面的课程中我们学习了MOV和LES等修改段寄存器的指令,当时老师说过,CS寄存器比较特殊,不能用MOV和"LCS"进行修改,原因是CS和EIP共同决定下一条指令的地址,要修改CS,就必须同时修改EIP,这也是Intel没有提供"LCS"指令的原因。二、JMP FAR 执行流程JMP 0x20:0x004183D7上面是一条 JMP FAR 指令,CPU执行该指令分为以下5步:(1)拆分段选择子0x20 = 00100 0 00RPL = 3TI = 0INDEX = 4(2

2020-09-27 00:06:56 1944

原创 (7)数据段权限检查

一、数据段权限检查DPL是段的权限属性,要想访问一个数据段,段选择子和CPU当前权限必须高于DPL。要注意,权限数值越低,权限越高,比如我们常说的0环,就是权限最高的。RPL:段选择子的权限DPL:段的权限CPL:CPU权限综上所述,数据段权限检查遵循以下规则:CPL <= DPL 并且 RPL <= DPL (数值上的比较)只有满足上述条件,才能成功访问数据段。总结:CPL CPU当前的权限级别DPL 如果你想访问我,你应该具备什么样的权限RPL 用什么权限去访问

2020-09-25 00:07:45 859 2

原创 (6)段描述符D/B位

这节的内容不太重要,记录下来,证明自己学过,以后遇见了不慌。D/B位对不同的段寄存器影响也不同,所以分别讨论。对DS,ES等数据段:D=1,段上限为4GBD=0,段上限为64KB对SS段:D=1,使用32位堆栈指针寄存器;D=0,使用16位堆栈指针寄存器.对CS段:D=1,采用32位寻址方式;D=0,采用16位寻址方式。...

2020-09-24 20:31:33 772

原创 (5)段描述符S位,TYPE域

一、段描述符S位S=1,表示代码段/数据段;S=0,表示系统段。二、段描述符TYPE域TYPE域共4位,可以通过查表来确定其含义。TYPE域高位为0时,表示数据段;高位为1时,表示代码段。数据段E=0,表示向上扩展,windows只使用向上扩展;E=1,表示向下扩展。以上图为例,使用向上扩展,段的范围就是红色部分;使用向下扩展,段的范围就是绿色部分。A=0,表示段未被访问;A=1,表示段曾被访问。代码段C=0,表示非一致代码段;C=1,表示一致代码段。R=0,表示不可读;R=1,

2020-09-24 18:29:17 1168

原创 (4)段描述符P,G位

一、回顾在前面的课程学习中我们了解到,段寄存器有96位,其中80位不可见,包括Base,limit,attribute。16位可见,即段选择子selector。对段寄存器进行写入时,CPU根据段选择子到GDT表中寻找段描述符,段描述符共8字节,64位,CPU根据段描述符填充段寄存器。那么问题就是,如何用64位的段描述符来填充80位的段寄存器呢?为了解决该问题,我们需要学习段描述符的P,G位。段描述符结构段寄存器结构二、P位这个位比较简单,当P=1时,段描述符有效;当P=0时,段描述符无效。

2020-09-24 09:58:59 1103

原创 (3)段描述符,段选择子,LES指令

一、段描述符GDT表里面存的东西叫段描述符,一个段描述符占8字节,结构如下暂时不需要知道各个位的作用,先练习一下拆分,在windbg中输入以下命令,打印GDT表。这里我们打印了GDT表的前5个段描述符。以第2个为例,演示拆分。00cf9b00 0000ffff0000 0000 1100 1111 1001 1011 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111Base 31:24: 00000000G: 1D/B: 10: 0AV

2020-09-23 20:32:10 2088

原创 (2)双机调试+符号文件

用到的ISO和离线符号链接:https://pan.baidu.com/s/1vUnnbboPDSthL1l1lQb9CA提取码:kk60系统是windows xp sp3,虚拟机设置单核。自行下载安装离线符号文件在物理机安装。符号变量 (粘贴到windbg的File->symbol file path下,然后点击reload)C:/WINDOWS/Symbols/acm;C:/WINDOWS/Symbols/cnv;C:/WINDOWS/Symbols/com;C:/WINDOWS/Sy

2020-09-23 14:38:56 1250 5

原创 (1)段寄存器属性探测

段寄存器由4部分,共96位组成,其中段选择子(Selector)是可见的,占16位;另外3部分占80位,不可见。下面通过程序论证不可见部分的存在。详细说明见代码注释。#include <stdafx.h>int var = 0;int main(){ // 段寄存器由4部分共96位组成,分别是 // Selector(段选择子):16位,是唯一可见的部分,实际上就是GDT表的下标 // Attribute:16位,不可见,控制段的读写执行属性 // Base:32位,.

2020-09-22 18:28:26 1677

原创 暴力关闭Windows defender

将C盘和D盘加入白名单。

2020-09-20 17:02:34 301

原创 IDA __OFSUB__ 测试

IDA 反汇编插件有时会生成 OFSUB 这个宏,它的作用是测试两个数相减是否溢出,返回溢出标志位。// ofsub.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>using namespace std;typedef char int8;typedef signed char sint8;typedef unsigned char uint8;typedef

2020-09-20 11:22:30 1182

原创 SEH反调试(SetUnhandledExceptionFilter)

// SEH反调试.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <windows.h>#include <stdio.h>DWORD g_bIsDebug = 0x1;// 非调试模式下会运行这里的代码LONG WINAPI ExceptionFilter(PEXCEPTION_POINTERS pExcept){ g_bIsDebug = 0x0; // 跳过异常指令 mov dword ptr[

2020-09-18 23:44:34 646

原创 GIVE_A_TRY.exe 逆向(NCK逆向初级第9,10,11课作业)

这个程序好像是一道CTF的题,对我这样的新手来说难度很大,解题过程中遇到了不少坑,还学到了新的反调试技巧。下面我将记录下我逆向这个程序的过程。一、去花指令,过反调试,分析TLS回调函数功能这个程序用到了TLS反调试技术,很遗憾,我用的编程达人OD和X64DBG都有反反调试插件,直接把TLS过了,所以我刚开始甚至没意识到反调试的存在。然而,如果您使用无插件的OD,那么您运行该程序可能会崩溃,又或者即使输入了正确密钥,程序也会提示密钥错误,这是因为,程序会检测当前是否正在被调试,然后会根据这个判断结果修

2020-09-16 00:13:11 1274 11

空空如也

空空如也

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

TA关注的人

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