格蠹汇编读书笔记
格蠹汇编读书笔记
从堆里抢救丢失的博客
查看进程模块:
1 | lm |
罗列进程的线程:
1 | ~ |
罗列堆:
1 | !heap |
列出用户态空间所有区域:
1 | !address |
搜索,-u
表示支持Unicode模式,从地址10000搜索长度80000:
1 | s -u 10000 L80000 "当年在交大" |
转成Unicode模式看数据,长度1000,但长度一般是读到Unicode结尾:
1 | dU 001b5942 L1000 |
观察esp值:
1 | r esp |
确定某个地址是否在堆上以及属性:
1 | !address 0728988a |
如果无法以Unicode模式导出的话,添加两字节的Unicode起始符以正常识别Unicode编码。
1 | eb 001b5942-8 ff fe |
数据保存为文件。
1 | .writemem D:\log.txt 001b5942-8 L1458 |
修复因误杀而瘫痪的系统
运行,当系统启动失败时WInDBG触发“Bugcheck Analysis”,最后一行“Bugcheck”字样后第一个数字为停止码,需要在WinDBG帮助文件中查询,查到“STATUS_SYSTEM_PROCESS_TERMINATED”。后面大括号里第一个数的地址处保存着有关进程信息,查看:
1 | db e1c53ce0 |
一看是WinLogon进程。系统启动时内核创建第一个进程为会话管理器进程SMSS.exe,该进程创建子系统服务进程CSRSS和WinLogon。大括号里第二个数为错误码,查看:
1 | !error c0000034 |
SMSS会在启动时检查“HKLM\SYSTEM\ControlSet001\Control\Session Manager”,找类型为REG_MULTI_SZ的,命令字符串大约为“源文件名\0目标文件名\0”,键值名为“PendingFileRenameOperations”,观察进程列表:
1 | !process 0 0 |
当第一个参数为0时,第二个参数为详细程度,0为简洁7最详细,也可以加上符号名、地址、PID等。
Windows 8引入ELAM来优先加载和初始化杀毒软件的驱动。
徒手战木马
Windows启动过程:
- 用户输入的用户名和密码由WinLogon发给LSASS进行安全认证。
- LSASS认证通过后创建访问令牌对象。
- WinLogon启动HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon的UserInit表键下程序,默认userinit.exe,多个程序用逗号分隔。能成功启动一个就算成功,都启动失败时该账号强制登出。
- UserInit执行登录和初始化脚本,启动Shell键定义的程序,默认Explorer.exe。
侦察广告插件
将WinDBG设为系统默认JIT调试器:
1 | windbg.exe -I |
回溯100条栈:
1 | kn 100 |
观察栈的更多信息:
1 | kPL |
详细了解某个模块如urlmon:
1 | lm vm urlmon |
显示当前函数调用栈,\c
只显示当前帧信息,c
显示寄存器内容:
1 | .frame /c c |
显示当前进程栈帧与参数信息,1
表示当前进程:
1 | kv 1 |
以GUID结构体方式解析地址01f1b434处数据:
1 | dt _GUID 01f1b434 |
再解电源服务溢出崩溃
查看当前进程信息:
1 | !process |
有符号转无符号数:
1 | ?? (unsigned int)(-1073740791) |
执行到下一个函数调用:
1 | pc |
触发错误时,当发现由内核调试时,UnhandledExceptionFilter
调用WerpReportFault
,再调用WerpReportFaultInternal
,再调用SendMessageToWERService
向WER系统服务报告错误。
用!process
查看某个进程的EPROCESS结构地址,再切换过去,需要再次运行才能获得该进程上下文:
1 | .process /i 9382a530 |
第48页读不下去了…