针对加载*ser32.dll下断点:
bu ntdll!LdrLoadDll "r $t0=poi(poi(esp+c)+4);as /mu ${/v:dllname} @$t0;.block{.if($spat(\"${dllname}\",\"*ser32.dll\")){kbn}; .else{ad ${/v:dllname};g}}"
------------------------------------------------
命令: as
功能: 定义别名
/ma 参数指定的内存地址当做ASCII字符串。
/mu 参数指定的内存地址当做Unicode字符串。
/msa 参数指定的内存地址当做ANSI_STRING字符串。
/msu 参数指定的内存地址当做UNICODE_STRING字符串。
/f 别名等于参数指定文件的内容。
/e 别名等于参数指定的环境变量。
------------------------------------------------
命令: ${} (说明:准确说不是命令,是Command Tokens类似.if之类)
功能: ${}是别名解释器,可以使用windbg帮助手册查看详细信息
Text ${Alias} Text
Text ${/d:Alias} Text
Text ${/f:Alias} Text
Text ${/n:Alias} Text
Text ${/v:Alias} Text
/v: 保持别名原样,不翻译,在定义和删除的时候用。
/n: 如果别名定义就翻译为内容,否则不做任何翻译。
/f: 如果别名定义就翻译为内容,否则翻译为空。
/d: 如果别名被定义,翻译为1,否则翻译为0,相当于#ifdef。
-----------------------------------------------
命令: 20个伪寄存器
User-Defined Pseudo-Registers
There are 20 user-defined pseudo-registers ($t0, $t1, ..., $t19). These pseudo-register are variables that you can read and write through the debugger. You can store any integer value in these pseudo-registers. They can be especially useful as loop variables.
To write to one of these pseudo-registers, use the r (Registers) command, as the following example shows.
0:000> r $t0 = 7
0:000> r $t1 = 128*poi(MyVar)