逆向笔记2

来源:互联网 发布:java语言编译器win10 编辑:程序博客网 时间:2024/06/05 15:22
TLS回调函数
首先说一下,TLS回调函数的运行是先于EP代码的,每当创建或终止进程(前后共2次),或者创建进程的主线程时就会自动调用执行的函数,因此使它可以作为一种反调试技术。
TLS是各线程的独立的数据存储空间,因此TLS可在各线程内部独立使用,或修改线程的全局数据或静态数据(?),就像对待自身的局部变量一样。
IMAGE_TLS_DIRECTORY结构体有两种版本,64和32位可用PEView查看,在代码分析中涉及的比较重要的是AddressOfCallback6s,它的值指向含有TLS回调函数地址(VA)的数组。这意味着可以向同一程序注册多个TLS回调函数(数组以NULL值结束)
TLS程序应用
用OD 在event里勾选system breakpoint设置断点 断点地址用PEview查看 2.0以上默认可以在TLS回调函数暂停。


手工添加TLS回调函数
1,确定IMAGE_TLS_DIRECTORY结构体与TLS回调函数放到PE文件的哪个位置。
第一,添加节区末尾的空白区域。
第二,增加最后一个节区的大小。
第三,在最后添加新节区。


介绍第二种方法,用PEview查看程序的最后一个节区(.rsrc)的节区头,比如:Pointer to Raw Data=9000,Size of Raw Data=200则PE中定义的文件的整体体大小为9200,现要添加数据与代码,则将最后一个节区增加200:用HxD打开程序,将光标移到最后位置,菜单选择Edit-Insert bytes 向Bytecount输入200
然后开始编辑PE文件,修改.rcrs设置TLS表:扩展区域的起始地址,TLS回调函数的起始地址放入AddressOfCallbacks,然后编辑TLS回调函数。


TEB
TEB是指线程环境模块,该结构体包含进程中运行线程的各种信息,进程的每一个线程都对应一个TEB结构体。借助WinDbg的内核调试器(kernel Debugger)可查看详细细节。
重要成员:+0x000 NtTib :_NT_TIB//线程信息模块
          .....
          +0x030 ProcessEnviromentBlock :Ptr32 _PEB//进程环境模块的指针,每个进程对应一个PEB结构体
TEB访问方法:用Windbg内核调试器可以访问TEB结勾体,在用户模式下,通过OS的相关API访问。
FS段寄存器:FS:[0x18]=TEB 起始地址
            FS:[0x30]=PEB 起始地址
            FS:[0]=SEH 起始地址
             
PEB
存放进程信息的结构体
PEB访问方法:#1;直接获取PEB地址:MOV EAX,DWORD PTR FS:[30] ;FS[30]=address of PEB
            #2;先获取TEB地址,再通过ProcessEnvironmentBlock成员(+30)获取PEB地址:MOV EAX,DWORD PTR FS:[18] ;FS[30]=address of TEB
           MOV EAX,DWORD PTR DS:[EAX+30] ;DS[EAX+30]=address of PEB
PEB重要成员:
+002 BeingDebugged :UChar//用于判断进程是否处于调试状态(是,则返回1:否,则返回0)检测该值,可用于反调试技术中;若处于调试中,则终止进程
+008 ImagBaseAddress :Ptr32 Void//用来表示进程中的ImageBase
+00c Ldr  :Ptr _PEB_LDR_DATA//指向Ptr _PEB_LDR_DATA结构体的指针,当模块(DLL)加载到进程后,通过PEB。Ldr成员可以直接获取该模块的加载地址。每个加载到进程中的DLL模块都有与之对应的_LDR_DATA_TABLE_ENTRY结构体,这些结构体相互链接,最终形成_LIST_ENTRY双向链表。
+018 ProcessHeap :Ptr32 Void//若进程处于调试状态,则拥有特定值。与 BeingDebugged一样
+068 NtGlobalFlag :Uint4B//若进程处于调试状态,则拥有特定值。与 BeingDebugged一样
SEH
Windows操作系统中默认的异常处理机制。可用于反调试
OS的异常处理方法:
5种代表性的异常
SEH以链的形式存在。第一个异常处理器中若未有处理相关异常,他就会被传递到下一个异常处理器。
SEH的安装就是指将自身的EXCEPTION_REGISTRATION_RECORD结构体链接到EXCEPTION_REGISTRATION_RECORD结构体链表。
SEH的删除
IA-32指令
指(Intel Architecture32位)系列CPU使用的指令
指令前缀-是一个可选项目,后面出现特定操作码时将补充说明其含义。
操作码-Opcode是不可少的部分,用来表示实际的指令.
ModR/M-主要是用来辅助说明操作码的操作数(操作数的个数,种[寄存器,地址,常量]),拥有一个字节(8)位长度,分为3部分
SIB-用来辅助说明Mod/M
位移
立即数




0 0
原创粉丝点击