反汇编中遇到的一些特殊的指令

1、CDQ

 CDQ 把原来的 EAX 扩展成 EDX:EAX (带正负值), 这个指令把 EAX 的第 31 bit 复制到 EDX 的每一个 bit 上。例如:

        假设 EAX 是 FFFFFFFB (-5) ,它的第 31 bit (最左边) 是 1, 执行 CDQ 后, CDQ 把第 31 bit 复制至 EDX 所有 bit

        EDX 变成 FFFFFFFF

        这时候, EDX:EAX 变成  FFFFFFFF FFFFFFFB ,它是一个 64 bit 的大型数字,数值依旧是 -5

2、关于FS

如果程序处于调试器中,那么在PEB结构中有个beingDegug标志会被设置,直接读取它就可判断是否在调试器中。实际上IsDebuggerPresent就是这么干的。

 /*
 说明:
 TEB(Thread Environment Block,线程环境块)系统在此TEB中保存频繁使用的线程相关的数据。位于用户地址空间,在比 PEB 所在地址低的地方。
  进程中的每个线程都有自己的一个TEB。一个进程的所有TEB都以堆栈的方式,存放在从0x7FFDE000开始的线性内存中,每4KB为一个完整的TEB,
  不过该内存区域是向下扩展的。在用户模式下,当前线程的TEB位于独立的4KB段,可通过CPU的FS寄存器来访问该段,一般存储在[FS:0]。在用
  户态下WinDbg中可用命令$thread取得TEB地址。  
  
  PEB(Process Environment Block,进程环境块)存放进程信息,每个进程都有自己的PEB信息。位于用户地址空间。在Win 2000下,进程环境块的
  地址对于每个进程来说是固定的,在0x7FFDF000处,这是用户地址空间,所以程序能够直接访问。准确的PEB地址应从系统的EPROCESS结构的0x1b0偏
  移处获得,但由于EPROCESS在系统地址空间,访问这个结构需要有ring0的权限。还可以通过TEB结构的偏移0x30处获得PEB的位置,FS段寄存器指向
  当前的TEB结构:
  mov eax,fs:[0x30]
  mov PEB,eax
    
    FS寄存器指向当前活动线程的TEB结构(线程结构)
    偏移  说明
    000  指向SEH链指针
    004  线程堆栈顶部
    008  线程堆栈底部
    00C  SubSystemTib
    010  FiberData
    014  ArbitraryUserPointer
    018  FS段寄存器在内存中的镜像地址
    020  进程PID
    024  线程ID
    02C  指向线程局部存储指针
    030  PEB结构地址(进程结构)
    034  上个错误号

 fs:[0]是本线程TEB的头部,那么fs:[18h]呢?继续让windbg告诉我们: 
 0:000> dt -b ntdll!_TEB  
 +0x000 NtTib            : _NT_TIB     
  +0x000 ExceptionList    : Ptr32      
  +0x004 StackBase        : Ptr32      
  +0x008 StackLimit       : Ptr32      
  +0x00c SubSystemTib     : Ptr32      
  +0x010 FiberData        : Ptr32      
  +0x010 Version          : Uint4B     
  +0x014 ArbitraryUserPointer : Ptr32      
  +0x018 Self             : Ptr32   
 +0x01c EnvironmentPointer : Ptr32   
 +0x020 ClientId         : _CLIENT_ID     
  +0x000 UniqueProcess    : Ptr32      
  +0x004 UniqueThread     : Ptr32   
 +0x028 ActiveRpcHandle  : Ptr32   
 +0x02c ThreadLocalStoragePointer : Ptr32   
 +0x030 ProcessEnvironmentBlock : Ptr32   
 +0x034 LastErrorValue   : Uint4B
 下面的省略掉了  
  
 很显然,fs:[18h]是一个指向自身的指针,那么[eax+30h]就是获得PEB的地址,再来看PEB的结构:
 0:000> dt -b ntdll!_PEB  
 +0x000 InheritedAddressSpace : UChar  
 +0x001 ReadImageFileExecOptions : UChar  
 +0x002 BeingDebugged    : UChar  
 +0x003 SpareBool        : UChar  
 +0x004 Mutant           : Ptr32   
 +0x008 ImageBaseAddress : Ptr32   
 +0x00c Ldr              : Ptr32   
 +0x010 ProcessParameters : Ptr32

   对于Ring3的应用程序,fs:[0]的地址指向的是TEB结构,这个结构的开头是一个NT_TIB结构,NT_TIB结构的0x18偏移处是一个Self指针,
 指向这个结构自身,也就是指向TEB结构的开头。 TEB结构的0x30偏移是一个指向PEB的指针。PEB又是一个结构,这个结构的0x2偏移处
 是一个UChar,名叫BeingDebugged,当进程被调试时,此值为1,未被调试时此值为0
 
 因此以下代码逐行执行后的结果:
 mov eax,dword ptr fs:[18h];eax=TEB的指针
 mov eax,dword ptr [eax+30h];eax=PEB的指针
 movzx eax,byte ptr [eax+2h];eax=PEB.BeingDebugged(byte扩展为dword)
 
 TEB和PEB结构的详细内容可以在windbg内核调试状态下使用dt _TEB、dt _PEB命令来察看

 

3、setne cl

if ZF=1 then cl=0
if ZF=0 then cl=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值