当前位置:文档之家› C#入门经典笔记

C#入门经典笔记

C#入门经典笔记
C#入门经典笔记

2.2 控制台应用程序

Console.WriteLine("The first app in Beginning C# Programming!");

Console.ReadKey();

2.3 Windows Forms应用程序

Windows 窗体应用程序

显示Form1.cs 中的C#代码(选中Form1.cs,然后点击“视图”--- “代码”,来查看代码)private void button1_Click(object sender, EventArgs e)

{

MessageBox.Show("The first Windows app in the book!");

}

第三章,变量和表达式

以#开头的任意关键字实际上都是一个预处理指令,使用#region 和#endregion 关键字,来定义可以展开和折叠的代码区域的开头和结尾。

3.3 变量

一些变量名称前面的“u”是unsigned 的缩写,表示不能在这些类型的变量中存储负数。

当然,还需要存储浮点数,它们不是整数。可以使用的浮点数变量类型有3 种,float、double和decimal。

decimal关键字指示 128 位数据类型。与浮点型相比,decimal类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。

static void Main(string[] args)

{

int myInteger;

string myString;

myInteger = 17;

myString = "\"myInteger\" is";

Console.WriteLine("{0} {1}.", myString, myInteger);

Console.ReadKey();

}

static void Main(string[] args)

{

double firstNumber, secondNumber;

string userName;

Console.WriteLine("Enter your name:");

userName = Console.ReadLine();

Console.WriteLine("Welcome {0}!", userName);

Console.WriteLine("Now give me a number:");

firstNumber = Convert.ToDouble(Console.ReadLine());

Console.WriteLine("Now give me another number:");

secondNumber = Convert.ToDouble(Console.ReadLine());

Console.WriteLine("The sum of {0} and {1} is {2}.", firstNumber,

secondNumber, firstNumber + secondNumber);

Console.WriteLine("The result of subtracting {0} from {1} is {2}.",

secondNumber, firstNumber, firstNumber - secondNumber);

Console.WriteLine("The product of {0} and {1} is {2}.", firstNumber,

secondNumber, firstNumber * secondNumber);

Console.WriteLine("The result of dividing {0} by {1} is {2}.",

firstNumber, secondNumber, firstNumber / secondNumber);

Console.WriteLine("The remainder after dividing {0} by {1} is {2}.",

firstNumber, secondNumber, firstNumber % secondNumber);

Console.ReadKey();

}

~ 用户输入

~类型转换

用户输入使用与前面Console.WriteLine()命令类似的语法。但这里使用Console.ReadLine()。这个命令提示用户输入信息,并把它们存储在string 变量中。

string userName;

Console.WriteLine("Enter your name:");

userName = Console.ReadLine();

Console.WriteLine("Welcome {0}!", userName);

这段代码直接将已赋值变量userName 的内容写到屏幕上。

这个示例还读取了两个数字,下面略微展开讨论一下。因为Console.ReadLine()命令生成一个字符串,而我们希望得到一个数字,所以这就引入了类型转换的问题。

对Console.ReadLine()得到的字符串使用命令Convert.ToDouble(),把字符串转换为double 类型。

总结:

1、输出:Console.WriteLine("Welcome {0}!", userName);

2、输入:userName = Console.ReadLine();

3、类型转换:firstNumber = Convert.ToDouble(Console.ReadLine());

4、用name.ToLower()把输入的姓名转换为小写。

5、注意这里使用的是Console.Write(),而不是Console.WriteLine(),因为每次输出一个字符时,并不需要从一个新行开始。

第四章

4.1 布尔逻辑

使用Convert.ToInt32()从字符串输入中得到一个整数。Convert.ToInt32()是另一个类型转换命令,与前面使用的Convert.ToDouble()命令属于同一系列。

4.1.2 按位运算符

例如,考虑下面代码中的操作:

int result, op1, op2;

op1 = 4;

op2 = 5;

result = op1 & op2;

这里必须考虑op1 和op2 的二进制表示方式,它们分别是100 和101。比较这两个表达方式中相同位置上的二进制数字,得出结果,如下所示:

1、如果op1 和op2 最左边的位都是1,result 最左边的位就是1,否则为0。

2、如果op1 和op2 次左边的位都是1,result 次左边的位就是1,否则为0。

3、继续比较其他的位。

在这个示例中,op1 和op2 最左边的位都是1,所以result 最左边的位就是1。下一个位都是0,第3 个位置上的位分别是1 和0,则result 第2~3 个位都是0。最后,结果的二进制值是100,即结果是4。以下是这个过程:

如果使用| 运算符,将进行相同的过程,但如果操作数中相同位置上的位有一个是1,其结果位就是1,如下所示:

^运算符的用法与此相同。如果操作数中相同位置上的位有且仅有一个是1,其结果位就是1,如表4-7 所示。

C#中还可以使用一元位运算符~,它将操作数中的位取反,其结果应是操作数中位为1 的,在结果中就是0,反之亦然,如表4-8 所示。

4.4.4 循环的中断

1、break——立即终止循环。

2、continue——立即终止当前的循环(继续执行下一次循环)。

3、goto——可以跳出循环,到已标记好的位置上(如果希望代码易于阅读和理解,最好不要使用该命令)。

4、return——跳出循环及其包含的函数(参见第6 章)。

5、break 命令可退出循环,继续执行循环后面的第一行代码,例如:

int i = 1;

while (i <= 10)

{

if (i == 6)

break;

Console.WriteLine("{0}", i++);

}

这段代码输出1~5 的数字,因为break 命令在i 的值为6 时退出循环。

continue 仅终止当前的循环,而不是整个循环,例如:

int i;

for (i = 1; i <= 10; i++)

{

if ((i % 2) == 0)

continue;

Console.WriteLine(i);

}

在上面的示例中,只要i 除以2 的余数是0,continue 语句就终止当前的循环,所以只显示数字1、3、5、7 和9。

第五章变量的更多内容

5.1.3 使用Convert命令进行显式转焕

定义枚举

可以使用enum 关键字来定义枚举,如下所示:

enum

{

,

,

,

...

}

接着声明这个新类型的变量:

;

并赋值:

= .;

枚举使用一个基本类型来存储,枚举类型可以提取的每个值都存储为该基本类型的一个值,默认情况下该类型为int。在枚举声明中添加类型,就可以指定其他基本类型:

enum :

{

,

,

,

...

}

枚举的基本类型可以是byte、sbyte、short、ushort、int、uint、long 和ulong。

在默认情况下,每个值都会根据定义的顺序(从0 开始),自动赋给对应的基本类型值。这意味着的值是0,的值是1,的值是2 等。

5.2.2 结构

下一个要介绍的变量类型是结构(struct,structure 的简写)。结构就是由几个数据组成的数据结构,这些数据可能具有不同的类型。根据这个结构,可以定义自己的变量类型。

定义结构

使用struct 关键字来定义结构,如下所示:

struct

{

}

部分包含变量的声明(称为结构的数据成员),其格式与往常一样。每个成员的声明都采用如下形式:

;

要让调用结构的代码访问该结构的数据成员,可以对使用关键字public,例如:

struct route

{

public orientation direction;

public double distance;

}

定义了结构类型后,就可以定义新类型的变量,来使用该结构:

route myRoute;

还可以通过句点字符访问这个组合变量中的数据成员:

myRoute.direction = orientation.north;

myRoute.distance = 2.5;

总结:枚举中的成员必须是同一类型的,要么是int型,要么是double型或其

它类型(除了string 外))。而结构体中的成员可以是不同类型,可以有int型,string型等,要让调用结构的代码访问该结构的数据成员,可以使用关键字public。

5.2.3 数组

1. 声明数组

以下述方式声明数组:

[] ;

其中,可以是任何变量类型,包括本章前面介绍的枚举和结构类型。数组必须

在访问之前初始化,不能像下面这样访问数组或给数组元素赋值:

int[] myIntArray;

myIntArray[10] = 5;

数组的初始化有两种方式。可以以字面形式指定数组的完整内容,也可以指定数组的大小,再使用关键字new 初始化所有数组元素。

使用字面值指定数组,只需要提供一个用逗号分隔的元素值列表,该列表放在花括号中,

例如:

int[] myIntArray = { 5, 9, 10, 2, 99 };

另一种方式需要使用下述语法:

int[] myIntArray = new int[5];

这里使用关键字new 显式地初始化数组,用一个常量值定义其大小。这种方法会给所有的

数组元素赋予同一个默认值,对于数值类型来说,其默认值是0。也可以使用非常量的变量

来进行初始化,例如:

int[] myIntArray = new int[arraySize];

还可以使用这两种初始化方式的组合:

int[] myIntArray = new int[5] { 5, 9, 10, 2, 99 };

使用这种方式,数组大小必须与元素个数相匹配。

2. foreach循环

foreach 循环可以使用一种简便的语法来定位数组中的每个元素:

foreach ( in )

{

// can use for each element

}

这个循环会迭代每个元素,依次把每个元素放在变量中,且不存在访问非法元素的危险。不需要考虑数组中有多少个元素,并可以确保将在循环中使用每个元素。使用这个循环,可以修改上一个示例中的代码,如下所示:

这段代码的输出结果与前面的示例完全相同。使用这种方法和标准的for 循环的主要区别在于:foreach 循环对数组内容进行只读访问,所以不能改变任何元素的值。

3. 多维数组

像这样的二维数组可以声明如下:

[,] ;

多维数组只需要更多的逗号,例如:

[,,,] ;

该语句声明了一个4 维数组。赋值也使用类似的语法,用逗号分隔大小。要声明和初始化二维数组hillHeight,其基本类型是double,x 的大小是3,y 的大小是4,则需要:

double[,] hillHeight = new double[3,4];

还可以使用字面值进行初始的赋值。这里使用嵌套的花括号块,用逗号分隔开,例如:double[,] hillHeight = { { 1, 2, 3, 4 }, { 2, 3, 4, 5 }, { 3, 4, 5, 6 } };

这个数组的维度与前面的相间,也是3 行4 列。通过提供字面值隐式定义了这些维度。

要访问多维数组中的每个元素,只需指定它们的索引,并用逗号分隔开,例如:

hillHeight[2,1]

foreach 循环可以访问多维数组中的所有元素,其方式与访问一维数组相同,例如:

double[,] hillHeight = { { 1, 2, 3, 4 }, { 2, 3, 4, 5 }, { 3, 4, 5, 6 } };

foreach (double height in hillHeight)

{

Console.WriteLine("{0}", height);

}

4. 数组的数组

上一节讨论的多维数组可称为矩形数组,这是因为每一行的元素个数都相同。可以使用锯

齿数组(jagged array),其中每行都有不同的元素个数。为此,需要有这样一个数组,其中

的每个元素都是另一个数组。也可以有数组的数组的数组,甚至更复杂的数组。但是,注

意这些数组都必须有相同的基本类型。

声明数组的数组,其语法要在数组的声明中指定多个方括号对,例如:

int[][] jaggedIntArray;

但初始化这样的数组不像初始化多维数组那样简单,例如不能采用以下的声明方式:jaggedIntArray = new int[3][4];

也不能使用下面的代码:

jaggedIntArray = { { 1, 2, 3 }, { 1 }, { 1, 2 } };

有两种方式:可以初始化包含其他数组的数组(为了清晰起见,称之为子数组),然后依次

初始化于数组:

jaggedIntArray = new int[2][];

jaggedIntArray[0] = new int[3];

jaggedIntArray[1] = new int[4];

也可以使用上述字面值赋值的一种改造形式:

jaggedIntArray = new int[3][] { new int[] { 1, 2, 3 }, new int[] { 1 },new int[] { 1, 2 } };

也可以进行简化,把数组的初始化和声明放在同一行上,如下所示:

int[][] jaggedIntArray = { new int[] { 1, 2, 3 }, new int[] { 1 }, new int[] { 1, 2 } };

对锯齿数组可以使用foreach 循环,但通常需要使用嵌套方法,才能得到实际数据。例如,

假定下述锯齿数组包含10 个数组,每个数组又包含一个整数数组,其元素是1~10 的约数:int[][] divisors1To10 = { new int[] { 1 },

new int[] { 1, 2 },

new int[] { 1, 3 },

new int[] { 1, 2, 4 },

new int[] { 1, 5 },

new int[] { 1, 2, 3, 6 },

new int[] { 1, 7 },

new int[] { 1, 2, 4, 8 },

new int[] { 1, 3, 9 },

new int[] { 1, 2, 5, 10 } };

下面的代码会失败:

foreach (int divisor in divisors1To10)

{

Console.WriteLine(divisor);

}

过是因为数组divisors1To10 包含int[]元素,而不是int 元素。必须循环每个子数组和数组本身:

foreach (int[] divisorsOfInt in divisors1To10)

{

foreach(int divisor in divisorsOfInt)

{

Console.WriteLine(divisor);

}

}

可以看出,使用锯齿数组的语法要复杂得多!在大多数情况下,使用矩形数组比较简单,

这是一种比较简单的存储方式.

5.3 字符串的处理

string 类型变量可以看作是char 变量的只读数组。这样,可以使用下面的语法访问每个字符:string myString = "A string";

char myChar = myString[1];

但是,不能用这种方式为各个字符赋值。为了获得一个可写的char 数组,可以使用下面的

代码,其中使用了数组变量的ToCharArray()命令:

string myString = "A string";

char[] myChars = myString.ToCharArray();

接着就可以采用标准方式处理char 数组了。也可以在foreach 循环中使用字符串,例如:foreach (char character in myString)

{

Console.WriteLine("{0}", character);

}

与数组一样,还可以使用myString.Length 获取元素的个数。其他的基本字符串处理技巧采

用与这个.ToCharArray()命令类似的格式使用命令。两个简单但很有效的命令是

.ToLower()和.ToUpper()。它们可以分别把字符串转换为大写或小写形式。

要明白为什么它们非常有用,可以考虑下面的情形:要检查用户的某个响应,例如字符串yes。如果可以把用户输入的字符串转换为小写形式,就也能检查字符串YES、Yes、yeS 等,第4 章介绍了这样一个示例:

string userResponse = Console.ReadLine();

if (userResponse.ToLower() == "yes")

{

// Act on response.

}

注意,这个命令与本节的其他命令一样,并没有真正改变应用它的字符串。把这个命令与

字符串合并使用,就会创建一个新的字符串,以便与另一个字符串进行比较(如上所述),

或者赋给另一个变量。该变量可能与当前操作的变量相同,例如:

userResponse = userResponse.ToLower();

如果用户无意间在输入内容的前面或后面添加了额外的空格,会怎样?此时,上述代码就

不起作用了。这就需要删除输入字符串中的空格,此时可以使用.Trim()命令来处理。string userResponse = Console.ReadLine();

userResponse = userResponse.Trim();

if (userResponse.ToLower() == "yes")

{

// Act on response.

}

使用该命令,还可以检测如下的字符串:

" YES"

"Yes "

也可以使用这些命令删除其他字符,只要在一个char 数组中指定这些字符即可,例如:

char[] trimChars = {' ', 'e', 's'};

string userResponse = Console.ReadLine();

userResponse = userResponse.ToLower();

userResponse = userResponse.Trim(trimChars);

if (userResponse == "y")

{

// Act on response.

}

这将从字符串的前面或后面删除所有空格、字母e 和s。如果字符串中没有其他字符,就会

检测以下字符串:

"Yeeeees"

" y"

还可以使用.TrimStart()和.TrimEnd()命令。它们可以把字符串的前面或后面

的空格删掉。这些命令也需要指定char 数组。

还有另外两个字符串命令可以处理字符串的空格:.PadLeft()和.PadRight()。它们可以在字符串的左边或右边添加空格,使字符串达到指定的长度。其语法如下:

.PadX();

例如:

myString = "Aligned";

myString = myString.PadLeft(10);

这将在myString 中把3 个空格添加到单词Aligned 的左边。这些方法可以用于在列中时齐字

符串,特别适用于放置包含数字的字符串。

与修整命令一样,还可以按照第二种方式使用这些命令,即提供要添加到字符串上的字符,这需要一个char,而不是像修整命令那样指定一个char 数组。例如:

myString = "Aligned";

myString = myString.PadLeft(10, '-');

这将在myString 的开头加上3 个短横线。

例子:分割字符串

示例的说明

在这段代码中,要注意两点。第一点是所使用的新字符串命令,第二点是使用了自动完成

功能。使用命令.Split()把string 转换为string 数组,把它在指定的位置分隔开。这些

位置采用char数组的形式,在本例中该数组只有一个元素,即空格字符:

char[] separator = {' '};

下面的代码把字符串在每个空格处分解开时,会得到其子字符串,即得到包含单个单词的

数组:

string[] myWords;

myWords = myString.Split(separator);

接着使用foreach 循环迭代这个数组中的单词,并把这些单词写到控制台上:

foreach (string word in myWords)

{

Console.WriteLine("{0}", word);

}

第六章函数

6.1 定义和使用函数

static void Write()

{

Console.WriteLine("Text output from function.");

}

函数定义由以下几部分组成:

1、两个关键字:static 和void

2、函数名后跟圆括号,如Write()

3、一个要执行的代码块,放在花括号中

关键字static 与面向对象的概念相关,本书在后面讨论。现在只需记住,在本节的应用程序中所使用的所有函数都必须使用这个关键字。而void 更容易解释,这个关键字表明函数没有返回值。

注意:在控制台应用程序时,才是这样定义函数。如果是Windows窗体应用程序和https://www.doczj.com/doc/ea14479658.html, 空Web应用程序函数方法则是这样定义的:private string ShowVideo(string floor);

类方法则是:public static int GetCount();public static List GetList()

6.1.1 返回值

当函数返回一个值时,可以采用以下两种方式修改函数:

1、在函数声明中指定返回值的类型,但不使用关键字void。

2、使用return 关键字结束函数的执行,把返回值传递给调用代码。

在执行到return 语句时,程序会立即返回调用代码。这个语句后面的代码都不会执行。但是,这并不意味着return 语句只能放在函数体的最后一行。可以在前边的代码里使用return,也可能在执行了分支逻辑之后使用。把return 语句放在for 循环、if 块或其他结构中

会使该结构立即终止,函数也立即终止。例如:

static double GetVal()

{

double checkVal;

// CheckVal assigned a value through some logic (not shown here).

if (checkVal < 5)

return 4.7;

return 3.2;

}

根据checkVal 的值,将返回两个值中的一个。这里唯一的限制是return 语句必须在函数的

闭合花括号} 之前处理。下面的代码是不合法的:

static double GetVal()

{

double checkVal;

// CheckVal assigned a value through some logic.

if (checkVal < 5)

return 4.7;

}

如果checkVal >= 5,就不会执行到return 语句,这是不允许的。所有的处理路径都必须执行

到return 语句。

最后需要注意的是,return 可以用在通过void 关键字声明的函数中(没有返回值)。如果这么做,函数就会立即终止。以这种方式使用return 语何时,在return 关键字和其后的分号之间

提供返回值是错误的。

6.1.2 参数

class Program

{

static int MaxValue(int[] intArray)

{

int maxVal = intArray[0];

for (int i = 1; i < intArray.Length; i++)

{

if (intArray[i] > maxVal)

maxVal = intArray[i];

}

return maxVal;

}

static void Main(string[] args)

{

int[] myArray = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2 };

int maxVal = MaxValue(myArray);//关注数组的传递方式

Console.WriteLine("The maximum value in myArray is {0}",

maxVal);

Console.ReadKey();

}

}

2. 参数数组

C#允许为函数指定一个(只能指定一个)特定的参数,这个参数必须是函数定义中的最后一个参数,称为参数数组。参数数组可以使用个数不定的参数调用函数,可以使用params 关键字定义它们。

3. 引用参数和值参数

本章迄今定义的所有函数都带有值参数。其含义是,在使用参数时,是把一个值传递给函数使用的一个变量。对函数中此变量的任何修改都不影响函数调用中指定的参数。例如,下面的函数使传递过来的参数值加倍,并显示出来:

static void ShowDouble(int val)

{

val *= 2;

Console.WriteLine("val doubled = {0}", val);

}

参数val 在这个函数中被加倍,如果按以下方式调用它:

int myNumber = 5;

Console.WriteLine("myNumber = {0}", myNumber);

ShowDouble(myNumber);

Console.WriteLine("myNumber = {0}", myNumber);

输出到控制台上的文本如下所示:

myNumber = 5

val doubled = 10

myNumber = 5

把myNumber 作为一个参数,调用ShowDouble()并不影响Main()中myNumber 的值,即使赋予val 的参数被加倍,myNumber 的值也不变。

这很不错,但如果要改变myNumber 的值,就有问题。可以使用一个为myNumber 返回新值的函数:

static int DoubleNum(int val)

{

val *= 2;

return val;

}

并使用下面的代码调用它:

int myNumber = 5;

Console.WriteLine("myNumber = {0}", myNumber);

myNumber = DoubleNum(myNumber);

Console.WriteLine("myNumber = {0}", myNumber);

但这段代码一点也不直观,且不能改变用作参数的多个变量值(因为函数只有一个返回值)。此时可以通过“引用”传递参数。即函数处理的变量与函数调用中使用的变量相同,而不

仅仅是值相同的变量。因此,对这个变量进行的任何改变都会影响用作参数的变量值。为此,只需使用ref 关键字指定参数:

static void ShowDouble(ref int val)

{

val *= 2;

Console.WriteLine("val doubled = {0}", val);

}

在函数调用中(这是必须的,因为ref 参数是函数签名的一部分)再次指定它:

int myNumber = 5;

Console.WriteLine("myNumber = {0}", myNumber);

ShowDouble(ref myNumber);

Console.WriteLine("myNumber = {0}", myNumber);

输出到控制台的文本如下所示:

myNumber = 5

val doubled = 10

myNumber = 10

这次,myNumber 被ShowDouble()修改了。

用作ref 参数的变量有两个限制。首先,函数可能会改变引用参数的值,所以必须在函数调

用中使用“非常量”变量。所以,下面的代码是非法的:

const int myNumber = 5;

Console.WriteLine("myNumber = {0}", myNumber);

ShowDouble(ref myNumber);

Console.WriteLine("myNumber = {0}", myNumber);

其次,必须使用初始化过的变量。C#不允许假定ref 参数在使用它的函数中初始化,下面的代码也是非法的:

int myNumber;

ShowDouble(ref myNumber);

Console.WriteLine("myNumber = {0}", myNumber);

4 输出参数

除了按引用传递值之外,还可以使用out 关键字,指定所给的参数是一个输出参数。out 关键字的使用方式与ref 关键字相同(在函数定义和函数调用中用作参数的修饰符)。实际上,它的执行方式与引用参数完全一样,因为在函数执行完毕后,该参数的值将返回给函数调用中使用的变量。但是,存在一些重要区别。

1、把未赋值的变量用作ref 参数是非法的,但可以把未赋值的变量用作out 参数。

2、另外,在函数使用out 参数时,out 参数必须看作是还未赋值。

即调用代码可以把已赋值的变量用作out 参数,存储在该变量中的值会在函数执行时丢失。例如,考虑前面返回数组中最大值的MaxValue()函数,略微修改该函数,获取数组中最大值的元素索引。为简单起见,如果数组中有多个元素的值都是这个最大值,只提取第一个最大值的索引。为此,修改函数,添加一个out 参数,如下所示:

static int MaxValue(int[] intArray, out int maxIndex)

{

int maxVal = intArray[0];

maxIndex = 0;

for (int i = 1; i < intArray.Length; i++)

{

if (intArray[i] > maxVal)

{

maxVal = intArray[i];

maxIndex = i;

}

}

return maxVal;

}

可以采用以下方式使用该函数:

int[] myArray = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2 };

int maxIndex;

Console.WriteLine("The maximum value in myArray is {0}",

MaxValue(myArray, out maxIndex));

Console.WriteLine("The first occurrence of this value is at element {0}",maxIndex + 1);

软件破解入门教程

先教大家一些基础知识,学习破解其实是要和程序打交道的,汇编是破解程序的必备知识,但有可能部分朋友都没有学习过汇编语言,所以我就在这里叫大家一些简单实用的破解语句吧! ---------------------------------------------------------------------------------------------------------------- 语句:cmp a,b //cmp是比较的意思!在这里假如a=1,b=2 那么就是a与b比较大小. mov a,b //mov是赋值语句,把b的值赋给a. je/jz //就是相等就到指定位置(也叫跳转). jne/jnz //不相等就到指定位置. jmp //无条件跳转. jl/jb //若小于就跳. ja/jg //若大于就跳. jge //若大于等于就跳. 这里以一款LRC傻瓜编辑器为例,讲解一下软件的初步破解过程。大家只要认真看我的操作一定会!假如还是不明白的话提出难点帮你解决,还不行的话直接找我!有时间给你补节课!呵呵! 目标:LRC傻瓜编辑器杀杀杀~~~~~~~~~ 简介:本软件可以让你听完一首MP3歌曲,便可编辑完成一首LRC歌词。并且本软件自身还带有MP3音乐播放和LRC歌词播放功能,没注册的软件只能使用15天。 工具/原料 我们破解或给软件脱壳最常用的软件就是OD全名叫Ollydbg,界面如图: 它是一个功能很强大的工具,左上角是cpu窗口,分别是地址,机器码,汇编代码,注释;注释添加方便,而且还能即时显示函数的调用结果,返回值. 右上角是寄存器窗口,但不仅仅反映寄存器的状况,还有好多东东;双击即可改变Eflag的值,对于寄存器,指令执行后发生改变的寄存器会用红色突出显示. cpu窗口下面还有一个小窗口,显示当前操作改变的寄存器状态. 左下角是内存窗口.可以ascii或者unicode两种方式显示内存信息. 右下角的是当前堆栈情况,还有注释啊. 步骤/方法 1. 我们要想破解一个软件就是修改它的代码,我们要想在这代码的海洋里找到我们破解关键的代码确实很棘 手,所以我们必须找到一定的线索,一便我们顺藤摸瓜的找到我们想要的东东,现在的关键问题就是什么

新手photoshop知识归纳总结 笔记一(初学者的宝典)

一、快捷键 全部快捷键 Ctl+鼠标左键移动选定区域 Ctl+A选择整体图片 Ctl+B 色彩平衡 Ctl+D 取消选择 Ctl+E 向下合并一个图层 Ctl+F 重复使用上一个滤镜 Ctl+J 复制图层 Ctl+L 色阶 Ctl+N 新建文件 Ctl+O 打开 Ctl+T 自由变换 Ctl+shfit+I 反选 Ctl+shfit+D 反选 Ctl+shfit+N 新建透明图层 Ctl+shfit+E 合并可见图层 Ctl+Shift+T 复制一个选区内容并变换选区 Ctl+U 色相/饱和度 Ctl+R 调出标尺 Ctl+I 反向 Ctl+“+”放大屏幕图像(等同于Ctl+空格,配合鼠标)Ctl+“-”缩小屏幕图像(等同于Alt+空格,配合鼠标)Ctl+【当前图层上翻一页 Ctl+】当前图层上翻一页 Ctl+Enter 将路径变为选区 Ctl+shift+Alt+B 调整为黑白模式 Alt+Delete 填充前景色 Ctl +Delete 填充背景色 Ctl+Alt+A羽化 Ctl+Alt+Z 多步返回 Ctl+Alt+W 关闭全部窗口 Ctl+shift+M 进入IR中编辑 Shift+E 向下合并一个图层 Shift+Tab 隐藏出工具栏外的所有调板 Ctl+1 红通道 Ctl+2 绿通道 Ctl+3 蓝通道 快捷键整理

选择:Ctl+A选择整体图片 Ctl+D 取消选择 Ctl+shfit+I 反选 Ctl+Alt+~ 选择高光区域 Ctl+Alt+0 显示照片的实际尺寸 Ctl+Alt+鼠标拖动复制当前层或选取内容 Ctl+shfit+ Alt+E 实现印盖命令 单键键整理 Home 定位图片左上角 End 定位图片右下角 Pg up/dn 将定位上翻和下翻 A路径选择 B 画笔 C 剪裁 D 默认前景和背景 E 画笔 F 窗口放大和缩小 G 油漆桶 H 抓手工具 I 取样点 J 橡皮擦 K 切片 L 套索 M 羽化 N 注释工具 O 加深或减淡 P 钢笔(caps lock 可以出现十字定位光标) Q 快速进入/退出模板 R 模糊和锐化 S 图章 T 文字 U 度量 V 移动 W 魔术棒 X 前景和背景互换 Y历史画笔 Z 放大或缩小 二、概念论述 图像的模式? 灰度模式:扔掉颜色信息的一种模式,是有损的。

Linux基本反汇编结构与GDB入门

Linux下的汇编与Windows汇编最大的不同就是第一个操作数是原操作数,第二个是目的操作数,而Windows下却是相反。 1、基本操作指令 简单的操作数类型说明,一般有三种, (1)立即数操作数,也就是常数值。立即数的书写方式是“$”后面跟一个整数,比如$0x1F,这个会在后面的具体分析中见到很多。 (2)寄存器操作数,它表示某个寄存器的内容,用符号Ea来表示任意寄存器a,用引用R[Ea]来表示它的值,这是将寄存器集合看成一个数组R,用寄存器表示符作为索引。 (3)操作数是存储器引用,它会根据计算出来的地址(通常称为有效地址)访问某个存储器位置。用符号Mb[Addr]表示对存储在存储器中从地址Addr开始的b字节值的引用。通常可以省略下标b。 图1表示有多种不同的寻址模式,一个立即数偏移Imm,一个基址寄存器Eb,一个变址或索引寄存器Ei和一个伸缩因子s。有效地址被计算为Imm+R[Eb]+R[Ei]*s,对于这中寻址方式,我们可以在数组或者结构体中进行对元

注:操作数可以是立即数值、寄存器值或是来自存储器的值,伸缩因子必须是1、2、4、或者是8。从上面的图我们就可以大致了解操作数的类型了。 在操作指令中,最频繁使用的指令是执行数据传送的指令。对于传送指令的两个操作数不能都指向存储器位置(我的理解是一般存储器存储的都是地址,不能够对地址和地址进行操作)。将一个值从一个存储器位置拷到另一个存储器位置需要两条指令——第一条指令将源值加载到寄存器中,第二条将该寄存器值写入到目的位置。下面给出源操作数和目的操作数的五种可能组合。 1、movl $0x4050, %eax 立即数——寄存器 2、movl %ebp, %esp 寄存器——寄存器 3、movl (%edi, %ecx), %eax 存储器——寄存器 4、movl $-17, (%esp) 立即数——存储器 5、movl %eax, -12(%ebp) 寄存器——存储器 注意这里的指令mov可能有不同的形式,不同平台的汇编一般是有些不一样的, 结合例子来进行讲解一下指令的具体操作,在这里将会正式接触到Linux下的GCC开发环境和GDB调试器,不过都是比较简单的应用。我的Linux操作系统是Ubuntu9.10,其它版本的差别应该不大, 如果我们要编写一个程序,我们可以用Linux下自带的vi或vim编辑器,studyrush@studyrush-desktop:~/C$ vi exchange.c vi 后面加我们要创建的程序文件的名字,在这里是exchange.c studyrush@studyrush-desktop:~/C$ gcc -o exchange exchange.c gcc -o exchange exchange.c 或gcc exchange –o exchange这两者都可以对源文件进行编译,-o exchange 表示对我们要输出的文件名称,可能表达的不够准确,大家可以先熟悉一下gcc编译器,应该就会明白的了。 studyrush@studyrush-desktop:~/C$ ./exchange 点加斜线再加输出文件名就表示运行程序,下面是运行的结果。 a = 3, b = 4

photoshop学习笔记

photoshop学习笔记

Photoshop学习笔记 这篇笔记的内容是对Photoshop这款软件操作知识的学习整理。目的是使自己系统的掌握Photoshop软件使用,提升软件操作能力。 这篇笔记的内容分为三个部分,即概括介绍部分、软件基础学习部分、软件归纳学习部分。 “概括介绍”部分,概括说明Photoshop软件功能,同时介绍本篇笔记的内容结构,及说明学习软件的方法。 “软件基础学习”部分,系统的、详细的介绍软件的各个功能。 “软件归纳学习”部分,在对有一个基本了解后,根据软件的使用流程,将软件的各个功能分门别类,使用概括归纳的方法学习软件,加深对软件的记忆。 第一部分概括介绍 Photoshop,简称“PS”。是一个由Adobe Systems开发和发行的图像处理软件,

Photoshop主要处理以像素所构成的数字图像。不能直接编辑非位图文件,但是可将非位图文件导入到Photoshop软件内,转换为位图文件后再进行编辑修改。是同类产品中的佼佼者。 我们可以将“ps”软件理解为一个工具,通过这个工具可以得到我们想要的图片文件,拿着这个图片文件就可以制作印刷品或是上传到网络了。 既然是工具,那就会有一个使用方法,这里将这样概括软件的使用流程。 第一步是开启软件,开启软件后还要在软件里建立一个工作区,利用这款软件的众多功能,在工作区里绘制图形。工作区就像是画布,我们在软件这间画室里可以铺开若干张画布。第二步就是在这张画布上绘画了。第三步就是将这张画布保存起来,或是日后继续画,或是拿去制作印刷品、上传网络。 这样概括软件的使用流程看起来很简单,但是很有用,根据这个“流程”,我们可以将“ps”软件众多的、复杂的功能归纳为简单的几种类型。这也是这篇笔记里使用的学习方法,即将

汇编语言入门教程

汇编语言入门教程 2007-04-29 22:04对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK 出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS 段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。

敬伟PS学习笔记

制作文化衫 填充前景色的快捷键Alt+Delete 填充背景色的快捷键Ctrl+Delete 蚂蚁线内的区域叫做选区按住shift键画椭圆时画出的是正圆 做填充时候也要新建一个图层 简单的合成(抠图换背景) 快速选择工具 放大Ctrl+ 缩小Ctrl- 平移空格键 撤销上一步Ctrl+Alt+z 返撤销上一步shift+Alt+z 先用较小的比例来画,放大了处理一些边缘。 快捷键Alt键可以快速的将添加模式切换为减去模式 调整优化选区调整边缘平滑7 羽化2 对比度12 移动边缘-24 输出到新建图层 调整图片的大小编辑自由变换按住shift来调整图片的大小不会使比例走形 换脸 在图层蒙版里面白色代表显示,黑色代表消失在蒙版里面也可以选定一个区域填充白色或

黑色让它显示或消失编辑》自由变换》可以改变图片的大小与方向把不透明度调低一点来调整图片的大小与角度 擦脸的时候画笔硬度0要选择比较软的画笔 色 RGB颜色模式(红绿蓝) 夏天变秋天图像》调整》色相|饱和度把绿色的色相变为黄色 画优酷图标 描边是从边缘向里面延伸的宽度 画有颜色的三角形圆形矩形用形状工具 居中的时候把所有的全选然后点击两个居中 画圆环的时候用描边工具画实心圆的时候用填充工具 复制:拖拽这个图层到新建图层的图标上 W和H之间的图标是用来锁定长宽比例的 高光+蒙版+黑白渐变工具做出立体的感觉 黑白渐变:从黑到白的渐变就是一个从遮挡到不遮挡的一个过程

渐变工具+shift键可以画一个垂直方向的渐变 画两个同心圆环(小圆环在大圆环里面)的方法:1画出第一个再复制它2改变大小再做两个对齐3改变描边的大小 海报 网页的头图大海报,950x480像素 做彩带的步骤:先缩小文档再用椭圆工具填充,再移动椭圆,按delete键删除重合的那一部分,可以使用自由变换工具调整一下彩带。按住Alt键再复制一条,然后使用填充改变一下他的颜色。填充的时候按一下锁定后面的第一个按钮,就可以只填充这个蓝色条,否则就整块屏幕都被填充了。 使用蒙版填充遮挡较大的区域时可以用椭圆选框工具填充黑色,这样比较快。 扣水杯(绿色的杯子如何变透明)

OllyDBG完美教程

关键词:OD、OllyDBG、破解入门、调试专用工具、反汇编 一、OllyDBG 的安装与配置 OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了。汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可: OllyDBG 中各个窗口的功能如上图。简单解释一下各个窗口的功能,更详细的内容可以参考 TT 小组翻译的中文帮助: 反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。用鼠标左键点击注释标签可以切换注释显示的方式。

寄存器窗口:显示当前所选线程的 CPU 寄存器内容。同样点击标签寄存器 (FPU) 可以切换显示寄存器的方式。 信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。 数据窗口:显示内存或文件的内容。右键菜单可用于切换显示方式。 堆栈窗口:显示当前线程的堆栈。 要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下 OllyDBG 就可以生效了。 启动后我们要把插件及 UDD 的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签: 因为我这里是把 OllyDBG 解压在 F:\OllyDBG 目录下,所以相应的 UDD 目录及插件目录按图上配置。还有一个常用到的标签就是上图后面那个字体,在这里你可以更改 OllyDBG 中显示的字体。上图中其它的选项可以保留为默认,若有需要也可以自己修改。修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动 OllyDBG。在这个对话框上点确定,重新启动一下 OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。有人可能知道插件的作用,但对那个 UDD 目录

ps课堂笔记总结

一、Photoshop 1、由美国Adobe公司生产的专业图像处理及图像合成软件 二、基本术语 1、图像与图形 -图像:由像素点组成 分辨率:表示像素的密度 (网页,显示器)72像素/英寸,300像素/英寸(平面设计、打印)-图形:由数学公式表示的线条 特点:放大后清楚 矢量图制作软件:illustrator 2、颜色模式 -一种模式对应一种媒介 -HSB:基于人眼 H:表示色向 S:表示饱和度 B:表示明暗度 -RGB:基于显示器、发光体 R:红、G:绿、B:蓝 三原色分别有0~255种级别的强弱 红=绿=蓝0 黑255 白其它不同级别的灰 255最大级的情况下:红+绿=?红+蓝=?绿+蓝=?

-CMYK:基于油墨 洋红、黄、青三种油墨K表示黑色 三、启动软件 四、界面介绍 1、标题栏 2、工具栏(放置常用工具) 3、属性栏(不同工具属性不同) 4、工作区 缩放:Ctrl+加号/减号 抓手:空格+拖动鼠标(移动视图) 5、浮动面板 窗口/工作区/……还原默认工作区 6、常用快捷键 -Tab:显示及隐藏工具栏和浮动面板 -F:全屏切换 五、选区、图层、蒙板?** 1、选区:选框以内,注:所有操作均在选区内实现 2、图层:上下层叠关系的透明纸张 注:有在新层中作图的好习惯 3、蒙板:选区以外为蒙板 ——————————————————————————————————一、文件命令 1、新建

设置对应的纸张大小、颜色模式等 2、打开 直接将文件拖入窗口中即可打开 双击界面空白处选择文件进行打开 3、保存文件 常见格式: PSD:PS源文件,默认格式,信息全,方便于备份 Jpg:通用有损压缩格式 Tif:质量好,信息全,适用于要求高的作品 Png:质量好,支持透明 二、选区的创建* 技巧: 配合Shift定比例、配合Alt定中心、配合空格固化1、规则类 -矩形、椭圆形、单行、单列 拖动即可创建 2、不规则类 -套索工具组 *套索工具:拖动鼠标任意绘制选区 *多边形套索工具:单击定点连直线、双击首尾迸连 Detele:删除最近点、ESC:取消所有 注:配合缩放和抓手工具进行抠图

PHOTOSHOP完美笔记(珍藏版、宝典)

PHOTOSHOP笔记 枫月雅著 一、概述: 1、名称及产品商:(计算机软件名称不允许被汉化) Photoshop 5.0 1996年在美国推出(比较成熟的一个版本) Photoshop 7.0 目前在西安普遍使用的一个版本 2、作用:原创(杜绝手写板,杜绝“画”)、处理、合成 3、原理:多层渲染 4、内容:造型、色彩、调子(明暗)、质感、主题、空间、氛围、版式。 补充:空间指:高度、深度、味觉、时间、宽度、心理、视觉、听力。枫月雅 图的不完整性具备心理空间。 位图是点阵图的一种。 5、性质:点阵图 6、特点:大(PSD格式)可润色软件(润色:一种色调向另一种色调柔和过渡) 二、系统优化: 课外知识补充:a、查看属性(热键):Alt + 双击 b、判断PHOTOSHOP是不是好版本,一个很重要的方法:文件—最近打开文件(R)注意:如果没有后缀“(R)”,表示版本不太好。 c、通道:总量是24个通道,复合通道除外。注意:要在PHOTOSHOP7.0中 一般分为:复合通道(例:CMYK通道、RGB通道) 分色通道(例:R通道、G通道、B通道)枫月雅 专色通道 Alpha通道 d、苹果电脑简称:MAC 一般电脑简称:PC e、选区大小(在图层中任意选择的选区的大小):热键:F8 f、缺省状态:就是指默认状态 1、物理内存的更改:热键:CTRL+K – CTRL+8 更改物理内存用量。注意:更改物理内存使量后,必须重启后,命令才能生枫月雅效。这次更改是在编辑下的预设菜单里。 2、虚拟内存(暂存盘)的更改:热键:CTRL+K – CTRL+7 更改虚拟内存用量。注意:更改虚拟内存使量后,必须重启后,命令才能生效。这次更改是在编辑下的预设菜单里。 3、剪贴版清理:步骤:编辑–清理–历史记录注意:剪贴版占用的是物理内存

OllyICE反汇编教程及汇编命令详解

OllyICE反汇编教程及汇编命令详解[转] 2009-02-11 08:09 OllyICE反汇编教程及汇编命令详解 内容目录 计算机寄存器分类简介 计算机寄存器常用指令 一、常用指令 二、算术运算指令 三、逻辑运算指令 四、串指令 五、程序跳转指令 ------------------------------------------ 计算机寄存器分类简介: 32位CPU所含有的寄存器有: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。 对低16位数据的存取,不会影响高16位的数据。 这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。 程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。 寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、除、输入/输出等操作,使用频率很高; 寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器ECX称为计数寄存器(Count Register)。 在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数; 寄存器EDX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。 在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果, 而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。 2、变址寄存器 32位CPU有2个32位通用寄存器ESI和EDI。 其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。 寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,

PS经典教程 oeasy教你玩转ps笔记

感谢https://www.doczj.com/doc/ea14479658.html,/shamuobaiyang/blog_151429685.html整理 Oeasy ps 教程1开场白 PS的应用 --------------------------------------- oeasy PS视频教程02 分辨率 新建:打开软件,文件-新建。 分辨率:什么叫分辨率呀?在图像里面有,图像大小,单击。新建可以设置,中途同样可以改, 像素大小,:宽度高度。是显示器对应的。 文档大小:是打印,印刷出来的大小。单位厘米。 分辨率:每个英寸里面有多少个像素。 多少合适:打印照片:PPI:300;网页:72ppi ; 扫描底片,上千。根据不同需求确定ppi大小。

视图里边有一个像素长宽比,可以设置。自定义长宽比,因子是6,变的很款。因子是0.6,图像变的很高。 矢量图形,位图图像。 图像文件的格式:文件-存储为,下拉里面有格式。 怎样才能把图像压的很低,又拉的很大不变形:图层-双击,确定。变成一个普通图型。--在图层里面 -智能对象,就变成了类似矢量图行的。取消————图层-智能对象-删格式化。 智能对象缩放不变形,;普通图层时,可以使用滤镜笔刷等效果。------------------------------------------- oeasy PS视频教程03----查看各种颜 色(人眼的模型)Shi --就是色彩模式,是新建时本质的东西。 颜色:一、H 什么颜色 -色相、色调 -。二、S饱和度、鲜艳不鲜艳。三、I亮度、深浅。(SHI颜色模式)。 可见光-这边是红的-超过了就是红外线。那边是紫的,超过了,就是紫外线。 *色相的改变

OllyDbg入门完全教程(完美排版)

OllyDbg完全教程 目录 第一章概述 (1) 第二章组件 (5) 一、一般原理[General prnciples] (5) 二、反汇编器[Disassembler] (8) 三、分析器[Analysis] (9) 四、Object扫描器[Object scanner] (12) 五、Implib扫描器[Implib scanner] (12) 第三章 OllyDbg的使用 (13) 一、如何开始调试[How to start debugging session] (13) 二、CPU 窗口[CPU window] (14) 三、断点[Breakpoints] (14) 四、数据窗口[Dump] (15) 五、可执行模块窗口[Executable modules window] (16) 六、内存映射窗口[Memory map window] (17) 七、监视与监察器[Watches and inspectors] (19) 八、线程[Threads] (19) 九、调用栈[Call stack] (20) 十、调用树[Call tree] (21) 十一、选项[Options] (21) 十二、搜索[Search] (22) 十三、自解压文件[Self—extracting (SFX) files] (22) 十四、单步执行与自动执行[Step—by—step execution and animation] (23) 十五、Hit跟踪[Hit trace] (23) 十六、Run 跟踪[Run trace] (24) 十七、快捷键 (26) 十八、插件[Plugins] (29) 十九、技巧提示[Tips and tricks] (29) 第四章其他功能 (30) 一、调试独立的DLL[Debugging of stand—alone DLLs] (30) 二、解码提示[Decoding hints] (32) 三、表达式赋值[Evaluation of expressions] (32) 四、自定义函数描述[Custom function descriptions] (34)

李涛PS教程(提高篇)整理后笔记

一、画笔 1.理解画笔重要的参数:间距!所有绘画中的线都是用点构成的。形状动态、散度、平滑,是画笔调整面板中使用最广的参数之三。形态中,角度抖动中的根据方向抖动很重要,会根据画笔的方向来抖动。散度,基本上用两轴选项。 2.在使用橡皮图章工具进行修复图片时,为了保持不破坏原始素材,则可以新建图层,然后勾选样本-当前和下方图层,即可在新建的透明图层上绘制了。画笔加橡皮图章工具,可以做出很酷的纹理的效果感。调间距,开形态,定义压力,角度抖动为方向,开散布 3.画笔中,白就是透明的,灰色是半透明度的。 4.图层编组:ctrl+G。曲线,上弦往上拉是亮度,下弦往下是暗度。 5.阴影要做到两层或三层才比较逼真。选中主体形状然后填充黑色,按照需要的光源做斜切和透视,然后利用高斯模糊来虚化。下层阴影高斯模糊小一些,上层大一些。 6.通过正反打对画面主体做聚焦,四角暗淡的做法(突出主体),先做选区,新建调整图层-曲线,上弦曲线打亮主体正打,然后选中蒙版,执行滤镜-模糊-高斯模糊,半径选到最大或是稍微小一点;然后再反打(即变暗),同样曲线命令做下弦,可以选择直接将正打蒙版复制过来,然后ctrl+i反向命令。替换图层蒙版:先选中源蒙版,再按alt建,移动到目标位置。复制+替换:则是先按alt 健。 二、抠像 1.绝大多数是时候,通道是用来抠像的。抠像,大致分三个情况。1st,从清晰轮廓中抠出;2nd,复杂轮廓中抠出;3rd,从半透明中抠出。 2.针对清晰轮廓的抠像方法:上等方法为:用路径+混合剪贴法;中等方法用路径、画笔、调整轮廓灯;下等方法是用选择工具。复杂轮廓:上等方法:通道+混合剪贴法;中等方法是用调整边缘的;下等方法用选择工具。半透明工具:上等方法通道+画笔+混合剪贴法;中等调整边缘;下等方法用选择工具。混合剪贴法可去除时间一切杂边。 3.调整边缘是抽出滤镜的升级啊。所有选择工具都有这条命令。建立选区之后,才能使用调整边缘命令。调整边缘面板,半径是指边缘线的内外半径值。建议打开智能半径,以避免让清晰轮廓处出现半透明状态。平滑,控制线条。在像素低的时候,可以用羽化。减少原片环境光时,可以调低移动边缘命令,叫收边。再勾选净化颜色。可以再黑白通道中,看到细节。灰色显示有半透明的地方(本不该有)则生成带通道的图层蒙版,在蒙版中(按住Alt键进入蒙版编辑模式)用画笔(白色)去修改。修改后删除蒙版,则保存了透明层,然后锁定透明图层,用黑色画笔刷边缘,则可把毛发刷出来。之后,可新建图层,用1px画笔添加头发丝。

反汇编 第二节 常用汇编指令

——啊冲 第二节常用汇编指令 说明:汇编语言也是一门语言,其指令相当的多,非常丰富,在此我只介绍几个常用的、简单的汇编指令,让大家与我一同入门。其实在超多的计算机知识领域里我和大家一样只是个学生而已。所以,我所要求的同学级别(本视频所针对的对象)是:有一点编程经验,对反汇编感兴趣、零基础的朋友。 堆栈操作指令PUSH和POP ?格式: PUSH XXXX ?POP XXXX ?功能: 实现压入操作的指令是PUSH指令;实现弹出操作的指令是POP指令. ? 加减法操作add和sub指令 ?格式: ADD XXXX1,XXXX2 ?功能: 两数相加 ?格式: SUB XXXX1,XXXXX2 ?功能: 两个操作数的相减,即从OPRD1中减去OPRD2,其结果放在OPDR1中.

调用和返回函数CALL和RET(RETN) ?过程调用指令CALL ?格式: CALL XXXX ?功能: 过程调用指令 ?返回指令RET ?格式: RET ?功能: 当调用的过程结束后实现从过程返回至原调用程序的下一条指令,本指令不影响标志位. ? 数据传送MOV 格式: MOV XXXX1,XXXX2 ?功能: 本指令将一个源操作数送到目的操作数中,即XXXX1<--XXXX2. ? 逻辑异或运算XOR ?格式: XOR OPRD1,OPRD2 ?功能: 实现两个操作数按位‘异或’运算,结果送至目的操作数中. ? 逻辑或指令OR ?格式: OR OPRD1,OPRD2 ?功能: OR指令完成对两个操作数按位的‘或’运算,结果送至目的操作数中,本指令可以进行字节或字的‘或’运算.

有效地址传送指令LEA ?格式: LEA OPRD1,OPRD2 ?功能: 将源操作数给出的有效地址传送到指定的的寄存器中. ?实际上,有时候lea用来做mov同样的事情,比如赋值: ?Lea edi,[ebp-0cch] ? 字符串存储指令STOS ?格式: STOS OPRD ?功能: 把AL(字节)或AX(字)中的数据存储到DI为目的串地址指针所寻址的存储器单元中去.指针DI将根据DF的值进行自动调整. ?说明:在VC的DEBUG版里经常用来为局部变量空间写上cccccccc指令 ? 比效指令CMP(CoMPare) ?格式: CMP OPRD1,OPRD2 ?功能: 对两数进行相减,进行比较. ?说明:经常与跳转指令相配合来形成循环或跳出操作 ? 跳转指令JXX ?JMP:无条件转移指令

PS笔记完整版

基本: 1.画布比较小的时候,分辨率改成300而不是70,使画面更精细。 2.1英寸=2.54厘米 30像素/英寸:1英寸长度内包含了30个像素点即1平方英寸内包含了900 个像素点 3.宣传页一般300分辨率。做展板等大东西不要太高分辨率,否则运行慢 4.位图(点阵图)放大会模糊,但是很逼真,矢量图虽然不会模糊但是不逼真 填色: 1.填充前景色的快捷键Alt+Delete或退格 2.选好背景色Ctrl+Delete或退格 3.X键前景色背景色切换 4.D键前景色和背景色回到默认前黑后白 羽化: 1.羽化值必须在划选区之前设置好,已经画好了选区,再换羽化值是没用的,除非用”选择-修改-羽化”(此处为叠加值,即之前如果选了30羽化,这次再选10羽化,那就是40羽化),快捷键shift+F6。 存储选区: 1.点“从选区中减去“按钮,制造月牙 2.移动的时候按着空格(此时移动鼠标,第二选区会移动但不会变大小),松开鼠标会得到月牙 3.“选择-存储选区(alt+s+v)-命名“可以ctrl+D取消选区 4.“选择-载入选区(alt+s+o)”勾选“反相”的话会出现保存的选区的反选 5.Ctrl+shift+I 反选 画笔 1.正片叠底直接在背景上话有叠加效果 2.画笔是前景色 3.颜色替换笔能替换背景图的部分颜色 4.用历史记录画笔可以把图片抹回最初状态 5.历史记录艺术画笔是用照片原本的颜色进行涂抹 图层的复制、自由变化

1.ctrl+r 标尺可以拖动出标尺线 2.shift正圆 alt从圆心开始画圆 3.画第二个圆的时候,鼠标对着圆心,但出现的不是在圆心的圆,这时候先画,在按一次shift+alt,圆 会自动到圆心且为正圆 4.画完可以把标尺导线拉回去(shift+ctrl) 5.创建新图层后在填色不要直接填在背景里 6.拖住往创建图层一放完成复制或者ctrl+j 7.以上是原位复制。移动复制为alt+拖动鼠标 8.自由变换ctrl+t 9.高级复制:原位复制后,点ctrl+t 移动或缩小。按shift+alt+ctrl+t可以按轨迹(移动和缩小的轨迹)复 制多个 仿制图章 1.打开一个图片,编辑-定义图案,就可以把它变成图章,在其他图片上涂抹 画图形 1.移动选区:按住空格调 2.Shift 加选 3.Shift+alt 交集 魔棒 1.容差:色彩的容差,数值越大,容忍色彩差异越大 2.连续:勾选之后只能选取连成一片的,不勾选的话可以选图片上所有的即使分离的块 3.要加选(按shift)的时候,被加选的相较于之前的,与周围色块颜色差异较小时,需要把容差调小 再选 橡皮擦 1.抹到历史记录,则可以还原被擦的 2.背景橡皮擦:选好不想被擦除的(前景)和想被擦除的(背景),选好容差,再擦 吸管 1.右击吸管选标尺拉一条线在图边缘按图像-旋转图像-任意角度把图转回正的(以前是歪的)自由变换 1.ctrl+e 向下合并图层 2.自由变换时可以斜切缩放做立方体 3.变换右键选垂直翻转再调整做倒影(倒影通过调整图层不透明度实现),选择倒影的顶端一部分 做羽化使之更逼真

IDA实例教程详解

IDA实例教程详解 作者:笨笨雄(转载) 1 软件环境 静态分析有很多好处,例如加壳的程序(尽管对于高手来说这并不会耗费太多时间),我们不需要寻找OEP,也不需要解除自校验,只要修复IAT,DUMP下来就可以动手分析了。假如你需要修改程序,可以使用内存补丁技术。动态与静态,调试器与反汇编器结合可以简化分析任务,帮助我们理解代码。因此掌握一种反汇编器是非常必要的。IDA可以说是这方面的首选工具,它为我们提供了丰富的功能,以帮助我们进行逆向分析。这从IDA复杂的工作界面便可以知道。 种类繁多的工具栏 在分辨率不高的情况,这些工具栏与反汇编窗口挤在小屏幕里,看起来不爽。我一般把它关闭(查看=>工具栏=>主工具栏)以获得更好的视觉效果。当我们需要这些功能的时候,直接使用快捷键就可以了。下面是常用快捷键的清单: 快捷键功能注释 C转换为代码一般在IDA无法识别代码时使用 这两个功能整理代码 D转换为数据 A转换为字符 N为标签重命名方便记忆,避免重复分析。 ;添加注释

在工具栏下面的便是工作窗口。主要的窗口分页有“IDA View-A”、“Name”、“Strings”、“Exports”和“Imports”。对于后面3项相信大家都不会陌生了,它们分别是字符参考,输出函数参考和输入函数参考。Name是命名窗口,在那里可以看到我们命名的函数或者变量。这四个窗口都支持索引功能,可以通过双击来快速切换到分析窗口中的相关内容,使用起来十分方便。

简单输入几个字符即可定位目标 IDA View-A是分析窗口,支持两种显示模式,除了常见的反汇编模式之后,还提供图形视图以及其他有趣的功能。 IDA的反汇编窗口 一般我们在分析的时候,并不关心程序的机械码,所以IDA为我们自动隐藏了这些信息。如果你有需要,可以通过以下步骤来设置:

ps笔记

时1,二维合成 2 线性;天正导出线稿要有粗细之分 3 图片拖进PS时按住不送,拖进去在送;就是新的图片。在拖进时想形成新的另一张新的图片是,需拉倒 工具栏下边 Ctrl+alt+z连退20 步 色阶ctrl+L 色的反向互补色ctrl+i【黑线变白色】加滤色【混合模式】【去黑留白】 正片叠地【去白留黑】 4 填图时从大到小,从远往近做 创建新的图层 删除图层键或delete

选区;1抠图 2隔离只对选区内有效 在PS中想要Ctrl+c或v必须要有选区 Ctrl+j原味复制 移动+Alt拖动 1选择【移动】工具选择是图层移动2选区1规则选区按住SHIFT绘制正圆或正方 2不规则选区 多边形套索双击自动闭合 按住ctrl+shift+i反向小三角是有隐藏的项 3魔棒选择颜色相同或相似的连续选择性需要勾 不勾时选择该图层所有颜色相同或相似

相似性容差控制相似度 容差;控制相似度。容差越大相似度越底选择范围越 大 容差越小相似度越底选择范围越小 【ps中选择哪个图层变蓝】Ctrl+D取消选区蚂蚁线消失backspace 蚂蚁线退回上一步空格键是抓手工具 变换;Ctrl+T 按住Shift 加选按住Alt 缩放时;从四个顶角同时按住SHIFT等比缩放 按住Alt 以中心缩放 Alt 和shift 同时按即中心又等比 图层移动ctrl+左中括号下移一层,ctrl+左中括号+shift至于底层 ctrl+右中括号上移一层,ctrl+右中括号+shift至于顶层 在PS中想要Ctrl+c或v 必须要有选区 Ctrl+j原味复制 移动+Alt 拖动 Crtl+E合并所选图层或自动向下合并一层

汇编语言入门教程

汇编语言入门教程2007-04-29 22:04对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K 的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag

相关主题
相关文档 最新文档