羞怯的渣白君
【MSDNのC#系列教程】数组
展开Biu

本帖最后由 羞怯的渣白君 于 2012-7-31 11:03 编辑

此为MSDN的资料源地址:http://msdn.microsoft.com/zh-cn/library/ms123401

教程

本教程分为下述几节:

  • 数组概述
  • 声明数组
  • 初始化数组
  • 访问数组成员
  • 数组是对象
  • 对数组使用 foreach

数组概述

C# 数组从零开始建立索引,即数组索引从零开始。C# 中数组的工作方式与在大多数其他流行语言中的工作方式类似。但还有一些差异应引起注意。

声明数组时,方括号 ([]) 必须跟在类型后面,而不是标识符后面。在 C# 中,将方括号放在标识符后是不合法的语法。

int[] table; // not int table[];

另一细节是,数组的大小不是其类型的一部分,而在 C 语言中它却是数组类型的一部分。这使您可以声明一个数组并向它分配 int 对象的任意数组,而不管数组长度如何。

int[] numbers; // declare numbers as an int array of any size

numbers = new int[10]; // numbers is a 10-element array

numbers = new int[20]; // now it's a 20-element array

声明数组

C# 支持一维数组、多维数组(矩形数组)和数组的数组(交错的数组)。下面的示例展示如何声明不同类型的数组:

一维数组:

int[] numbers;

多维数组:

string[,] names;

数组的数组(交错的):

byte[][] scores;

声明数组(如上所示)并不实际创建它们。在 C# 中,数组是对象(本教程稍后讨论),必须进行实例化。下面的示例展示如何创建数组:

一维数组:

int[] numbers = new int[5];

多维数组:

string[,] names = new string[5,4];

数组的数组(交错的):

byte[][] scores = new byte[5][];

for (int x = 0; x < scores.Length; x++)

{

scores[x] = new byte[4];

}

还可以有更大的数组。例如,可以有三维的矩形数组

int[,,] buttons = new int[4,5,3];

甚至可以将矩形数组和交错数组混合使用。例如,下面的代码声明了类型为 int 的二维数组的三维数组的一维数组。

int[][,,][,] numbers;

示例

下面是一个完整的 C# 程序,它声明并实例化上面所讨论的数组。

// arrays.cs

using System;

class DeclareArraysSample

{

public static void Main()

{

// Single-dimensional array

int[] numbers = new int[5];

// Multidimensional array

string[,] names = new string[5,4];

// Array-of-arrays (jagged array)

byte[][] scores = new byte[5][];

// Create the jagged array

for (int i = 0; i < scores.Length; i++)

{

scores= new byte[i+3];

}

// Print length of each row

for (int i = 0; i < scores.Length; i++)

{

Console.WriteLine("Length of row {0} is {1}", i, scores.Length);

}

}

}

输出

Length of row 0 is 3

Length of row 1 is 4

Length of row 2 is 5

Length of row 3 is 6

Length of row 4 is 7

初始化数组

C# 通过将初始值括在大括号 ({}) 内为在声明时初始化数组提供了简单而直接了当的方法。下面的示例展示初始化不同类型的数组的各种方法。

注意 如果在声明时没有初始化数组,则数组成员将自动初始化为该数组类型的默认初始值。另外,如果将数组声明为某类型的字段,则当实例化该类型时它将被设置为默认值 null。
一维数组

int[] numbers = new int[5] {1, 2, 3, 4, 5};

string[] names = new string[3] {"Matt", "Joanne", "Robert"};

可省略数组的大小,如下所示

int[] numbers = new int[] {1, 2, 3, 4, 5};

string[] names = new string[] {"Matt", "Joanne", "Robert"};

如果提供了初始值设定项,则还可以省略 new 运算符,如下所示:

int[,] numbers = { {1, 2}, {3, 4}, {5, 6} };

string[,] siblings = { {"Mike", "Amy"}, {"Mary", "Albert"} };

交错的数组(数组的数组)

可以像下例所示那样初始化交错的数组:

int[][] numbers = new int[2][] { new int[] {2,3,4}, new int[] {5,6,7,8,9} };

可省略第一个数组的大小,如下所示:

int[][] numbers = new int[][] { new int[] {2,3,4}, new int[] {5,6,7,8,9} };

-或-

int[][] numbers = { new int[] {2,3,4}, new int[] {5,6,7,8,9} };

请注意,对于交错数组的元素没有初始化语法。

访问数组成员

访问数组成员可以直接进行,类似于在 C/C++ 中访问数组成员。例如,下面的代码创建一个名为 numbers 的数组,然后向该数组的第五个元素赋以 5:

int[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};

numbers[4] = 5;

下面的代码声明一个多维数组,并向位于 [1, 1] 的成员赋以 5:

int[,] numbers = { {1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10} };

numbers[1, 1] = 5;

下面声明一个一维交错数组,它包含两个元素。第一个元素是两个整数的数组,第二个元素是三个整数的数组

int[][] numbers = new int[][] { new int[] {1, 2}, new int[] {3, 4, 5}

};

下面的语句向第一个数组的第一个元素赋以 58,向第二个数组的第二个元素赋以 667:

numbers[0][0] = 58;

numbers[1][1] = 667;

数组是对象

在 C# 中,数组实际上是对象。System.Array 是所有数组类型的抽象基类型。可以使用 System.Array 具有的属性以及其他类成员。这种用法的一个示例是使用“长度”(Length) 属性获取数组的长度。下面的代码将 numbers 数组的长度(为 5)赋给名为 LengthOfNumbers 的变量:

int[] numbers = {1, 2, 3, 4, 5};

int LengthOfNumbers = numbers.Length;

System.Array 类提供许多有用的其他方法/属性,如用于排序、搜索和复制数组的方法。

对数组使用 foreach

C# 还提供 foreach 语句。该语句提供一种简单、明了的方法来循环访问数组的元素。例如,下面的代码创建一个名为 numbers 的数组,并用 foreach 语句循环访问该数组:

int[] numbers = {4, 5, 6, 1, 2, 3, -2, -1, 0};

foreach (int i in numbers)

{

System.Console.WriteLine(i);

}

由于有了多维数组,可以使用相同方法来循环访问元素,例如:

int[,] numbers = new int[3, 2] {{9, 99}, {3, 33}, {5, 55}};

foreach(int i in numbers)

{

Console.Write("{0} ", i);

}

该示例的输出为:

9 99 3 33 5 55

[查看全文]
羞怯的渣白君
【MSDNのC#系列教程】<语言规范>1.1开始
展开Biu

本帖最后由 羞怯的渣白君 于 2012-7-20 19:43 编辑

此为MSDN的资料源地址http://msdn.microsoft.com/zh-cn/library/ms123401

经典性“hello, world”程序可以写为:

using System;

class Hello

{

static void Main() {

Console.WriteLine("hello, world");

}

}

C# 程序的源代码通常存储在一个或多个以 .cs 为文件扩展名的文本文件(如 hello.cs)中。可以通过 Visual Studio .NET 所提供的命令行编译器,使用以下命令行指令来编译此程序:

csc hello.cs

它产生一个名为 hello.exe 的应用程序。当此应用程序运行时,它产生的输出是:

hello, world

仔细观察此程序可以发现:

  • using System;”指令引用一个名为 System 的命名空间,它由 Microsoft .NET Framework 类库定义。此命名空间包含 Main 方法中引用的 Console 类。命名空间提供了一种分层方法来组织一个或多个程序中的各种元素。用“using”指令指定一个命名空间后,该命名空间中的所有成员均可直接被引用。所以,在“hello, world”程序中,可直接使用 Console.WriteLine(而不必使用 System.Console.WriteLine)。

  • Main 方法是 Hello 类的成员。它具有 static 修饰符,因此 Main 方法是相对于类 Hello 本身而不是相对于此类的实例。

  • 应用程序的入口点(即当程序开始运行时首先被调用的方法)总是名为 Main 的静态方法。

  • “hello, world”输出依靠类库实现。C# 语言本身不提供类库,它使用公共的类库(Visual Basic .NET 和 Visual C++ .NET 也使用它)。

对 C 和 C++ 开发人员而言,值得注意的是一些“没有”出现在“hello, world”程序中的东西。

  • 该程序中的 Main 方法不是全局的。C# 不支持全局级别的方法和变量;这类元素总是包含在类型声明(如类声明和结构声明)中。

  • 该程序没有使用“::”运算符和“->”运算符。在 C# 中,“::”根本不是运算符,而“->”运算符仅在一小部分程序中使用,即那些涉及不安全代码的程序(第A节:http://msdn.microsoft.com/zh-cn/library/aa664769(v=vs.71)(请复制到地址栏)。分隔符“.”在复合名称中使用,如 Console.WriteLine。

  • 该程序没有包含前向声明。C# 中声明出现的顺序并不重要,所以不需要作前向声明。

  • 该程序没有使用 #include 导入程序文本。程序间的依赖项通过符号而不是文本来控制。这样就消除了由多种语言编写的应用程序之间的障碍。例如,Console 类不需要用 C# 编写。

[查看全文]
软软的上嘴唇
C++中的指针用法总结
展开Biu

C++程序设计重要基础就是类和对象,对象指针是很重要的一部分,包括指向对象的指针、指向对象成员的指针、this指针、指向对象的常指针、指向常对象的指针等。

1、指向对象的指针

定义:对象空间的起始地址就是对象的指针。

说明:在建立对象时,编译系统就为每个对象分配一定的存储空间以存放其成员,不过注意,在一般情况下不同对象的数据存储单元中存放的数据成员是不相同,而不同对象的函数代码却是相同的,也就是说,它们的函数代码是共享的。这时我们可以定义一个指针变量用来存放对象的指针。

定义指向类对象的指针变量的一般形式是:

类名 *对象指针名;

如对于与个Time类对象,我们可以有:

我们就可以通过对象指针访问对象和对象的成员,假如所定义的类中有数据成员hour、minute、sec,成员函数有gettime(),则

(*p).hour 即为p指向对象中的hour成员,相当于t.hour

(*p).gettime() 即为p指向对象中的成员函数gettime(),相当于t.gettime()

也可以用如下形式:

p->hour 和 p->gettime()和上面是等价的。

2、指向对象成员的指针

(1)指向对象数据成员的指针

在C中我们学过指向普通变量的指针变量,在C++中定义指向对象数据成员的指针变量的方法和定义指向普通变量的指针变量方法相同,其一般形式为:

数据类型名 *指针变量名;

如:

(2)指向对象成员函数的指针

定义指向对象成员函数的指针变量和定义指向普通函数的指针变量不同。

在定义指向普通函数的指针变量时我们可以这样定义:

然而编译系统要求在将函数地址赋给指针变量时必须满足三个条件:

函数参数类型及个数要匹配

函数返回值的类型要匹配

所属的类要匹配

显然在上面的p与类是无关的。为了满足第三条,我们可以为指针指定类,故定义指向对象成员函数的指针变量一般形式为:

数据类型(类名::*指针变量名)(参数表列);

可以让指针指向公用的成员函数,如:

注意:因为成员函数不存放在对象空间中,多个同类对象共享此成员函数代码,所以在将成员函数的入口地址赋给指针变量是应写成:

指向对象成员函数的指针变量=&类名::成员函数名;

在成员函数名后面没有"()",如果写成p=&Time::gettime()是错误的。[nextp

3、this指针

在每个成员函数中都包含了一个特殊的指针,称为this,它是指向本类对象的指针,它的值是当前被调用成员函数所在对象的起始地址。之所以有这个指针,是因为为了保证同类的不同对象的成员函数引用的是指定对象中的数据成员,它是系统自动实现的。

如定义一个求体积的函数

假如已经定义了对象t,当调用成员函数t.vol()时,编译系统就把对象t的起始地址赋给this指针,于是在成员函数引用数据成员时,根据指针this就可以引用到对象t的数据成员。所以C++把上面的函数处理成

由于this的值是当前被调用成员函数所在对象的起始地址,所以可以写成

所以在调用成员函数t.vlo()时,实际的调用方式为t.vol(&t),不过对象t的地址传给this指针是由系统自动完成的,不需人为加上。

4、指向对象的常指针

将指向对象的指针变量声明为const型且进行处始化,这样指针值始终保持为其初值,不能改变其指向。

如:

由上面我们可以看出定义指向对象的常指针的一般形式为:

类名 *const 指针变量名=对象的起始地址;

注意:指向对象的常指针变量的值不能改变,但可以改变它所指向对象中的数据成员的值。

常指针一般用作函数的参数,这样就不允许在函数执行过程中改变指针变量的值,使其始终保持指向原来的对象。

5、指向常对象的指针变量

首先回顾一下指向常变量的指针变量,其一般形式为:

const 类型名 *指针变量名;

如:

如果一个变量已经被声明为常变量,那么只能用指向常变量的指针变量去指向它,而不能用一般的指针变量。另外,指向常变量的指针变量除了可以指向常变量外,还可以指向未被声明为const的变量,但也不能通过该指针改变其值。例如:

说明:上例中,指针变量p指向字符变量c,并不说把c也声明成常变量,而只是说在通过指针变量引用c时,c具有常变量的特征,其值是不能改变的,但c仍然是一个普通变量。

在指向常变量的指针中,关于函数形参的指针类型有几点值得注意:

如果函数形参是非const型指针变量,实参只能用指向非const型指针;如果函数形参是指向const型变量的指针,实参则可以是const型的或非const型的指针变量。换句话说就是指向常变量的指针可以指向const和非const型的变量,而指向非const型变量的指针只能指向非const的变量。

用指针变量作形参时形参和实参的对应关系表:

下面说到正题,指向常对象的指针变量和指向常变量指针变量类似。

如果一个对象已经被声明为长对象,只能用指向常对象的指针变量指向它,而不能用一般的指针变量指向它。

如果定义了一个指向常对象的指针变量且使它指向一个非const的对象,其指向的对象不能通过指针来改变。

如果定义了一个指向常对象的指针变量,是不能通过它改变所指向的对象的值的,但是指针变量本身的值是可以改变的。

如:

所以当我们希望在调用函数时对象的值不被修改,我们就可以把形参定义为const型的指针变量,同时用对象的地址作实参(对象可以是const或非const型);当要求对象不仅在调用函数中不被改变,而且在程序执行过程中也不发生改变,我们就把它定义为const型。所以指向常对象的指针最常用于函数的参数,以保护形参指针所指向的对象在函数执行过程中不被修改。

本文来自: IT加油站—计算机学习网(http://www.itjyz.com) 详细文章参考:http://www.itjyz.com/article-600-1.html

[查看全文]
夫哂之
鸟哥的linux私房菜
展开Biu

本帖最后由 夫哂之 于 2012-7-21 01:05 编辑

我来贡献一发吧。:http://download.csdn.net/detail/lvzhenyu/1299415

[查看全文]
69chan
《学习iPhone和iPad Cocos2D游戏开发》PDF
展开Biu

本帖最后由 69chan 于 2012-3-15 21:59 编辑

原地址:http://www.cocoachina.com/bbs/read.php?tid-55155.html

译者的话:

在此分享《Learn iPhone and iPad Cocos2D Game Development》翻译的章节。

鉴于技术和英文水平的限制,纰漏在所难免。请大家多提意见。谢谢。

因为第十四章 Game Center 其实和Cocos2D没有多大的关系,而且Game Center API的用法可以通过苹果的官方文档来学习,所以我决定不再翻译下去。

鉴于出版书籍要通过很多手续和关系才能完成,而我又不认识任何与出版社有关的人士,所以我想这些翻译的章节也只能停留在论坛上作为PDF下载了。

谢谢大家一路以来的支持!

什么是Cocos2D?

Cocos2D是一个开源框架,用于构建2D游戏、演示程序和其他图形界面交互应用等。

主要功能

流程控制(Flow control):非常容易地管理不同场景(scenes)之间的流程控制

精灵(Sprites):快速而方便的精灵

动作(Actions):告诉精灵们该做什么。可组合的动作如移动(move)、旋转(rotate)和缩放(scale)等更多

特效(Effects):特效包括波浪(waves)、旋转(twirl)和透镜(lens)等更多

平面地图(Tiled Maps):支持包括矩形和六边形平面地图

转换(Transitions):从一个场景移动到另外一个不同风格的场景

菜单(Menus):创建内部菜单

文本渲染(Text Rendering):支持标签和HTML标签动作

文档(Documents):编程指南 + API参考 + 视频教学 + 很多教你如何使用的简单测试例子

BSD许可:尽管用就是了

基于Pyglet:没有外部的依赖

基于OpenGL:支持硬件加速

Cocos2D for iPhone

它是基于Cocos2D设计的,所以有着相同的理念,但不同的是它把Python语言替换成了Objective-C。

本内容已隐藏,回复后刷新可见哦

[查看全文]
Bugsong
[FWD]VOCALOID2程序加载图修改教程
展开Biu

本帖最后由 Bugsong 于 2012-12-26 11:47 编辑

原创发表于:VOCALOID2程序加载图修改教程 | 大D综合研究院

原文链接:http://www.dadclab.com/archives/684

本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。

协议查看链接:http://creativecommons.org/licenses/by-nc-sa/2.5/cn/


嘿嘿,这个要首先感谢iVocaloid论坛开水房的朋友,没有这些朋友对我发的一个图提出建议,大D可能也不会去研究这个东西。哈哈,现在弄出来了,跟大家分享一下,这可是原创教程哦~~

在文章末尾有需要用到的工具的下载链接.

好啦,废话唠叨完了,进入正题。

零、效果

一、分析Vocaloid2程序

首先分析一下Vocaloid2程序,主要是看一下有没有加载外部的资源文件。使用CProcess监视Vocaloid2程序进程,发现加载了一个资源dll文件。

这一步直接修改的同学可以跳过,嘿嘿,文后工具打包里面也没有提供这个,哈哈……因为用不到了呢~~

看到Vocaloid2_Japanese.dll为程序调用的一个Resource DLL(资源文件)。

二、分析资源文件

大D使用的是打了汉化补丁的Vocaloid2,在使用PEiD查是否加壳时,提示是加了UPX壳。

将备份的文件进行查壳,提示是没有壳的。大家可以使用PEiD来查一下是否加壳。直接拖拽需要检测的文件到程序窗口里就OK了~

脱壳前请备份好文件哦~

UPX是一个典型的压缩壳,需要解压缩,可以使用UPX加壳工具来进行解压缩壳的操作。

压缩包里提供了这个程序,文件夹名字为upx203w。

运行cmd,进入保存upx加壳程序的路径。

cd d:\software\crack\upx203w\

cd 后面的是你程序所存放的路径。

然后执行

d:\SoftWare\crack\upx203w>upx -d "d:\Program Files (x86)\VOCALOID2\VOCALOID2_Japanese.dll"

程序运行如下图:

看到Unpacked 1 file 就是脱壳完毕了。

这时可以再使用PEiD查壳,脱壳后应显示为:

这时文件信息已由Upx 0.80-1.24dll变成PE Win32 DLL(win32 PE程序 DLL文件),这时运行一下vocaloid2程序,确认程序可以正常运行。

程序确认可以正常运行后,关闭程序就可以进行修改了~~

三、修改资源文件

修改资源文件使用ResHacker程序。

打开程序后,将VOCALOID2_Japanese.dll文件拖拽入程序主窗口,即可完成加载。

加载完毕后入下图所示:

在资源文件列表这边打开位图,就可以看到Vocaloid2程序使用的一些位图信息。

找到322 326 348三个资源组,将这几个资源组下的位图进行替换。

322资源组如上图所示。

326资源组。

348资源组。

以修改348资源组为例,剩下两个操作都一样。

选中348资源组下的1041位图后,操作菜单-替换位图。

点替换位图后,出现如下对话框。

打开新的位图文件,选择制作好的加载图。加载图格式为:360*270*24b bmp格式。(高*宽*颜色 文件存储格式)

打开后如下图:

加载完毕,点替换即可完成。

使用同样的步骤将322 326两个资源组都替换完毕后,保存一下,ctrl+s或者到文件菜单下保存就可以了。

到此修改工作结束。

四、相关工具下载

Yunfiles(推荐使用……大D也不容易……) | 妖妖舞网盘| DBank网盘 | 金山快盘

五、POCALOID2脱壳文件下载

嗯,这壳脱得,真费了一番周折,大D破解脱壳啥的很菜……就不贴上来方法了,给大家脱了壳的文件下载。

大家想怎么折腾就折腾吧,哈哈~

下载地址:

妖妖舞网盘 | DBank网盘 | 金山快盘

[查看全文]
Bugsong
[FWD]FBWF安装及使用的若干问题
展开Biu

本帖最后由 Bugsong 于 2012-12-26 11:47 编辑

原创发表于:FBWF安装及使用的若干问题 | 大D综合研究院

原文链接:http://www.dadclab.com/archives/959

本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。

协议查看链接:http://creativecommons.org/licenses/by-nc-sa/2.5/cn/


大D综合研究院以前介绍过FBWF的安装使用,虽然这家伙也来自微软,WES7的内核跟Win7一致,但是也不能说这功能在Win7没有水土不服。在安装和使用中,总会有这样那样的问题,本文将对常见的问题说一下。在FBWF安装过程中,最常见的就是下图的错误安装完毕之后,命令提示符输入fbwfmgr /enable后返回FbwfMgr: Unable to communicate with the file-based write filter.错误原因一:驱动程序拷贝不正确解决方法:确认关闭UAC,拷贝驱动程序到C:\Windows\System32\drivers,重新启动电脑,然后在管理员权限打开cmd,来执行这个命令。 错误原因二:注册表信息问题解决方法:修改注册表信息(本方法修改注册表,请备份操作系统,谨慎操作)将[HKLM\SYSTEM\CurrentControlSet\ENUM\Root]的注册表键权完全控制限提升为everyone。1、因Win7有注册表关键位置保护,这个主键是不允许提升权限的。先下载PsExec程序(文后提供链接)解压备用。以管理员身份打开CMD。输入 cd 你解压psexec的路径例如 c:\windows\users\bugsong\desktop\psexec\进入到目录后,执行命令。psexec.exe -i -d -s regedit.exe这时会启动注册表编辑器(修改注册表操作,请备份系统,谨慎操作)修改权限。修改权限完毕之后,将下列注册表信息手工添加到注册表“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FBWF“Start”, “REG_DWORD”, “00000000″

“Type”, “REG_DWORD”, “00000002″

“ErrorControl”, “REG_DWORD”, “00000001″

“ImagePath”, “REG_EXPAND_SZ”, “system32\drivers\Fbwf.sys”

“Group”, “REG_SZ”, “FSFilter System Recovery”

“DisplayName”, “REG_SZ”, “”

“DependOnService”, “REG_MULTI_SZ”, “FltMgr”

“DebugFlags”, “REG_DWORD”, “00000000″

“EnabledOnAllSkus”, “REG_DWORD”, “00000001″“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FBWF\FBA”“ProtectRegistryRamdisk”, “REG_SZ”, “\RegfData”

“EnablePostFBA”, “REG_DWORD”, “00000000″“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FBWF\Instances”“DefaultInstance”, “REG_SZ”, “Fbwf Instance”“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FBWF\Enum”“Altitude”, “REG_SZ”, “226000″

“Flags”, “REG_DWORD”, “00000000″“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FBWF\FBA\Exclusion”“0″, “REG_SZ”, “Root\LEGACY_FBWF\0000″

“Count”, “REG_DWORD”, “00000001″“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_FBWF”“NextInstance”, “REG_DWORD”, “00000001″“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_FBWF\0000″“Service”, “REG_SZ”, “Fbwf”

“Legacy”, “REG_DWORD”, “00000001″

“ConfigFlags”, “REG_DWORD”, “00000032″

“Class”, “REG_SZ”, “LegacyDriver”

“ClassGUID”, “REG_SZ”, “{8ECC055D-047F-11D1-A537-0000F8753ED1}”

“DeviceDesc”, “REG_SZ”, “Fbwf”“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_FBWF\0000\Control”“ActiveService”, “REG_SZ”, “Fbwf”其中,形如:

“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_FBWF\0000\Control”为创建新的键“ActiveService”, “REG_SZ”, “Fbwf”“ActiveService”为值的名称“REG_SZ”值的类型(SZ为字符串,DWORD就是dowrd类型)“Fbwf”值的数据内容 回收站无法使用的问题。因Fbwf将C盘保护起来了,所以回收站基本等于无用,可以关闭掉。方法请Google。 常用Fbwf命令1.查看FBWF的状态

Fbwfmgr

//查看FBWF的状态。

也可以使用

Fbwfmgr /displayconfig

//查看FBWF的状态。

成功返回:

File-based write filter configuration for the current session:

//当前FBWF状态。

filter state: enabled.

// FBWF现在处在开状态。

overlay cache data compression state: enabled.

//压缩覆盖缓存:开启。

解释一下FBWF拦截的数据放在缓冲区中即覆盖缓存

overlay cache threshold: 1024 MB.

// 覆盖缓存区大小:1024MB。

overlay cache pre-allocation: disabled.

// 覆盖缓存预分配:关闭。开启后会预先分配FBWF的覆盖缓存。

size display: virtual mode.

// 覆盖缓存:虚拟模式。FBWF具有两种模式实际模式和虚拟模式,在虚拟模式下覆盖缓存的可用容量=被写保护驱动器显示的可用容量。

例如C驱动器被写保护,当前(虚拟模式,系统运行)C驱动器还有128MB的可用空间即表示覆盖缓存还有128MB可用。

protected volume list:

\Device\HarddiskVolume1

//当前受写保护的驱动器,这里用驱动器号表示

HarddiskVolume1=C:

HarddiskVolume2=D:

……

注意:有时候不是按顺序排的。例如:HarddiskVolume3=D:例如

write through list of each protected volume:

\Device\HarddiskVolume1:

\Documents and Settings\Administrator\Local Settings\Temp

\Documents and Settings\Administrator\Local Settings\Temporary InternetFiles

\Documents and Settings\Administrator\My Documents

\Documents and Settings\Administrator\桌面

\Documents and Settings\All Users\My Documents

\Documents and Settings\All Users\桌面

\RegfData

\WINDOWS\TEMP

\userdata

//FBWF的豁免写保护列表。在列表中的文件或文件夹不受写保护。\Device\HarddiskVolume3: (none)表示整个驱动器(HarddiskVolume3)又受到写保护。

注意:\RegfData文件如果存在在C:下不要将其从豁免写保护列表中手动删除和添加。同样不要尝试添加和删除\fbwf.cfg

File-based write filter configuration for the next session:

//下次启动系统(系统重起后)FBWF状态。

filter state: disabled.

// FBWF在下次启动被关闭。2. FBWF的开启和关闭。

开启:

FbwfMgr /enable

成功返回:

File-based write filter will be enabled on the next reboot.

关闭:

FbwfMgr /disable

成功返回:

File-based write filter will be disabled on the next reboot.

注意:两条命令都重起后生效3.FBWF豁免写保护列表添加删除驱动器(添加删除受FBWF控制的驱动器)

添加:

FbwfMgr /addvolume \Device\HarddiskVolume3

//添加\Device\HarddiskVolume3 添加驱动器到FBWF豁免写保护列表,默认列表为空(该驱动器将受到FBWF保护)

也可以这样写

FbwfMgr /addvolume D:

//添加D:驱动器到FBWF豁免写保护列表

正常返回:

Volume \Device\HarddiskVolume3 will be protected after the next reboot.

或者

Volume d: will be protected after the next reboot.错误返回:

Volume cannot be added. Filter is not enabled for the next session.

//下次FBWF为关闭状态,开启才能使用。删除:

FbwfMgr /removevolume \Device\HarddiskVolume3 1

//从FBWF豁免写保护列表删除HarddiskVolume3 驱动器 (该驱动器将不再受到FBWF保护)

也可以这样写

FbwfMgr /removevolume d: 1

//从FBWF豁免写保护列表删除d: 驱动器注意本命令有一个开关

1代表:重起后删除该驱动器豁免写保护列表。

0代表:重起后不删除该驱动器豁免写保护列表。

正常返回:

Volume \Device\HarddiskVolume3 will not be protected after the next reboot.

或者

Volume d: will not be protected after the next reboot.

错误返回:

Volume cannot be added. Filter is not enabled for the next session.

//下次FBWF为关闭状态,开启才能使用。

注意:两条命令都是重起后生效,并且下次重起FBWF为开启状态才能执行。4. 向FBWF豁免写保护列表(不受FBWF写保护)添加文件夹。

添加文件夹:

FbwfMgr /addexclusion \Device\HarddiskVolume1 \Temp

//将Device\HarddiskVolume1\Temp 文件夹添加进FBWF豁免写保护列表。

也可以这样写:

FbwfMgr /addexclusion c: \Temp

//将c:\Temp文件夹添加到FBWF豁免写保护列表。成功返回:

Path \Temp on volume \Device\HarddiskVolume1 will be in the exclusion list after the next reboot.

或者

Path \Temp on volume c: will be in the exclusion list after the next reboot.错误返回:

Path cannot be added. Filter is not enabled for the next session.

// 下次FBWF为关闭状态,开启才能使用。注意:命令中磁盘号和文件夹路径有一个空格。

命令中盘符和文件夹路径有一个空格

例如:正确的表示:Device\HarddiskVolume1 \Temp 或者c: \Temp

错误的表示:Device\HarddiskVolume1\Temp 或者:c:\Temp注意:命令重起后生效,并且下次重起FBWF为开启状态才能执行。

即使路径不存在也可以添加,但是必须先用FbwfMgr /addvolume命令添加驱动器否则会出现错误:FbwfMgr failed: 系统找不到指定的驱动器。5.向FBWF豁免写保护列表(不受FBWF写保护)添加文件。

FbwfMgr /addexclusion \Device\Harddisklume1 \1.txt

//将Device\HarddiskVolume1\1.txt 文件添加进FBWF豁免写保护列表。

也可以这样写

FbwfMgr /addexclusion c: \1.txt

//将c:\1.txt 文件添加进FBWF豁免写保护列表。

成功返回:

Path \1.txt on volume \Device\HarddiskVolume1 will be in the exclusion list after the next reboot.

或者

Path \1.txt on volume c: will be in the exclusion list after the next reboot.

错误返回:

Path cannot be added. Filter is not enabled for the next session.

// 下次FBWF为关闭状态,开启才能使用。

注意:命令中磁盘号和文件路径有一个空格。

命令中盘符和文件路径有一个空格

例如:正确的表示:Device\HarddiskVolume1 \1.txt 或者c: \1.txt

错误的表示:Device\HarddiskVolume1\1.txt 或者:c:\1.txt注意:。

命令重起后生效,并且下次重起FBWF为开启状态才能执行。

即使路径不存在也可以添加,但是必须先用FbwfMgr /addvolume命令添加驱动器否则会出现错误:FbwfMgr failed: 系统找不到指定的驱动器。6.删除FBWF豁免写保护列表(不受FBWF写保护)的文件夹

FbwfMgr /Removeexclusion \Device\HarddiskVolume1 \Temp

//将Device\HarddiskVolume1\Temp 从FBWF豁免写保护列表中删除。

也可以这样写:

FbwfMgr /Removeexclusion c: \Temp

//将c:\Temp文件夹从FBWF豁免写保护列表中删除。

注意:命令中磁盘号和文件夹路径有一个空格。

命令中盘符和文件夹路径有一个空格

例如:正确的表示:Device\HarddiskVolume1 \Temp 或者c: \Temp

错误的表示:Device\HarddiskVolume1\Temp 或者:c:\Temp注意:命令重起后生效,并且下次重起FBWF为开启状态才能执行。7.删除FBWF豁免写保护列表(不受FBWF写保护)的文件

FbwfMgr /Removeexclusion \Device\Harddisklume1 \1.txt

//将Device\HarddiskVolume1\1.txt 文件添加进FBWF豁免写保护列表。

也可以这样写

FbwfMgr /Removeexclusion c: \1.txt

//将c:\1.txt 文件从BWF豁免写保护列表中删除。

注意:命令中磁盘号和文件路径有一个空格。

命令中盘符和文件路径有一个空格

例如:正确的表示:Device\HarddiskVolume1 \1.txt 或者c: \1.txt

错误的表示:Device\HarddiskVolume1\1.txt 或者:c:\1.txt注意:

命令重起后生效,并且下次重起FBWF为开启状态才能执行。8.将FBWF覆盖缓冲区的文件写入磁盘(将改变的文件写入磁盘保存)

FbwfMgr /commit \Device\Harddisklume1 \1.txt

//将Device\HarddiskVolume1\1.txt 从FBWF覆盖缓冲区写入磁盘(重起后1.txt不会复位)

也可以这样写

FbwfMgr /commit c: \1.txt

//将Device\HarddiskVolume1\1.txt从FBWF覆盖缓冲区写入磁盘(重起后1.txt不会复位)

成功返回:

Changes made to file \1.txt on volume C: are committed.

注意:不支持文件夹和通配符(*.*)。

(使用通配符发现返回下列错误:测试的时候发现FbwfMgr failed: Windows 无法找到网络路径。请确认网络路径正确并且目标计算机不忙或已关闭。如果 Windows 仍然无法找到网络路径,请与网络管理员联系。)

不支持在FBWF开启后新建的文件。根目录除外。

不支持在FBWF豁免列表的文件, 9.放弃FBWF覆盖缓冲区的文件缓冲。

FbwfMgr /restore \Device\Harddisklume1 \1.txt

//放弃Device\HarddiskVolume1\1.txt 文件在FBWF覆盖缓冲区的内容(1.txt文件会立即复位)

也可以这样写

FbwfMgr /restore c: \1.txt

//放弃Device\HarddiskVolume1\1.txt文件在FBWF覆盖缓冲区的内容(1.txt文件会立即复位)

成功返回:

Changes made to file \1.txt on volume C: are committed.

注意:不支持文件夹和通配符(*.*)。

(使用通配符发现返回下列错误:测试的时候发现FbwfMgr failed: Windows 无法找到网络路径。请确认网络路径正确并且目标计算机不忙或已关闭。 如果 Windows 仍然无法找到网络路径,请与网络管理员联系。)

不支持在FBWF开启后新建的文件。根目录除外。

不支持在FBWF豁免列表的文件, 10.察看详细的FBWF覆盖缓冲使用情况

FbwfMgr / overlaydetail

成功返回:

Overlay detail for each protected volume:

\Device\HarddiskVolume1:

//驱动器号:\Device\HarddiskVolume1:

file

1: name \Documents and Settings\Administrator\Application Data\Microsoft\Windows\Themes\Custom.theme

cache size 2544, open handle 0

//文件号码、完整路径

//占用缓存大小、是否被打开。

file

2: name \Documents and Settings\Administrator\Application Data\Microsoft\CryptnetUrlCache\MetaData\60E31627FDA0A46932B0E5948949F2A5

cache size 418, open handle 0

file

3: name \Documents and Settings\Administrator\Application Data\Microsoft\CryptnetUrlCache\MetaData\A8FABA189DB7D25FBA7CAC806625FD30

cache size 427, open handle 0

file

4: name \Documents and Settings\Administrator\Application Data\Microsoft\CryptnetUrlCache\Content\60E31627FDA0A46932B0E5948949F2A5

cache size 1133, open handle 0

file

5: name \Documents and Settings\Administrator\Application Data\Microsoft\CryptnetUrlCache\Content\A8FABA189DB7D25FBA7CAC806625FD30

cache size 63014, open handle 0

file

6: name \Documents and Settings\Administrator\Cookies\index.dat

cache size 364, open handle 1

……

file 194: name \WINDOWS\SchedLgU.Txt

cache size 454, open handle 1

file 195: name \WINDOWS\setupapi.log

cache size 48648, open handle 0

file 196: name \WINDOWS\setupact.log

cache size 1264, open handle 0

file 197: name \WINDOWS\Installer\89f0c.msi

cache size 2342814, open handle 0

file 198: name \WINDOWS\Installer\{3B410500-1802-488E-9EF1-4B11992E0440}\ARPPRODUCTICON.exe

cache size 16053, open handle 0

file 199: name \WINDOWS\Installer\{3B410500-1802-488E-9EF1-4B11992E0440}\1033.MST

cache size 7471, open handle 0

file 200: name \1.txt

cache size 428, open handle 1

Memory consumed by directory structure: 1864 KB

Memory consumed by file data: 17897 KB

//目录占用缓存大小。

//文件占用缓存大小。10.改变FBWF覆盖缓冲容量。

fbwfmgr

/setthreshold 128

//设置FBWF覆盖缓冲容量为128MB(16MB-1024MB)。

成功返回:

Overlay cache threshold will be 128 MB after the next reboot.

注意:命令重起后生效11.设置是否压缩覆盖缓存

FbwfMgr /setcompression 1

//开启压缩覆盖缓存

成功返回:

Overlay cache will be compressed after the next reboot.

FbwfMgr /setcompression |0

//关闭压缩覆盖缓存

成功返回:

Overlay cache will not be compressed after the next reboot.

注意:开启压缩覆盖缓存后预分配覆盖缓存自动关闭,命令重起后生效

12.设置是否预分配压缩覆盖缓存

FbwfMgr /setpreallocation 1

//开启预分配覆盖缓存

成功返回:

Overlay cache will be pre-allocated after the next reboot.

FbwfMgr /setpreallocation 0

//关闭预分配覆盖缓存

成功返回:

Overlay cache will not be pre-allocated after the next reboot.

注意:开启预分配覆盖缓存后压缩覆盖缓存自动关闭,命令重起后生效。

13.设置FBWF覆盖缓存容量显示是虚拟模式还是实际模式。

FbwfMgr /setsizedisplay 1

//开启虚拟模式,在虚拟模式下覆盖缓存的可用容量=被写保护驱动器显示的可用容量。

例如C驱动器被写保护, C驱动器还有128MB的可用空间即表示覆盖缓存还有128MB可用。

成功返回:

Size Display set to virtual mode.

//开启虚拟模式

FbwfMgr /setsizedisplay 0

//开启实际模式

成功返回:

Size Display set to actual mode.

注意:改变模式需要重起后才能生效。

14显示磁盘有效容量。

fbwfmgr /getvirtualsize c:

//显示C驱动器有效容量。

成功返回:

Volume size in bytes: 2,034,651,136

//总容量大小

Volume free size in bytes: 1,055,412,224

//可用容量大小

15.显示磁盘实际可用容量盘。

fbwfmgr /getactualsize c:

//显示C驱动器实际可用容量大小盘。

成功返回:

Volume size in bytes: 8,587,159,552

//总容量大小

Volume free size in bytes: 7,623,450,624

//可用容量大小 psexec下载地址

http://technet.microsoft.com/en-us/Sysinternals/bb897553.aspx


[查看全文]
Bugsong
[FWD]让扫站爆破者一边呆着去,VPS安全设置
展开Biu

本帖最后由 Bugsong 于 2012-12-26 11:47 编辑

原创发表于:让扫站爆破者一边呆着去,VPS安全设置 | 大D综合研究院

原文链接:http://www.dadclab.com/archives/1166

本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。

协议查看链接:http://creativecommons.org/licenses/by-nc-sa/2.5/cn/


大D在老谢的Blog上看到一篇文章。《谁偷走了我的密码?》

说到VPS安全问题。

大D也查看了一下日志,发现也存在爆破者。。。

[root@a1 ~]# cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}'
110.6.178.195=2
128.46.93.59=15
14.160.91.174=178
202.103.30.24=22
219.140.165.85=36
61.253.249.157=90
79.189.102.226=12
91.205.189.27=24

看到如上结果的大D淡定不能了。索性修改SSH端口,禁用直接远程登录Root账户,建立新用户,使用SSH连接时,使用su提升到管理员权限。VPS修改ssh端口22
vi /etc/ssh/sshd_config
找到#port 22
将前面的#去掉,然后修改端口 port 1234

重启服务就OK了

service sshd restart
为增强安全

先增加一个普通权限的用户,并设置密码[backcolor=white !important][size=1em]

然后禁止ROOT远程SSH登录:

vi /etc/ssh/sshd_config

把其中的

PermitRootLogin yes

改为

PermitRootLogin no同时别忘记删除PermitRootLogin前面的#哦~

重启sshd服务service sshd restart

[查看全文]