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
被调试进程不能被其他进程调试
调试器操作被调试者的代码
调试器处理被调试进程中发生的异常
clbp
ollydgb的条件记录断点
ctrl+G 将光标移到4011f0地址后,按shift+f4,打开设置CLBP对话框(条件断点)
detach 分离
EB FE 无限循环
DebugActiveProcessStop()
将被调试者从调试器中分离出来