nice try

<逆向工程-核心原理>终结

看了两三年,终于看完了,nice try 2020-10-27 15:20:20 星期二 :tw-1f4aa:

接下来的是阅读过程中的一些笔记


内核调试

终端中输入 bcdedit -debug on
开启内核调试模式

WINDBG

lkd> u nt!ZwCreateFile L50

查看createfile 代码
u 反汇编 u L10显示10行命令

db命令
d-display


删除ASLR功能

将选择头中的DLL Characteristics中DYNAMIC_BASE标志删除即可


TLS回调函数

长用于反调试
类似于linux ptrace() 函数

每当创建/终止进程的线程时会自动调用执行的函数。创建进程的主线程会先于EP代码,调用回调函数

在选择头中有TLS表地址,里面是tls结构体的地址,可能有多个结构体,address of callbacks成员指向tls函数地址


isDebuggerPersent()

检查peb.deingdebugged值,+02
判断是否处于调试

getmodulehandle()
获取进程imagebase


windbg 配置符号表

srv*https://msdl.microsoft.com/download/symbols
通知 WinDbg 进行符号文件的初始查找和加载:
.reload
Lm 查看已加载模块

dt
displays information about a local variable, global variable or data type

dt _teb
dt _peb
dt _peb_ldr_data


PEB

模块=dll加载后,通过PEB.ldr 直接获取该模块的加载基地址

FS:[0] TEB起始地址

FS:[30] PEB起始地址


利用SEH机制的反调试技术

程序在正常运行和调试运行时表现出的行为动作是不同的
正常:程序自己处理
调试时:抛给调试器处理

通过TEB.NtTib.ExceptionList 找到SEH链

TEB.NtTib.ExceptionList =FS:[0]

结构体 构成链

* next_seh
* handler

esp+c 即指向 pContext
seh函数参数第三个为指向pContext的指针,保存线程寄存器值,执行其他进程就会保存寄存器值。
*pContext+B8 (32位下)为EIP值, 修改EIP,改变执行流程
一样,通过PEB.isdebuggerpersent()API 取得beingDebugged值判断


保护器,压缩器

反调试–一个更简单,更好的方法:判断当前系统是否是为逆向分析专用系统

findWindow() , createTOOLhelp32SnapsHOT()
, GETcomputerName()

OllyDBG view-seh chain

PEB.ImageBase 保存进程的实际映射地址

debug blocker

  1. 被调试进程不能被其他进程调试

  2. 调试器操作被调试者的代码

  3. 调试器处理被调试进程中发生的异常

clbp

ollydgb的条件记录断点
ctrl+G 将光标移到4011f0地址后,按shift+f4,打开设置CLBP对话框(条件断点)

detach 分离

EB FE 无限循环

DebugActiveProcessStop()
将被调试者从调试器中分离出来