-
Win7系统中使用WinDbg与虚拟机调试驱动程序的操作方法和要点(10)
- 作者:宋惜瑶 分类:win7 发布时间:2017-10-12 21:37:56
-------------------------------------------goret.txt------------------------------------------------ r $t0=0 .while(@$t0!=c3){ p r $t0=by(eip) .if(@$t0=c3){ .break } } ------------------...
-------------------------------------------goret.txt------------------------------------------------
r $t0=0
.while(@$t0!=c3){
p
r $t0=by(eip)
.if(@$t0=c3){
.break
}
}
-----------------------------------------goret.txt完结----------------------------------------------
这里是最后一个示例分析,所以除了解释上面的指令之外也给出一些有价值的指令
not 非 and或者& 与
hi() 取高16位 or或者^ 或
low() 取低16位 xor或者| 异或
by() 取低8位 gu 步出,不知道具体原理,有时会出错
wo() 取低16位 t 步入
mod或者% 模运算
这个SCRIPT使用了一个循环,通过EIP取得当前指令的机器码,低8位既为指令,然后把指令存进$t0作比较。C3是RET的机器码,等于则跳出循环,否则一直步过。
这个示例表明,我们可以在SCRIPT里分析每一条指令。我们可以在WINDBG中进行2次开发,动态将那些简单使用JMP+内存指针或者寄存器作为跳转的乱序的程序重新排序,使花指令失效,并且实现自动清除垃圾指令,最后生成优化后的汇编代码文件。本论坛翻译区里的变形多态中的关于收缩器的理论已经为我们奠定了理论基础。
你可能会需要用到反汇编指令
u 起始地址 l长度 L代表的不是地址长度而是指令的个数
---------------------------------后续讨论,用SCRIPT把WINDBG变成脱壳机------------------------------
在准备写这篇文章的时候,我又把DEBUGGER COMMANDS看了一次,发现了这个指令
.writemen filename range 将目标内存区域写进文件。RANGE的格式为 地址 l长度
我没试过L后面是否接受寄存器作为参数。也没实际测试过这个指令的具体操作是怎么样的,无论如何,有这个可能存在。当然我们也可以申请内存区域以程序的方式来完成这个工作,不过我希望它仅用SCRIPT完成。
假如这的确可行,可以通过下面指令组合来自动寻找文件头,当然也能确定文件大小。
$p 伪寄存器,它将返回前一次用d*指令所显示的内存的内容。
假设00100000 01 02 03 04 05 06 07 08
我使用dd 00100000,那么$p = 04030201
显然我们可以通过这个方法来访问内存。
dw 取一个WORD; dd取DWORD; dw取qword
能访问内存也代表说我们在调试程序中插入的代码也能跟SCRIPT通信,并且把一些SCRIPT无法完成的工作交给程序执行,然后把结果返回给SCRIPT。
假如l的参数无法通过寄存器来传递,只能依靠用户按照提示进行操作,那么我们有更简单的方法
.imgscan 它将返回所有模块MZ的地址和它的SIZE
----------------------------------这里给出一些可能的疑问和解答--------------------------------------
Q:在调试SCRIPT文件的时候,我该如何知道寄存器跟内存的变化?
A:我们可以用下面的指令来观察寄存器跟内存的变化
d* 用于显示内存,之前已经提到就不详细说明了
? 寄存器 显示寄存器的值,例如
? poi(esp); ? $t0
这将先显示ESP指向的值,然后显示$t0的值
除了可以使用.echo命令对显示参数作说明之前,也可以使用.printf作格式化输出,它的用法跟C语言中的printf是一样的
Q:我写的SCRIPT文件出错了,语法跟参数都没错,为什么我找不到出错原因?
A:有的指令要注意的,BA只能在进入程序区域之后才能用。.dvalloc申请过的内存,即使用.dvfree释放了,也无法在同样的位置再申请,可能是BUG。
*是一个注释命令,它后面所有的内容都会被当作字符
$$则是以分号为结束
.restart指令跟.wtitle指令,不知道为什么不能放在SCRIPT中使用。
还有就是@这个标记,这个标记是告诉WINDBG后面的是一个伪寄存器而不是程序里的某一个变量的符号。有的指令在没有@标记的时候会报错,例如。 while括号里的条件表达式,如果你用了伪寄存器,一定要在前面加上@否则一定报错。此外用帮助文件里的话来说,使用@,可以让SCRIPT文件运行得更快,因为在解读这个代码的时候不需要先搜索一次SYMBOL记录。
猜您喜欢
- Win7笔记本小技巧:如何关闭触摸板,..2024-04-30
- win7安全证书过期,如何轻松解决?快..2024-04-30
- Win7本本无线网络不显示?这5招轻松解..2024-04-29
- windows7开机密码遗忘?别急,教你轻松..2024-04-29
- Win7电脑锁屏壁纸轻松换,让你的Wind..2024-04-29
- win7电脑开机无法进入桌面?看这里,..2024-04-29
相关推荐
- win7旗舰版系统复制大容量文件提示“..2023-01-27
- win7系统打印文件出现乱码六种原因和..2022-09-18
- Win7回收站清空恢复方法|回收站清空后..2017-09-08
- win7无法被远程桌面连接怎么办 win7远程..2022-04-18
- 电脑打印机双面开关是灰色无法选取的..2021-07-07
- win7系统360浏览器收藏夹位置 360浏览器..2022-02-17