windbg-.foreach循环输入(windbg script)

.foreach

.foreach 关键字分析一个或多个命令的输出并将该输出中每一个值作为另一个或多个命令的输入

.foreach [Options( Variable  { InCommands } ) { OutCommands }

.foreach [Options/s ( Variable  "InString) { OutCommands }

.foreach [Options/f ( Variable  "InFile) { OutCommands }

Options
可以是下面选项的任意组合:
/pS InitialSkipNumber
使得开头的一些符号被跳过。InitialSkipNumber 指定不传递给OutCommands 的输出关键字的数量。
/ps SkipNumber
每次执行命令时都会跳过一些符号。每次将符号传递给OutCommands 之后,SkipNumber 个数的符号都会被忽略

我们首先搜索下带字符T的地址有哪些:

  1. 0:000> s -[1]a  0029eeec  L1000 "T"
  2. 0x0029eefb
  3. 0x0029ef03
  4. 0x0029ef0b
  5. 0x0029ef15
  6. 0x0029f034
  7. 0x0029f06a
  8. 0x0029f07a
  9. 0x0029f08a
  10. 0x0029f09e
  11. 0x0029f356
  12. 0x0029f7f0
  13. 0x0029f989
  14. 0x0029fa50

然后我们用.foreach把它们da出来

  1. 0:000> .foreach(place{s -[1]a  0029eeec  L1000 "T"}){da ${place}}
  2. ^ Syntax error in ‘.foreach(place{s -[1]a  0029eeec  L1000 "T"}){da ${place}}‘
  3. 0:000> .foreach(place {s -[1]a  0029eeec  L1000 "T"}){da ${place}}
  4. 0029eefb  "Tencent\TSVulFw\TSVulFW.DAT"
  5. 0029ef03  "TSVulFw\TSVulFW.DAT"
  6. 0029ef0b  "TSVulFW.DAT"
  7. 0029ef15  "T"
  8. 0029f034  "T"
  9. 0029f06a  "T"
  10. 0029f07a  "T"
  11. 0029f08a  "T"
  12. 0029f09e  "T"
  13. 0029f356  "TxSignDemo"
  14. 0029f7f0  "T.)"
  15. 0029f989  "Ti.."
  16. 0029fa50  "T.)"

注意place和{之间必须有空格!

现在从第三个开始,每隔一个显示一个:

  1. 0:000> .foreach/pS3 /ps1(place {s -[1]a  0029eeec  L1000 "T"}){da ${place}}
  2. 0029ef15  "T"
  3. 0029f06a  "T"
  4. 0029f08a  "T"
  5. 0029f356  "TxSignDemo"
  6. 0029f989  "Ti.."

InFile
/f 一起使用。指定要解析的文本文件;结果会传递给OutCommands 。文件名InFile 必须用引号括起来我们在C盘建立个2.txt,内容为:

  1. 0x0029eefb
  2. 0x0029ef03
  3. 0x0029ef0b
  4. 0x0029ef15
  5. 0x0029f034
  6. 0x0029f06a
  7. 0x0029f07a
  8. 0x0029f08a
  9. 0x0029f09e
  10. 0x0029f356
  11. 0x0029f7f0
  12. 0x0029f989
  13. 0x0029fa50

运行命令:

  1. 0:000> .foreach/f (place "c:\2.txt"){da ${place}}
  2. 0029eefb  "Tencent\TSVulFw\TSVulFW.DAT"
  3. 0029ef03  "TSVulFw\TSVulFW.DAT"
  4. 0029ef0b  "TSVulFW.DAT"
  5. 0029ef15  "T"
  6. 0029f034  "T"
  7. 0029f06a  "T"
  8. 0029f07a  "T"
  9. 0029f08a  "T"
  10. 0029f09e  "T"
  11. 0029f356  "TxSignDemo"
  12. 0029f7f0  "T.)"
  13. 0029f989  "Ti.."
  14. 0029fa50  "T.)"

InCommands 的输出、InString 字符串或InFile 被解析时,任何数量的空格、tab符或回车都将会被当作单个分隔符。文本被分隔成的小片段被用来替换OutCommands 中的Variable

/s 一起使用。指定一个要解析的字符串;结果会传递给OutCommands

  1. 0:000> .foreach/s (place "0029ef03;0029ef0b"){da ${place} }
  2. 0029ef03  "TSVulFw\TSVulFW.DAT"
  3. ^ Syntax error in ‘da 0029ef03;0029ef0b ‘
  4. 0:000> .foreach/s (place "0029ef03 0029ef0b"){da ${place}}
  5. 0029ef03  "TSVulFw\TSVulFW.DAT"
  6. 0029ef0b  "TSVulFW.DAT"

所以,只是把空格,tab当成分隔符,不是分号!此原则适用于string和file

时间: 2024-11-06 11:12:00

windbg-.foreach循环输入(windbg script)的相关文章

Java语法糖1:可变长度参数以及foreach循环原理

语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这些语法做一些处理,开发者就可以直接方便地使用了.这些语法糖虽然不会提供实质性的功能改进,但是它们或能提高性能.或能提升语法的严谨性.或能减少编码出错的机会.Java提供给了用户大量的语法糖,比如泛型.自动装箱.自动拆箱.foreach循环.变长参数.内部类.枚举类.断言(as

巧用array_map()和array_reduce()替代foreach循环

1.array_reduce( $arr , callable $callback ) 使用回调函数迭代地将数组简化为单一的值. 其中$arr 为输入数组,$callback($result , $value)接受两个参数,$result为上一次迭代产生的值,$value是当前迭代的值. 使用array_reduce()替代foreach()循环最常用的一个业务场景也许就是数组求和,比如: 1 $arr = array('1','2','3'); //计算数组中数字的和 2 $sum = 0;

php foreach循环中的变量

使用foreach的时候出现了一个奇怪的现象,其中一个数组变量的最后一个值莫名其妙被修改了,查看php手册foreach说明发现 Warning 数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留.建议使用 unset() 来将其销毁. 有这样的警告.使用unset 方法或使用其他变量名称. 例如 $a=[1,2]; foreach($a as $key=>$value){ $a[$key]=$value+1; } echo $value;//输出 2 如果在$a中使用了

foreach循环

首先说一下foreach有的也叫增强for循环,foreach其实是for循环的一个特殊简化版. 再说一下foreach的书写格式: for(元素类型  元素名称 : 遍历数组(集合)(或者能进行迭代的)){ 语句 } foreach虽然是for循环的简化版本,但是并不是说foreach就比for更好用,foreach适用于循环次数未知,或者计算循环次数比较麻烦情况下使用效率更高,但是更为复杂的一些循环还是需要用到for循环效率更高. 我们看看下面的例子: 1 public static voi

在foreach循环中使用remove报ConcurrentModificationException异常原因

在foreach循环中使用remove报ConcurrentModificationException异常原因 我的代码具体是这样的 int dindex=0; int did=getInt("请输入需要删除的学生学号:"); for (Student student:list) { if(student.id==did){ list.remove(student); } } 这样会导致remove后,导致list在循环中下标和实际已经被修改后的下标不一致 我自己的解决方案是: int

for循环,for…in循环,forEach循环的区别

for循环,for…in循环,forEach循环的区别for循环通关for循环,生成所有的索引下标for(var i = 0 ; i <= arr.length-1 ; i++){ 程序内容 }来执行循环. forEach循环数组.forEach(function(形参1,形参2,形参3){})形参1: 存储的是当前循环次数时,获取的单元数据形参2.储存的是当前循环次数时,获取的单元索引下标形参3.储存的是原始数组三个参数不一定全部定义,看实际项目要求forEach() 只能循环遍历数组,不能循

foreach循环语句

一.foreach循环语句介绍: 1.格式: for(类型 变量名称:被遍历数组或集合){ 其他操作(输出操作) } 2.作用: 主要是用于简化书写 二.foreach循环语句遍历数组: public class oneHundredAndEight_oneHundredAndNine { public static void main(String[] args) { String[] names = {"萌萌","纯纯","爱爱","

迭代器、foreach循环、泛型集合

集合的迭代 语法:Iterator<Object> it=集合.iterator(); while(it.hasNext()){ Object obj=it.next(); } is.hasNext(); //判断是否有下一个元素 it.next(); //移动指针,返回指针指向元素 注意:集合在遍历的过程中不能进行修改,如果进行了修改操作,那么就会抛出ConcurrentModificationException异常, 如果需要进行删除,使用迭代器的it.remove()方法 foreach

第46条:for-each循环优先于传统的for循环

for-each循环通过完全隐藏迭代器或者索引变量,避免混乱和出错的可能,适用于集合和数组和任何实现Iterable接口的对象. 使用传统for循环,容易出错: enum Face { ONE, TWO, THREE, FOUR, FIVE, SIX } Collection<Face> faces = Arrays.asList(Face.values()); for(Iterator<Face> i = faces.iterator(); i.hasNext();) for(I