2008年10月12日星期日

命令提示符(cmd)下修改注册表的“reg”命令

命令提示符(cmd)下修改注册表的“reg”命令(简)2007-06-05 19:49reg add KeyName [/v EntryName|/ve] [/t DataType] [/s separator] [/d value] [/f]
参数
KeyName
指 定子项的完全路径。对于远程计算机,请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算机名称。忽略 ComputerName 会导致默认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及 HKCC。
/v EntryName
指定要添加到指定子项下的项名称。
/ve
指定添加到注册表中的项为空值。
/t DataType
指定项值的数据类型。DataType 可以是以下几种类型:

REG_SZ

REG_MULTI_SZ

REG_DWORD_BIG_ENDIAN

REG_DWORD

REG_BINARY

REG_DWORD_LITTLE_ENDIAN

REG_LINK

REG_FULL_RESOURCE_DESCRIPTOR

REG_EXPAND_SZ

/s separator
指定用于分隔多个数据实例的字符。当 REG_MULTI_SZ 指定为数据类型且需要列出多个项时,请使用该参数。如果没有指定,将使用默认分隔符为 \。
/d value
指定新注册表项的值。
/f
不用询问信息而直接添加子项或项。
/?
在命令提示符显示帮助。
注释
该操作不能添加子树。该版本的 Reg 在添加子项时无需请求确认。
下表列出了 reg add 操作的返回值。 值 说明
0 成功
1 失败

范例
下列范例说明了如何使用 reg add 命令:

reg add \hklm\software\myco /v data /t reg_binary /d fe340ead
reg add "hkcu\software\microsoft\winmine" /v Name3 /t reg_sz /d Anonymous
reg add "hkcu\software\microsoft\winmine" /v Time3 /t reg_dword /d 5



reg delete
从注册表删除项或子项
语法
reg delete KeyName [{/v EntryName|/ve|/va}] [/f]
参数
KeyName
指 定子项的完全路径。对于远程计算机,请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算机名称。忽略 ComputerName 会导致默认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及 HKCC。
/v EntryName
删除子项下的特定项。如果未指定项,则将删除子项下的所有项和子项。
/ve
指定只可以删除为空值的项。
/va
删除指定子项下的所有项。使用本参数不能删除指定子项下的子项。
/f
无需请求确认而删除现有的注册表子项或项。
/?
在命令提示符显示帮助。
注释
下表列出了 reg delete 操作的返回值。 值 说明
0 成功
1 失败

范例
下面的范例说明了如何使用 reg delete 命令:

reg delete "hkcu\software\microsoft\winmine" /v Name1
reg delete "hkcu\software\microsoft\winmine" /v Time1
reg delete "hkcu\software\microsoft\winmine" /va


reg query

返回注册表的子项下的项和下一层子项的列表。

语法
reg query KeyName [{/v EntryName|/ve}] [/s]

参数
KeyName
指 定子项的完全路径。对于远程计算机,请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算机名称。忽略 ComputerName 会导致默认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及 HKCC。如果指定远程计算机,则只可使用 HKLM 和 HKU 子目录树。
/v EntryName
返回特定的项及其值。该参数只返回直接位于指定子项的下一层中的项。将会找不到当前子项下的子项中的项。如果省略 EntryName,则将返回子项下的所有项。
/ve
指定仅返回为空值的项。
/s
将返回各个层中的所有子项和项。如果不使用该参数,将只返回下一层的子项和项。
/?
在命令提示符显示帮助。
注释
下表列出了 reg query 操作的返回值。 值 说明
0 成功
1 失败

范例
下面的范例说明了如何使用 reg query 命令:
reg query "hklm\system\currentcontrolset\control\session manager" /v maxstacktracedepth

reg query "hkcu\software\microsoft\winmine" /s

2008年10月10日星期五

_chkstk() 分析

_chkstk() 分析 (2008-07-21 22:07:32)
标签:it 分类:技术

_chkstk()
作者: happylong (SXL)
1 什么是_chkstk() ?
“没有比源码还能说明问题的东西了” – 我说的

1.1 VC 6.0生成
_chkstk:

push ecx

cmp eax,1000h

lea ecx,[esp+8]

jb lastpage

probepages:

sub ecx,1000h

sub eax,1000h

test dword ptr [ecx],eax

cmp eax,1000h

jae probepages (0040818c)

lastpage:

sub ecx,eax

mov eax,esp

test dword ptr [ecx],eax

mov esp,ecx

mov ecx,dword ptr [eax]

mov eax,dword ptr [eax+4]

push eax

ret

1.2 分析:
大概流程

1) “chkstk Routine is a helper routine for the C compiler. For x86

compilers, _chkstk Routine is called when the local variables exceed

4096 bytes; for x64 compilers it is 4K and 8K respectively.”

即, 当一个函数局部变量超过一个页面大小4k的时候, 编译器会自动插入这个函数。插入这个函数的位置在:

push ebp

mov ebp,esp

mov eax,1000D4h

call _chkstk()

2) 这个函数做什么?当函数为堆栈分配的页面不够时, (堆栈默认大小为1M), 堆栈需要

更多的页面时调用这个函数。

当堆栈使用大于分配的大小(默认1M)时,产生_XCPT_UNABLE_TO_GROW_STACK.



3) 当调用这个函数时, 首先外面对eax进行赋值(已经分配的堆栈大小 + 即将分配给函数局部变量的堆栈大小)



4) 调用 _chkstk() 首先,保持当期esp到eax中,然后开始判断:如果分配的大小大于一个页面, 到第5)步(大多都先第5)步);否则到第6)步。



5) 当需要分配的大小大于一个页面, 则增加一个页面。“sub eax 1000h” 表示堆栈栈顶下移1000h,[由于堆栈是高地址(栈底部)->低地址(栈顶部)分布],所以堆栈扩大了1000h; “sub ecx 1000h”表示分配了1000h(1个页面)之后还需要多少空间;

“test dword ptr [ecx],eax” 表示分配空间,这个时候之前只不过是分配虚存,内存没有 commit ,这个时候对这个内存地址进行读写操作都会引发一个 page fault 异常(_XCPT_GUARD_PAGE_VIOLATION), OS捕获这个异常,检查一定的条件,适合的时候就把这个内存页 commit 了,即分配了实际的物理内存。然后再次比较需要多少内存,如果还是超过1页(1000h), 则重复第5)步,否则到第6)步。



6) 还需要分配的堆栈空间小于1页的时候,“sub ecx,eax” 堆栈继续扩大(扩大了剩余大小的空间);然后“mov esp,ecx”,保存到原来的esp;并且通过“test”为堆栈分配空间。



7) 最后,esp的值不再是原来的值,堆栈的大小变成: 堆栈原来大小 + 局部变量需要的堆栈大小 + xx (push 用的一点堆栈的零头).这个时候 ebp 和 esp如下 :(图搞不上去。。。。。)