随笔分类 -  《灰帽黑客:攻守道》

上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 14 下一页
摘要:XEDParse 是一款开源的x86指令编码库,该库用于将MASM语法的汇编指令级转换为对等的机器码,并以XED格式输出,目前该库支持x86、x64平台下的汇编编码,XEDParse的特点是高效、准确、易于使用,它可以良好地处理各种类型的指令,从而更容易地确定一段程序的指令集。XEDParse库可以集成到许多不同的应用程序和工具中,因此被广泛应用于反汇编、逆向工程、漏洞分析和入侵检测等领域。XEDParse 引擎非常易于使用,读者在使用时只需要通过`XEDPARSE xed = { 0 };`定义一个结构,并通过向`xed.cip`内输送一条汇编指令,当调用`XEDParseAssemble(&xed)`函数时则可实现对特定汇编指令的编码操作,读者只需要通过输出`xed.dest`以及`xed.instr`中的值,则可实现对特定一条汇编指令的编码 阅读全文
posted @ 2023-10-06 10:12 lyshark 阅读(518) 评论(1) 推荐(1) 编辑
摘要:Capstone 是一款开源的反汇编框架,目前该引擎支持的CPU架构包括x86、x64、ARM、MIPS、POWERPC、SPARC等,Capstone 的特点是快速、轻量级、易于使用,它可以良好地处理各种类型的指令,支持将指令转换成AT&T汇编语法或Intel汇编语法等多种格式。Capstone的库可以集成到许多不同的应用程序和工具中,因此被广泛应用于反汇编、逆向工程、漏洞分析和入侵检测等领域,著名的比如IDA Pro、Ghidra、Hopper Disassembler等调试器都在使用该引擎。 阅读全文
posted @ 2023-10-06 10:10 lyshark 阅读(2384) 评论(1) 推荐(7) 编辑
摘要:我们继续延申调试事件的话题,实现进程转存功能,进程转储功能是指通过调试API使获得了目标进程控制权的进程,将目标进程的内存中的数据完整地转存到本地磁盘上,对于加壳软件,通常会通过加密、压缩等手段来保护其代码和数据,使其不易被分析。在这种情况下,通过进程转储功能,可以将加壳程序的内存镜像完整地保存到本地,以便进行后续的分析。在实现进程转储功能时,主要使用调试API和内存读写函数。具体实现方法包括:以调试方式启动目标进程,将其暂停在运行前的位置;让目标进程进入运行状态;使用ReadProcessMemory函数读取目标进程内存,并将结果保存到缓冲区;将缓冲区中的数据写入文件;关闭目标进程的调试状态。 阅读全文
posted @ 2023-10-05 10:28 lyshark 阅读(659) 评论(0) 推荐(4) 编辑
摘要:理解了如何通过调试事件输出当前进程中寄存器信息,那么实现加载DLL模块也会变得很容易实现,加载DLL模块主要使用`LOAD_DLL_DEBUG_EVENT`这个通知事件,该事件可检测进程加载的模块信息,一旦有新模块被加载或装入那么则会触发一个通知事件,利用该方法并配合磁盘路径获取函数则可很容易的实现进程模块加载的监控。 阅读全文
posted @ 2023-10-05 10:25 lyshark 阅读(446) 评论(0) 推荐(0) 编辑
摘要:当读者需要获取到特定进程内的寄存器信息时,则需要在上述代码中进行完善,首先需要编写`CREATE_PROCESS_DEBUG_EVENT`事件,程序被首次加载进入内存时会被触发此事件,在该事件内首先我们通过`lpStartAddress`属性获取到当前程序的入口地址,并通过`SuspendThread`暂停程序的运行,当被暂停后则我没就可以通过`ReadProcessMemory`读取当前位置的一个字节机器码,目的是保存以便于后期的恢复,接着通过`WriteProcessMemory`向对端`(void*)dwAddr`地址写出一个`0xCC`断点,该断点则是`int3`停机指令,最后`ResumeThread`恢复这个线程的运行,此时程序中因存在断点,则会触发一个`EXCEPTION_DEBUG_EVENT`异常事件。 阅读全文
posted @ 2023-10-04 08:33 lyshark 阅读(659) 评论(0) 推荐(1) 编辑
摘要:本章笔者将通过`Windows`平台下自带的调试API接口实现对特定进程的动态转存功能,首先简单介绍一下关于调试事件的相关信息,调试事件的建立需要依赖于`DEBUG_EVENT`这个特有的数据结构,该结构用于向调试器报告调试事件。当一个程序发生异常事件或者被调试器附加时,就会产生对应的`DEBUG_EVENT`调试事件,通常`DEBUG_EVENT`包含了多种调试类型,包括异常事件、进程创建事件、线程创建事件、进程退出事件和线程退出事件等等,我们只需要动态捕捉这些调试事件并作相应的处理即可实现更多有用的功能。 阅读全文
posted @ 2023-10-03 18:29 lyshark 阅读(720) 评论(0) 推荐(0) 编辑
摘要:Windows 线程同步是指多个线程一同访问共享资源时,为了避免资源的并发访问导致数据的不一致或程序崩溃等问题,需要对线程的访问进行协同和控制,以保证程序的正确性和稳定性。Windows提供了多种线程同步机制,以适应不同的并发编程场景。以上同步机制各有优缺点和适用场景,开发者应根据具体应用场景进行选择和使用。在线程同步的实现过程中,需要注意竞争条件和死锁的处理,以确保程序中的线程能协同工作,共享资源能够正确访问和修改。线程同步是并发编程中的重要基础,对于开发高效、稳定的并发应用至关重要。 阅读全文
posted @ 2023-10-02 09:28 lyshark 阅读(720) 评论(0) 推荐(2) 编辑
摘要:在Windows平台下创建多线程有两种方式,读者可以使用`CreateThread`函数,或者使用`beginthreadex`函数均可,两者虽然都可以用于创建多线程环境,但还是存在一些差异的,首先`CreateThread`函数它是`Win32 API`的一部分,而`_beginthreadex`是`C/C++`运行库的一部分,在参数返回值类型方面,`CreateThread`返回线程句柄,而`_beginthreadex`返回线程ID,当然这两者在使用上并没有太大的差异,但为了代码更加通用笔者推荐使用后者,因为后者与平台无关性更容易实现跨平台需求。 阅读全文
posted @ 2023-10-01 09:51 lyshark 阅读(841) 评论(1) 推荐(1) 编辑
摘要:TLS(Thread Local Storage)用来在进程内部每个线程中存储私有的数据。每个线程都会拥有独立的`TLS`存储空间,可以在`TLS`存储空间中保存线程的上下文信息、变量、函数指针等。TLS其目的是为了解决多线程变量同步问题,声明为TLS变量后,当线程去访问全局变量时,会将这个变量拷贝到自己线程中的TLS空间中,以防止同一时刻内多次修改全局变量导致变量不稳定的情况,先来看一段简单的案例 阅读全文
posted @ 2023-09-27 09:27 lyshark 阅读(416) 评论(0) 推荐(0) 编辑
摘要:RDTSC时钟检测同样可实现反调试检测,使用时钟检测方法是利用`rdtsc`汇编指令,它返回至系统重新启动以来的时钟数,并且将其作为一个64位的值存入`EDX:EAX`寄存器中,通过运行两次`rdstc`指令,然后计算出他们之间的差值,即可判定对方是否在调试我们的程序。 阅读全文
posted @ 2023-09-27 09:19 lyshark 阅读(537) 评论(0) 推荐(0) 编辑
摘要:通常可以通过在程序中设置异常处理函数,并在其中发起一个异常,然后判断程序是否已经被调试器附加来实现反调试。如果异常处理函数没有被触发,则说明程序已经被调试器附加;如果异常处理函数被触发,则说明程序没有被调试器附加。安装异常处理函数并手动触发,此时如果被调试器附加,则会不走异常处理流程,此时`IsDebug`将会返回默认的`False`,并直接走`_asm call pBuff;`在调试器不忽略`int3`中断的情况下,调试将会被终止。 阅读全文
posted @ 2023-09-27 09:18 lyshark 阅读(400) 评论(0) 推荐(0) 编辑
摘要:首先这是一种比较奇特的反调试思路,通过检测自身父进程来判定是否被调试,原理非常简单,我们的系统在运行程序的时候,绝大多数应用程序都是由`Explorer.exe`这个父进程派生而来的子进程,也就是说如果没有被调试其得到的父进程就是`Explorer.exe`的进程PID,而如果被调试则该进程的父进程PID就会变成调试器的PID值,通过对父进程的检测即可实现检测是否被调试的功能。 阅读全文
posted @ 2023-09-27 09:18 lyshark 阅读(507) 评论(0) 推荐(0) 编辑
摘要:STARTUPINFO 结构体,可以用来指定新进程的主窗口外观风格、背景颜色、标题等信息,也可以用来实现反调试技术。通常情况下,我们可以将`STARTUPINFO`结构体中的`dwFlags`成员设置为`STARTF_DEBUGONLYTHISPROCESS`,以防止调试器附加到当前进程。设置了`STARTF_DEBUGONLYTHISPROCESS`后,如果尝试通过调试器附加到该进程,则调试器将直接失败并退出。 阅读全文
posted @ 2023-09-27 09:17 lyshark 阅读(423) 评论(0) 推荐(0) 编辑
摘要:CheckRemoteDebuggerPresent 也是一个微软提供的反调试函数,该函数可以在本地或者远程进程中使用。函数接收两个参数进程句柄和一个指向布尔值的指针。如果指定的进程正在被调试,则函数会把指向布尔值的指针设为 TRUE,否则设为FALSE。 阅读全文
posted @ 2023-09-27 09:17 lyshark 阅读(462) 评论(0) 推荐(0) 编辑
摘要:ProcessHeap 是`Windows`进程的默认堆,每个进程都有一个默认的堆,用于在进程地址空间中分配内存空间。默认情况下`ProcessHeap`由内核进行初始化,该堆中存在一个未公开的属性,它被设置为加载器为进程分配的第一个堆的位置(进程堆标志),`ProcessHeap`标志位于`PEB`结构中偏移为`0x18`处,第一个堆头部有一个属性字段,这个属性叫做`ForceFlags`属性偏移为`0x44`,该属性为0说明程序没有被调试,非0说明被调试,另外的`Flags`属性为2说明被调试,不为2则说明没有被调试。 阅读全文
posted @ 2023-09-26 12:20 lyshark 阅读(496) 评论(0) 推荐(0) 编辑
摘要:NtGlobalFlag 是一个`Windows`内核全局标记,在`Windows`调试方案中经常用到。这个标记定义了一组系统的调试参数,包括启用或禁用调试技术的开关、造成崩溃的错误代码和处理方式等等。通过改变这个标记,可以在运行时设置和禁用不同的调试技术和错误处理方式,比如调试器只能访问当前进程、只允许用户模式调试、启用特定的错误处理方式等等。但由于`NtGlobalFlag`标记是内核全局标记,其改变会影响整个系统的行为,需要谨慎处理。利用该标记反调试,首先定位`dt -rv ntdll!_TEB`找到`TEB`结构并通过`TEB`找到`PEB`结构,然后找到`+0x068 NtGlobalFlag`,这个位置的`NtGlobalFlag`类似于`BeingDebugged`,如果是调试状态`NtGlobalFlag`的值会是`0x70`,所以可以判断这个标志是否为`0x70`来判断程序是否被调试了,首先我们来使用汇编代码解决。 阅读全文
posted @ 2023-09-26 12:19 lyshark 阅读(509) 评论(0) 推荐(0) 编辑
摘要:BeingDebugged 是`Windows`系统`PEB`结构体中的一个成员,它是一个标志位,用于标识当前进程是否正在被调试。BeingDebugged的值为0表示当前进程未被调试,值为1表示当前进程正在被调试。由于`BeingDebugged`是在`PEB`结构体中存储的,因此可以通过访问`PEB`结构体来获取`BeingDebugged`的值。恶意软件可以使用`BeingDebugged`来判断自己是否正在被调试,以此来防止被反病毒工程师或调试程序进行分析。反病毒工程师们也可以通过检查`BeingDebugged`的值来判断程序是否正被调试从而进行恶意软件的检测和分析。 阅读全文
posted @ 2023-09-26 12:14 lyshark 阅读(421) 评论(0) 推荐(0) 编辑
摘要:在开始使用`TEB/PEB`获取进程或线程ID之前,我想有必要解释一下这两个名词,PEB指的是进程环境块`(Process Environment Block)`,用于存储进程状态信息和进程所需的各种数据。每个进程都有一个对应的`PEB`结构体。TEB指的是线程环境块`(Thread Environment Block)`,用于存储线程状态信息和线程所需的各种数据。每个线程同样都有一个对应的`TEB`结构体。PEB中包含了进程的代码、数据段指针、进程的环境变量、进程启动参数信息以及加载的dll信息等。PEB结构体中的`FS段寄存器`通常被设置为`0x30`,指向当前进程的`PEB`结构体。其他进程可以通过访问自己的PEB结构体来获取自己的状态和信息。 阅读全文
posted @ 2023-09-25 08:59 lyshark 阅读(883) 评论(0) 推荐(0) 编辑
摘要:内存进程读写可以让我们访问其他进程的内存空间并读取或修改其中的数据。这种技术通常用于各种调试工具、进程监控工具和反作弊系统等场景。在`Windows`系统中,内存进程读写可以通过一些`API`函数来实现,如`OpenProcess`、`ReadProcessMemory`和`WriteProcessMemory`等。这些函数提供了一种通用的方式来访问其他进程的内存,并且可以用来读取或写入不同类型的数据,例如整数、字节集、浮点数等。 阅读全文
posted @ 2023-09-25 08:59 lyshark 阅读(3104) 评论(1) 推荐(4) 编辑
摘要:挂起与恢复进程是指暂停或恢复进程的工作状态,以达到一定的控制和管理效果。在 Windows 操作系统中,可以使用系统提供的函数实现进程的挂起和恢复,以达到对进程的控制和调度。需要注意,过度使用进程挂起/恢复操作可能会造成系统性能的降低,导致死锁等问题,因此在使用时应该谨慎而慎重。同时,通过和其他进程之间协同工作,也可以通过更加灵活的方式,实现进程的协调、交互等相应的功能,从而实现更加高效和可靠的进程管理。要实现挂起进程,首先我们需要实现挂起线程,因为挂起进程的实现原理是通过调用`SuspendThread`函数循环将进程内的所有线程全部挂起后实现的,而要实现挂起线程则我们需要先确定指定进程内的线程信息,要实现枚举进程内的线程信息则可以通过以下几个步骤实现。 阅读全文
posted @ 2023-09-24 10:14 lyshark 阅读(1330) 评论(0) 推荐(0) 编辑

上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 14 下一页

8980492 | 6920438
博客园 - 开发者的网上家园

点击右上角即可分享
微信分享提示