2007年11月2日 星期五

VB圖像處理之圖像的亮度對比度調整

  在圖像處理中,恐怕大家最熟悉的就是對於圖像的亮度和對比度調整了。
  前面一定也有很多人寫過這樣的文章了,但是想把我的這個系列作一個完整的小結,我就再囉嗦一番了。
  還是以24位色圖像為例子,每種色彩都可以用0-255,一共256種深度來表示。如果我們把它畫在一個二維坐標上,正好是一條直線。
  比如我們將像素的色深作為橫坐標,輸出色深作為縱坐標的畫,正好是一條經過原點(0,0)的45度斜線。


   如圖中直線A所表示的,角T為45度,表示它的對比度正好為1。那麼很容易就可以寫出它的直線方程:Out = In * 1 ,係數1就是對比度的概念如果把條直線加上一個偏移量變成B,那麼它的直線方程就成為:Out = In * 1 + (ab) 偏移量(ab)就是亮度的增量。
  只要有初中的代數知識就很容易看出它滿足一條直線方程:Y= A * X + B。
   但是,我們這裡要處理的情況稍微有些不同,在圖像處理中,對比度和亮度要分別對待。不能因為改變而改變亮度,因為我們習慣上把灰色(127,127)這 一點作為中心點。比如,我們加大了對比度,原來的直線A就變成如直線D所表示的,在改變了對比度的同時,也增加了亮度(ab),而我們心目中的變化應該是 入直線C那樣。也就是說,我們把(127,127)這一點映射成了坐標系的原點。
  那麼我們就要把原來的直線公式修改成:Y=( X - 127 ) * A + B + 127。A表示對比度,B表示亮度增量。我們驗證一下:只要亮度增量 B=0,無論怎麼改變對比度 A,該直線始終通過中心點(127,127),也就是說改變對比度的同時,亮度沒有改變。
  由此,我們就可以推導出顏色的對比度亮度計算公式了:

NewRed = (OldRed -127 ) * A + 127+ B
NewGreen = (OldGreen -127 ) * A + 127+B
NewBlue = (OldBlue -127 ) * A + 127+B

  現在你是否已經準備著手用這個公式來寫出你自己的亮度對比度子程序了呢?
  慢著,再多做一步吧。我們是在遍程序,不是在做初中代數考試。這多出來的一步將使你的程序的執行效率更高一些。
  我們把上面的公式再推導一下:

  Y=( X - 127 ) * A + B + 127 => Y = X * A - 127 * A + 127+B (1)
  令:B = B -127 * A +127 (2)

  由上面(1),(2)兩步,得到一個新的公式:Y = X * A + B
  咦?怎麼又變回來了??
  是的公式的形式確實是變回來了,不過B所代表的東西已經不同了。
  或許你又會說我這是多此一舉,請聰明的讀者想像一下:在一個普通的圖片做亮度對比度運算的時候,我們上面這些小小的變化將帶來什麼樣的效率提升。假設一張圖片大小是1027*768
  一共有786432個像素,而每個像素又要分別計算紅綠藍三種顏色。
  那麼,上述這個公式就需要計算786432 * 3 = 2359296 次,經過這麼多次運算的放大,哪怕是小小的一個重複計算都將浪費很長的時間。
  因為在調用子程序的時候亮度和對比度都已經確定,那麼B = B -127 * A +127這一步就可以放在循環的外面先作好。從而減少了程序的運算時間。
  下面給出我的程序,以供參考:

Public Sub BrightnessAndContrast(ByVal RedOffset As Long, ByVal GreenOffset As Long, ByVal BlueOffset As Long, Optional ByVal RedContrast As Single = 1, Optional ByVal GreenContrast As Single = 1, Optional ByVal BlueContrast As Single = 1)
 Dim X As Long
 Dim Y As Long
 Dim MidR As Integer
 Dim MidG As Integer
 Dim MidB As Integer
 Dim Max As Long
 On Error GoTo ErrLine
 Done = False
 TimeFilter = timeGetTime
 MidR = RedOffset - 127 * (RedContrast - 1) '計算新的位移量B
 MidG = GreenOffset - 127 * (GreenContrast - 1)
 MidB = BlueOffset - 127 * (BlueContrast - 1)
 Max = 255
 For X = 0 To OutPutWid
  For Y = 0 To OutPutHei
   R = ColOut(2, X, Y)
   G = ColOut(1, X, Y)
   B = ColOut(0, X, Y)
   R = R * RedContrast + MidR '計算Y = X * A + B
   G = G * GreenContrast + MidG
   B = B * BlueContrast + MidB
   If R > Max Then R = Max '輸出值判斷是否在0到255之間
   If R < 0 Then R = 0
   If G > Max Then G = Max
   If G < 0 Then G = 0
   If B > Max Then B = Max
   If B < 0 Then B = 0
   ColOut(2, X, Y) = R
   ColOut(1, X, Y) = G
   ColOut(0, X, Y) = B
  Next
 Next
 Done = True
 TimeFilter = timeGetTime - TimeFilter
 Exit Sub
ErrLine:
 MsgBox Err.Description
 Done = True
End Sub

  因為在亮度對比度的過程中會出現計算值超出(0,255)的範圍,因此需要對它做一個判斷,把結果限定在這個範圍之內。
  這個程序很簡單,可以根據給定的紅綠藍的亮度偏移量和對比度參數計算。由於把三種顏色的6個參數分開,也可以只調整單獨的一種顏色。
  還有一個好處,就是當你將對比度參數設為負值的時候,可以直接得到原圖片的反色輸出。(這也是將前面的坐標系原點移動到127這一點的一個好處。)
  下面是用我的程序處理得到的效果:
  原圖:


  亮度+20,對比度1.5效果:


  對比度 -1,反相色彩效果:


  作為這個系列的最後一篇文章,我在我的程序ImageCast中所用到的所效果的算法和主要代碼都已經貼出來了。也算是對自己對大家的一個小小交待吧。

2007年11月1日 星期四

直接使用色彩設定

z RGB 色彩有效範圍
y0 16,777,215 (&HFFFFFF&)
z色彩設定 : 4-位元的整數
y高位元數等於 0,而較低的三個位元,從最低到最高顯著的位元組,分別決定了紅、綠、藍三種色彩的數目
y紅、綠、藍三種元件皆使用 0 255 (&HFF) 之間的數值表示
z十六進位數指定色彩語法:
y&HBBGGRR&
y每個部分都是兩位從 00 FF 的十六進位數。中間值為 80
&H808080&
[object.] point (x, y)
z傳回指定位置的色彩值:
PointColor = Point (500, 500)

調整圖形亮度

改變Picture亮度

●這個範例用到的物件有Picture1及Command1(執行命令用)。
●這個範例是利用Point函數來取得RGB顏色數值,用運算式提高或減低數值,然後在原圖以改變後的數值當顏色再重新畫圖。

Private Sub Command1_Click()
  Dim Bright As Integer '亮度
  Bright = 20 '設亮度增20%(若用負數則亮度變暗如-20)
  Picture1.AutoRedraw = True
  For Y = 1 To Picture1.ScaleHeight Step 15
    For X = 1 To Picture1.ScaleWidth Step 15
      Tmp& = Picture1.Point(X, Y)
      If Len(Hex(Tmp&)) < color="blue">Then RS = Right(Hex(Tmp&), 2)
      If Len(Hex(Tmp&)) = 6 Then
        BS = Left(Hex(Tmp&), 2)
        GS = Mid(Hex(Tmp&), 3, 2)
      End If
      If Len(Hex(Tmp&)) = 4 Then
        GS = Left(Hex(Tmp&), 2)
      End If
      If Len(Hex(Tmp&)) > 1 Then R = Val("&H" + RS) Else R = 0
      If Len(Hex(Tmp&)) > 3 Then G = Val("&H" + GS) Else G = 0
      If Len(Hex(Tmp&)) > 5 Then B = Val("&H" + BS) Else B = 0
      If Len(Hex(Tmp&)) = 8 Then R = 1: G = 1: B = 1
      PerC = (100 + Bright) / 100
      R = Fix(R * PerC): G = Fix(G * PerC): B = Fix(B * PerC)
      If R > 255 Then R = 255
      If G > 255 Then G = 255
      If B > 255 Then B = 255
      If R = 0 Then R = Bright
      If G = 0 Then G = Bright
      If B = 0 Then B = Bright
      Picture1.PSet (X, Y), RGB(R, G, B)
    Next
  Next
  Picture1.AutoRedraw = False
End Sub

2007年10月25日 星期四

鍵盤控制

鍵盤是我們使用電腦的一個很重要的輸入設備了,即使在滑鼠大行其道的今天,很多程式依然離不開鍵盤來操作。但是有時候,一些重複性的,很繁瑣的鍵盤操作總會 讓人疲憊,於是就有了用程式來代替人們按鍵的方法,這樣可以把很多重複性的鍵盤操作交給程式來類比,省了很多精力,按鍵精靈就是這樣的一個軟體。那麼我們怎樣才能用VB來寫一個程式,達到與按鍵精靈類似的功能呢?那就讓我們來先瞭解一下windows中回應鍵盤事件的機制。

當用戶按下鍵盤上的一個鍵時,鍵盤內的晶片會檢測到這個動作,並把這個信號傳送到電腦。如何區別是哪一個鍵被按下了呢?鍵盤上的所有按鍵都有一個編碼,稱作鍵盤掃描 碼。當你按下一個鍵時,這個鍵的掃描碼就被傳給系統。掃描碼是跟具體的硬體相關的,同一個鍵,在不同鍵盤上的掃描碼有可能不同。鍵盤控制器就是將這個掃 描碼傳給電腦,然後交給鍵盤驅動程式。鍵盤驅動程式會完成相關的工作,並把這個掃描碼轉換為鍵盤虛擬碼。什麼是虛擬碼呢?因為掃描碼與硬體相關,不具有通 用性,為了統一鍵盤上所有鍵的編碼,於是就提出了虛擬碼概念。無論什麼鍵盤,同一個按鍵的虛擬碼總是相同的,這樣程式就可以識別了。簡單點說,虛擬碼就 是我們經常可以看到的像VK_A,VK_B這樣的常數,比如鍵A的虛擬碼是65,寫成16進制就是&H41,注意,人們經常用16進 制來表示虛擬 碼。當鍵盤驅動程式把掃描碼轉換為虛擬碼後,會把這個鍵盤操作的掃描碼和虛擬碼還有其他資訊一起傳遞給作業系統。然後作業系統則會把這些資訊封裝在一個消 息中,並把這個鍵盤消息插入到消息列隊。最後,要是不出意外的話,這個鍵盤消息最終會被送到當前的活動視窗那裏,活動視窗所在的應用程式接收到這個消息 後,就知道鍵盤上哪個鍵被按下,也就可以決定該作出什麼回應給用戶了。這個過程可以簡單的如下表示:
用戶按下按鍵-----鍵盤驅動程式將此事件傳遞給作業系統-----作業系統將鍵盤事件插入消息佇列-----鍵盤消息被發送到當前活動窗口。接下來可以編程實現在其中的某個環節來類比鍵盤操作了。在VB中,有多種方法可以實現鍵盤類比,我們就介紹幾種比較典型的。

1.局部級類比

從上面的流程可以看出,鍵盤事件是最終被送到活動視窗,然後才引起目的程式響應的。那麼最直接的模擬方法就是:直接偽造一個鍵盤消息發給目的程式。windows提供了幾個這樣的API函數可以實現直接向目的程式發送消息的功能,常用的有SendMessage PostMessage,它們的區別是PostMessage函數直接把消息仍給目的程式就不管了,而SendMessage把消息發出去後,還要等待目標程式返回些什麼東西才好。這裏要注意的是,類比鍵盤消息一定要用PostMessage函數才好,用SendMessage是不正確的(因為類比鍵盤消 息是不需要返回值的,不然目的程式會沒反應),切記切記!PostMessage函數的VB聲明如下:
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
參數hwnd 是你要發送消息的目的程式上某個控制項的控制碼,參數wMsg 是消息的類型,表示你要發送什麼樣的消息,最後wParam lParam 這兩個參數是隨消息附加的資料,具體內容要由消息決定。
再來看看wMsg 這個參數,要類比按鍵就靠這個了。鍵盤消息常用的有如下幾個:
WM_KEYDOWN
表示一個普通鍵被按下
WM_KEYUP
表示一個普通鍵被釋放
WM_SYSKEYDOWN
表示一個系統鍵被按下,比如Alt
WM_SYSKEYUP
表示一個系統鍵被釋放,比如Alt
如 果你確定要發送以上幾個鍵盤消息,那麼再來看看如何確定鍵盤消息中的wParam lParam 這兩個參數。在一個鍵盤消息中,wParam 參數的含義較簡單,它表示你要發送的鍵盤事件的按鍵虛擬碼,比如你要對目的程式模擬按下A鍵,那麼wParam 參數的值就設為VK_A ,至於lParam 這個參數就比較複雜了,因為它包含了多個資訊,一般可以把它設為0,但是如果你想要你的模擬更真實一些,那麼建議你還是設置一下這個參數。那麼我們就詳細瞭解 lParam lParam 是一個long類型的參數,在記憶體中占4個位元組,寫成二進位就是 00000000 00000000 00000000 00000000 一共是32位,我們從右向左數,假設最右邊那位為第0(注意是從0而不是 從1開始計數),最左邊的就是第31位,那麼該參數的的0-15位表示鍵的發送次數等擴展資訊,16-23位元為按鍵的掃描碼,24-31位表示是按下鍵還是釋放鍵。一般習慣寫成16進制的,應該是&H00 00 00 00 ,第0-15位一般為&H0001,如果是按下鍵,那 麼24-31位為&H00,釋放鍵則為&HC0,那麼16-23位元的掃描碼怎麼會得呢?這需要用到一個API函數 MapVirtualKey,這個函數可以將虛擬碼轉換為掃描碼,或將掃描碼轉換為虛擬碼,還可以把虛擬碼轉換為對應字元的ASCII碼。

它的VB聲明如 下:
Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
參 數wCode 表示待轉換的碼,參數wMapType 表示從什麼轉換為什麼,如果是虛擬碼轉掃描碼,則wMapType 設置為0,如果是虛擬掃描碼轉 虛擬碼,則wMapType 設置為1,如果是虛擬碼轉ASCII碼,則wMapType 設置為2.相信有了這些,我們就可以構造鍵盤事件的 lParam參數了。下面給出一個構造lParam參數的函數:
Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long

Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long
'
參數VirtualKey表示按鍵虛擬碼,flag表示是按下鍵還是釋放鍵,用WM_KEYDOWNWM_KEYUP這兩個常數表示
Dim s As String
Dim Firstbyte As String 'lparam
參數的24-31
If flag = WM_KEYDOWN Then '
如果是按下鍵
Firstbyte = "00"
Else
Firstbyte = "C0" '
如果是釋放鍵
End If
Dim Scancode As Long
'
獲得鍵的掃描碼
Scancode = MapVirtualKey(VirtualKey, 0)
Dim Secondbyte As String 'lparam
參數的16-23位元,即虛擬鍵掃描碼
Secondbyte = Right("00" & Hex(Scancode), 2)
s = Firstbyte & Secondbyte & "0001" '0001
lparam參數的0-15位,即發送次數和其他擴展資訊
MakeKeyLparam = Val("&H" & s)
End Function

這個函數像這樣調用,比如按下A鍵,那麼lParam=MakeKeyLparam(VK_A,WM_KEYDOWN) ,很簡單吧。值得注意的是,即使你發送消息時設置了lParam參數的值,但是系統在傳遞消息時仍然可能會根據當時的情況重新設置該參數,那麼目的程式收到的消息中lParam的值可能會 和你發送時的有所不同。所以,如果你很懶的話,還是直接把它設為0吧,對大多數程式不會有影響的,呵呵。
好了,做完以上的事情,現在我們可以向目的程式發送鍵盤消息了。首先取得目的程式接受這個消息的控制項的控制碼,比如目標控制碼是12345,那麼我們來對目標類比按下並釋放A鍵,像這樣:(為了簡單起見,lParam這個參數就不構造了,直接傳0)
PostMessage 12345
WM_KEYDOWNVK_A0& '按下A

PostMessage 12345
WM_UPVK_A0& '釋放A
好了,一次按鍵就完成了。現在你可以迫不及待的打開記事本做實驗,先用FindWindowEx這類API函數找到記事本程式的控制碼,再向它發送鍵盤消息, 期望記事本裏能詭異的自動出現字元。可是你馬上就是失望了,咦,怎麼一點反應也沒有?你欺騙感情啊~~~~~~~~~~55555555555555 不是的哦,接著往下看啊。
一般目的程式都會含有多個控制項,並不是每個控制項都會對鍵盤消息作出反應,只有把鍵盤消息發送給接受它的控制項才會得到期望 的反應。那記事本來說,它的編輯框其實是個edit類,只有這個控制項才對鍵盤事件有反應,如果只是把消息發給記事本的表單,那是沒有用的。現在你找出記事 本那個編輯框的控制碼,比如是54321,那麼寫如下代碼:
PostMessage 54321
WM_KEYDOWNVK_F10& '按下F1
PostMessage 54321
WM_UPVK_F10& '釋放F1
怎麼樣,是不是打開了記事本的幫助資訊?這說明目的程式已經收到了你發的消息,還不錯吧~~~~~~~~
可以馬上新問題就來了,你想模擬向記事本按下A這個鍵,好在記事本裏自動輸入字元,可是,沒有任何反應!這是怎麼一回事呢?

原來,如果要向目的程式發送字元,光靠WM_KEYDOWNWM_UP這兩個事件還不行,還需要一個事件:WM_CHAR,這個消息表示一個字元,程式需 靠它看來接受輸入的字元。一般只有ABC等這樣的按鍵才有WM_CHAR消息,別的鍵(比如方向鍵和功能鍵)是沒有這個消息的,WM_CHAR消息一般發生在WM_KEYDOWN消息之後。WM_CHAR消息的lParam參數的含義與其他鍵盤消息一樣,而它的wParam則表示相應字元的ASCII 編碼(可以輸入中文的),現在你可以寫出一個完整的向記事本裏自動寫入字元的程式了,下面是一個例子,並附有這些消息常數的具體值:
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long

Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
Public Const WM_CHAR = &H102
Public Const VK_A = &H41

Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long
Dim s As String
Dim Firstbyte As String 'lparam
參數的24-31
If flag = WM_KEYDOWN Then '
如果是按下鍵
Firstbyte = "00"
Else
Firstbyte = "C0" '
如果是釋放鍵
End If
Dim Scancode As Long
'
獲得鍵的掃描碼
Scancode = MapVirtualKey(VirtualKey, 0)
Dim Secondbyte As String 'lparam
參數的16-23位元,即虛擬鍵掃描碼
Secondbyte = Right("00" & Hex(Scancode), 2)
s = Firstbyte & Secondbyte & "0001" '0001
lparam參數的0-15位,即發送次數和其他擴展資訊
MakeKeyLparam = Val("&H" & s)
End Function

Private Sub Form_Load()
dim hwnd as long
hwnd = XXXXXX 'XXXXX
表示記事本編輯框的控制碼
PostMessage hwnd,WM_KEYDOWN
VK_AMakeKeyLparam(VK_A,WM_KEYDOWN) '按下A
PostMessage hwnd,WM_CHAR
ASC("A"),MakeKeyLparam(VK_A,WM_KEYDOWN) '輸入字元A
PostMessage hwnd,WM_UP
VK_AMakeKeyLparam(VK_A,WM_UP) '釋放A

End Sub

這就是通過局部鍵盤消息來類比按鍵。這個方法有一個極大的好處,就是:它可以實現後臺按鍵,也就是說他對你的前臺操作不會有什麼影響。比如,你可以用這個方法做個程式在遊戲中類比按鍵來不斷地執行某些重複的操作,而你則一邊喝茶一邊與QQ上的MM們聊得火熱,它絲毫不會影響你的前臺操作。無論目的程式是否獲 得焦點都沒有影響,這就是後臺類比按鍵的原理啦~~~~

2. 全局級模擬

你會發現,用上面的方法類比按鍵並不 是對所有程式都有效的,有的程式啊,你向它發了一大堆消息,可是它卻一點反應也沒有。這是怎麼回事呢?這就要看實際的情況了,有些程式(特別是一些遊戲) 出於某些原因,會禁止用戶對它使用類比按鍵程式,這個怎麼實現呢?比如可以在程式中檢查一下,如果發現自己不是活動視窗,就不接受鍵盤消息。或者仔細檢查一 下收到的鍵盤消息,你會發現真實的按鍵和類比的按鍵消息總是有一些小差別,從這些小差別上,目的程式就能判斷出:這是假的!是偽造的!!因此,如果用 PostMessage發送局部消息類比按鍵不成功的話,你可以試一試全局級的鍵盤消息,看看能不能騙過目的程式。
類比全局鍵盤消息常見的可以有以下一些方法:
(1)
API函數keybd_event,這個函數可以用來類比一個鍵盤事件,它的VB聲明為:
Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
參數bVk表示要類比的按鍵的虛擬碼,bScan表示該按鍵的掃描碼(一般可以傳0)dwFlags表示是按下鍵還是釋放鍵(按下鍵為0,釋放鍵為2)dwExtraInfo是擴展標誌,一般沒有用。比如要模擬按下A鍵,可以這樣:
Const KEYEVENTF_KEYUP = &H2
keybd_event VK_A, 0, 0, 0 '
按下A
keybd_event VK_A, 0, KEYEVENTF_KEYUP, 0 '
釋放A
注意有時候按鍵的速度不要太快,否則會出問題,可以用API函數Sleep來進行延時,聲明如下:
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
參數dwMilliseconds表示延時的時間,以毫秒為單位。
那麼如果要模擬按下功能鍵怎麼做呢?比如要按下Ctrl+C實現拷貝這個功能,可以這樣:
keybd_event VK_Ctrl, 0, 0, 0 '
按下Ctrl
keybd_event VK_C, 0, 0, 0 '
按下C
Sleep 500 '
延時500毫秒
keybd_event VK_C, 0, KEYEVENTF_KEYUP, 0 '
釋放C
keybd_event VK_Ctrl, 0, KEYEVENTF_KEYUP, 0 '
釋放Ctrl
好了,現在你可以試試是不是可以騙過目的程式了,這個函數對大部分的視窗程式都有效,可是仍然有一部分遊戲對它產生的鍵盤事件熟視無睹,這時候,你就要用上 bScan這個參數了。一般的,bScan都傳0,但是如果目的程式是一些DirectX遊戲,那麼你就需要正確使用這個參數傳入掃描碼,用了它可以產生正確的硬體事件消息,以被遊戲識別。這樣的話,就可以寫成這樣:
keybd_event VK_A, MapVirtualKey(VK_A, 0), 0, 0 '
按下A
keybd_event VK_A, MapVirtualKey(VK_A, 0), KEYEVENTF_KEYUP, 0 '
釋放A
以上就是用keybd_event函數來類比鍵盤事件。除了這個函數,SendInput函數也可以類比全局鍵盤事件。SendInput可以直接把一條消息插入到消息佇列中,算是比較底層的了。它的VB聲明如下:
Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long
參數:
nlnprts
:定義plnputs指向的結構的數目。

plnputs
:指向INPUT結構陣列的指標。每個結構代表插人到鍵盤或滑鼠輸入流中的一個事件。
cbSize
:定義INPUT結構的大小。若cbSize不是INPUT結構的大小,則函數調用失敗。
返回值:函數返回被成功地插人鍵盤或滑鼠輸入流中的事件的數目。若要獲得更多的錯誤資訊,可以調用GetlastError函數。
備註:Sendlnput函數將INPUT結構中的事件順序地插入鍵盤或滑鼠的輸入流中。這些事件與用戶插入的(用滑鼠或鍵盤)或調用keybd_eventmouse_event,或另外的Sendlnput插人的鍵盤或滑鼠的輸入流不相容。
嗯,這個函數用起來蠻複雜的,因為它的參數都是指標一類的東西。要用它來類比鍵盤輸入,先要構造一組資料結構,把你要類比的鍵盤消息裝進去,然後傳給它。為了方便起見,把它做在一個過程裏面,要用的時候直接調用好了,代碼如下:
Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Type GENERALINPUT
dwType As Long
xi(0 To 23) As Byte
End Type

Type KEYBDINPUT
wVk As Integer
wScan As Integer
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type

Const INPUT_KEYBOARD = 1

Sub MySendKey(bkey As Long)
'
參數bkey傳入要類比按鍵的虛擬碼即可類比按下指定鍵
Dim GInput(0 To 1) As GENERALINPUT
Dim KInput As KEYBDINPUT
KInput.wVk = bkey '
你要類比的按鍵
KInput.dwFlags = 0 '
按下鍵標誌
GInput(0).dwType = INPUT_KEYBOARD
CopyMemory GInput(0).xi(0), KInput, Len(KInput) '
這個函數用來把記憶體中KInput的資料複製到GInput
KInput.wVk = bkey
KInput.dwFlags = KEYEVENTF_KEYUP '
釋放按鍵

GInput(1).dwType = INPUT_KEYBOARD '
表示該消息為鍵盤消息
CopyMemory GInput(1).xi(0), KInput, Len(KInput)
'
以上工作把按下鍵和釋放鍵共2條鍵盤消息加入到GInput資料結構中
SendInput 2, GInput(0), Len(GInput(0)) '
GInput中存放的消息插入到消息列隊
End Sub

除了以上這些,用全局鉤子也可以類比鍵盤消息。如果你對windows中消息鉤子的用法已經有所瞭解,那麼你可以通過設置一個全局HOOK來類比鍵盤消息,比如,你可以用WH_JOURNALPLAYBACK這個鉤子來類比按鍵。WH_JOURNALPLAYBACK是一個系統級的全局鉤子,它和 WH_JOURNALRECORD的功能是相對的,常用它們來記錄並重播鍵盤滑鼠操作。WH_JOURNALRECORD鉤子用來將鍵盤滑鼠的操作忠實地記錄下來,記錄下來的資訊可以保存到檔中,而WH_JOURNALPLAYBACK則可以重現這些操作。當然亦可以單獨使用 WH_JOURNALPLAYBACK來類比鍵盤操作。你需要首先聲明SetWindowsHookEx函數,它可以用來安裝消息鉤子:
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long,ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
先 安裝WH_JOURNALPLAYBACK這個鉤子,然後你需要自己寫一個鉤子函數,在系統調用它時,把你要模擬的事件傳遞給鉤子參數lParam所指向 的EVENTMSG區域,就可以達到類比按鍵的效果。不過用這個鉤子類比鍵盤事件有一個副作用,就是它會鎖定真實的滑鼠鍵盤,不過如果你就是想在模擬的時候不會受真實鍵盤操作的干擾,那麼用用它倒是個不錯的主意。

3.驅動級模擬

如果上面的方法你都試過了,可是你發現目的程式卻仍然頑固的不接受你類比的消息,寒~~~~~~~~~還好,我還剩下最後一招,這就是驅動級模擬:直接讀寫鍵盤的硬體埠!
有一些使用DirectX介面的遊戲程式,它們在讀取鍵盤操作時繞過了windows的消息機制,而使用DirectInput.這是因為有些遊戲對即時性控制的要求比較高,比如賽車遊戲,要求以最快速度回應鍵盤輸入。而windows消息由於是佇列形式的,消息在傳遞時會有不少延遲,有時1秒鐘也就傳遞 十幾條消息,這個速度達不到遊戲的要求。而DirectInput則繞過了windows消息,直接與鍵盤驅動程式打交道,效率當然提高了不少。因此也就 造成,對這樣的程式無論用PostMessage或者是keybd_event都不會有反應,因為這些函數都在較高層。對於這樣的程式,只好用直接讀寫鍵盤埠的方法來類比硬體事件了。要用這個方法來類比鍵盤,需要先瞭解一下鍵盤編程的相關知識。
DOS時代,當用戶按下或者放開一個鍵 時,就會產生一個鍵盤中斷(如果鍵盤中斷是允許的),這樣程式會跳轉到BIOS中的鍵盤中斷處理程式去執行。打開windows的設備管理器,可以查看到鍵盤控制器由兩個埠控制。其中&H60是資料埠,可以讀出鍵盤資料,而&H64是控制埠,用來發出控制信號。也就是,從& H60號埠可以讀此鍵盤的按鍵資訊,當從這個埠讀取一個位元組,該位元組的低7位元就是按鍵的掃描碼,而高1位則表示是按下鍵還是釋放鍵。當按下鍵時,最高 位為0,稱為通碼,當釋放鍵時,最高位為1,稱為斷碼。既然從這個埠讀數據可以獲得按鍵資訊,那麼向這個埠寫入資料就可以類比按鍵了!用過 QbASIC4.5的朋友可能知道,QB中有個OUT命令可以向指定埠寫入資料,而INP函數可以讀取指定埠的資料。那我們先看看如果用QB該怎麼寫 代碼:
假如你想模擬按下一個鍵,這個鍵的掃描碼為&H50,那就這樣
OUT &H64,&HD2 '
把資料&HD2發送到&H64埠。這是一個KBC指令,表示將要向鍵盤寫入資料
OUT &H60,&H50 '
把掃描碼&H50發送到&H60埠,表示類比按下掃描碼為&H50的這個鍵
那麼要釋放這個鍵呢?像這樣,發送該鍵的斷碼:
OUT &H64,&HD2 '
把資料&HD2發送到&H64埠。這是一個KBC指令,表示將要向鍵盤寫入資料
OUT &H60,(&H50 OR &H80) '
把掃描碼&H50與資料&H80進行或運算,可以把它的高位置1,得到斷碼,表示釋放這個鍵
好了,現在的問題就是在VB中如何向埠寫入資料了。因為在windows中,普通應用程式是無權操作埠的,於是我們就需要一個驅動程式來幫助我們實 現。在這裏我們可以使用一個元件WINIO來完成讀寫埠操作。什麼是WINIOWINIO是一個全免費的、無需註冊的、含根源程式的 WINDOWS2000埠操作驅動程式元件(可以到http://www.internals.com/上 去下載)。它不僅可以操作埠,還可以操作記憶體;不僅能在VB下用,還可以在DELPHIVC等其他環境下使用,性能特別優異。下載該組件,解壓縮後可以看到幾個檔夾,其中Release檔夾下的3個檔就是我們需要的,這3個檔是WinIo.sys(用於win xp下的驅動程式) WINIO.VXD(用於win 98下的驅動程式)WinIo.dll(封裝函數的動態連結程式庫),我們只需要調用WinIo.dll中的函數,然後 WinIo.dll就會安裝並調用驅動程式來完成相應的功能。值得一提的是這個元件完全是綠色的,無需安裝,你只需要把這3個檔複製到與你的程式相同的 檔夾下就可以使用了。用法很簡單,先用裏面的InitializeWinIo函數安裝驅動程式,然後就可以用GetPortVal來讀取埠或者用 SetPortVal來寫入埠了。好,讓我們來做一個驅動級的鍵盤類比吧。先把winio3個檔拷貝到你的程式的檔夾下,然後在VB中新建一個工 程,添加一個模組,在模組中加入下面的winio函數聲明:

Declare Function MapPhysToLin Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysSize As Long, ByRef PhysMemHandle) As Long
Declare Function UnmapPhysicalMemory Lib "WinIo.dll" (ByVal PhysMemHandle, ByVal LinAddr) As Boolean
Declare Function GetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByRef PhysVal As Long) As Boolean
Declare Function SetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysVal As Long) As Boolean
Declare Function GetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByRef PortVal As Long, ByVal bSize As Byte) As Boolean
Declare Function SetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByVal PortVal As Long, ByVal bSize As Byte) As Boolean
Declare Function InitializeWinIo Lib "WinIo.dll" () As Boolean
Declare Function ShutdownWinIo Lib "WinIo.dll" () As Boolean
Declare Function InstallWinIoDriver Lib "WinIo.dll" (ByVal DriverPath As String, ByVal Mode As Integer) As Boolean
Declare Function RemoveWinIoDriver Lib "WinIo.dll" () As Boolean
' ------------------------------------
以上是WINIO函數聲明-------------------------------------------
Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
'-----------------------------------
以上是WIN32 API函數聲明-----------------------------------------

再添加下面這個過程:
Sub KBCWait4IBE() '
等待鍵盤緩衝區為空
Dim dwVal As Long
Do
GetPortVal &H64, dwVal, 1
'
這句表示從&H64埠讀取一個位元組並把讀出的資料放到變數dwVal
'GetPortVal
函數的用法是GetPortVal 埠號,存放讀出資料的變數,讀入的長度
Loop While (dwVal And &H2)
End Sub
上面的是一個根據KBC規範寫的過程,它的作用是在向鍵盤埠寫入資料前等待一段時間,後面將會用到。
然後再添加如下過程,這2個過程用來類比按鍵:

Public Const KBC_KEY_CMD = &H64 '鍵盤命令埠
Public Const KBC_KEY_DATA = &H60 '
鍵盤資料埠

Sub MyKeyDown(ByVal vKeyCoad As Long)
'
這個用來模擬按下鍵,參數vKeyCoad傳入按鍵的虛擬碼
Dim btScancode As Long
btScancode = MapVirtualKey(vKeyCoad, 0)

KBCWait4IBE '
發送資料前應該先等待鍵盤緩衝區為空
SetPortVal KBC_KEY_CMD, &HD2, 1 '
發送鍵盤寫入命令
'SetPortVal
函數用於向埠寫入資料,它的用法是SetPortVal 埠號,欲寫入的資料,寫入資料的長度
KBCWait4IBE
SetPortVal KBC_KEY_DATA, btScancode, 1 '
寫入按鍵資訊,按下鍵
End Sub

Sub MyKeyUp(ByVal vKeyCoad As Long)
'
這個用來模擬釋放鍵,參數vKeyCoad傳入按鍵的虛擬碼
Dim btScancode As Long
btScancode = MapVirtualKey(vKeyCoad, 0)
KBCWait4IBE '
等待鍵盤緩衝區為空
SetPortVal KBC_KEY_CMD, &HD2, 1 '
發送鍵盤寫入命令
KBCWait4IBE
SetPortVal KBC_KEY_DATA, (btScancode Or &H80), 1 '
寫入按鍵資訊,釋放鍵
End Sub

定義了上面的過程後,就可以用它來類比鍵盤輸入了。在表單模組中添加一個計時器控制項,然後加入以下代碼:

Private Sub Form_Load()

If InitializeWinIo = False Then
'
InitializeWinIo函數載入驅動程式,如果成功會返回true,否則返回false
MsgBox "
驅動程式載入失敗
!"
Unload Me
End If
Timer1.Interval=3000
Timer1.Enabled=True
End Sub

Private Sub Form_Unload(Cancel As Integer)
ShutdownWinIo '
程式結束時記得用ShutdownWinIo函數卸載驅動程式
End Sub

Private Sub Timer1_Timer()
Dim VK_A as Long = &H41
MyKeyDown VK_A
MyKeyUp VK_A '
模擬按下並釋放A
End Sub

運行上面的程式,就會每隔3秒鐘模擬按下一次A鍵,試試看,怎麼樣,是不是對所有程式都有效果了?
需要注意的問題:
要在VB的調試模式下使用WINIO,需要把那3個檔拷貝到VB的安裝目錄中。
鍵盤上有些鍵屬於擴展鍵(比如鍵盤上的方向鍵就是擴展鍵),對於擴展鍵不應該用上面的MyKeyDownMyKeyUp過程來模擬,可以使用下面的2個過程來準確模擬擴展鍵:
Sub MyKeyDownEx(ByVal vKeyCoad As Long) '
模擬擴展鍵按下,參數vKeyCoad是擴展鍵的虛擬碼
Dim btScancode As Long
btScancode = MapVirtualKey(vKeyCoad, 0)

KBCWait4IBE '等待鍵盤緩衝區為空
SetPortVal KBC_KEY_CMD, &HD2, 1 '
發送鍵盤寫入命令
KBCWait4IBE
SetPortVal KBC_KEY_DATA, &HE0, 1 '
寫入擴展鍵標誌資訊


KBCWait4IBE '
等待鍵盤緩衝區為空
SetPortVal KBC_KEY_CMD, &HD2, 1 '
發送鍵盤寫入命令
KBCWait4IBE
SetPortVal KBC_KEY_DATA, btScancode, 1 '
寫入按鍵資訊,按下鍵

End Sub

Sub MyKeyUpEx(ByVal vKeyCoad As Long) '模擬擴展鍵彈起
Dim btScancode As Long
btScancode = MapVirtualKey(vKeyCoad, 0)

KBCWait4IBE '等待鍵盤緩衝區為空
SetPortVal KBC_KEY_CMD, &HD2, 1 '
發送鍵盤寫入命令
KBCWait4IBE
SetPortVal KBC_KEY_DATA, &HE0, 1 '
寫入擴展鍵標誌資訊

KBCWait4IBE '
等待鍵盤緩衝區為空
SetPortVal KBC_KEY_CMD, &HD2, 1 '
發送鍵盤寫入命令
KBCWait4IBE
SetPortVal KBC_KEY_DATA, (btScancode Or &H80), 1 '
寫入按鍵資訊,釋放鍵

End Sub

還 應該注意的是,如果要從擴展鍵轉換到普通鍵,那麼普通鍵的KeyDown事件應該發送兩次。也就是說,如果我想模擬先按下一個擴展鍵,再按下一個普通鍵, 那麼就應該向埠發送兩次該普通鍵被按下的資訊。比如,我想模擬先按下左方向鍵,再按下空白鍵這個事件,由於左方向鍵是擴展鍵,空白鍵是普通鍵,那麼流程 就應該是這樣的:
[quote]MyKeyDownEx VK_LEFT '
按下左方向鍵
Sleep 200 '
延時200毫秒
MyKeyUpEx VK_LEFT '
釋放左方向鍵

Sleep 500
MyKeyDown VK_SPACE '
按下空白鍵,注意要發送兩次
MyKeyDown VK_SPACE
Sleep 200
MyKeyUp VK_SPACE '
釋放空白鍵


4.
骨灰級模擬
方法3算是很底層的類比了,我現在還沒有發現有它類比無效的程式。但是如果你用盡上面所有的方法,仍然無效的話,那麼還有最後一個方法,絕對對任何程式都會有效,那就是:把鍵盤拿出來,老老實實地按下去吧。~~~~


2007年10月22日 星期一

Tools for Remote Computing

Tools for Remote Computing

Programs, scripts, and odds-and-ends of things I have developed for remote computing, focusing on Terminal Services primarily. My VNC Tools are on a separate page now.

Note that most of the binaries here were written in VB6 SP5, so the VB6 runtimes are required. Windows XP/.NET systems have the runtimes pre-installed; also, pretty much any Win32 OS is likely to have picked them up except for possibly Win2K servers which have not had many user applications installed.


Full Screen TS Client Wrapper - [2002.10.08]

Fullscreen TS "miniclient" written in VB6. You must have the web client installed to use this.

TsVerOk - [2002.10.07]

This is an oddball executable I wrote while discussing TSVER and the 2600+ series TS clients with Ivo Beerens. It's not incredibly useful for everyday matters, but it does allow you to test for whether the TSVER settings on a server -even if it is currently disabled - would reject the current session based on client version. If tsver.dll is not in your path, put this in the same directory as tsver.

Windows XP Remote Desktop Enable ADM File

A policy template suitable for adding to gpedit for use in controlling Remote Desktop availability from a central location on LANs which use Group Policies.

RDShell

This is a simple little applet to solve the problem of using the StartProgram feature in the client or TS Manager with an application that needs command line parameters - or with any shellable document or script, for that matter.

Specify the path to RDShell as the startup application. Then simply create a file named rdshell.ini in the same folder as RDShell.exe (I included a sample INI file). RDShell will read the file line-by-line, ignoring every line preceded with a comment character (your choice of ;'/ ). RDShell will wait on each line for the application to be closed, then go to the next.

Not only does this let you easily specify a particular document, MMC console, or parameterized EXE to run on connection, it gives you great flexibility since you can use a script in your favorite scripting language to run. You can then do logic control to your hearts content.

TSViewer

Similar to the Config Examiner below (I need a better naming scheme), but this shows a grab-bag of special TS config parameters when run.

Remote Desktop/TS Config Examiner - New!

This is a start on a tool for quickly looking at what your local Remote Desktop system's settings are. It currently shows RDP version, listening port, and whether Remote Desktop or Remote Assistance are enabled. Only a 4K zipped download. It requires the VB6 runtimes, but any system this can be used with already has them installed.

Enable/Disable File Association Changes on TS

This is a script for quickly enabling and then re-disabling file association modification n the GUI on a TS.

Terminal Services Script Library

Just started pulling functions from my WSH collection that do TS-specific stuff. Not that impressive yet..

IsTs

A commandline tool and source code which checks to see if it is running within Terminal Services; returns errorlevel output.

Mapback.vbs

This is a pretty crude demo of using WSH, and WMI to map drive letters back to a LAN client connected to a Terminal Server.

Modified Connect.asp and manyservers.htm (zipped)

Archive containing connect.asp and manyservers.htm modified to work with the new TSWeb control.

Terminal Services/Remote Desktop Diagnostics Tool UPDATED for MS02-047

A web page implementing basic trapping for Remote Desktop web client connections; allows you to do some basic diagnostics of your own.

This is VB6 source code and a control to check the IP address of clients from within a Terminal Services session; useful for logging. Control must be registered on the server.

Tweaked Default.htm for TSWeb

A zipped edit of the TSWeb default.htm which has been modified. It automatically resizes the client window to fit the desktop and displays the encryption bit depth in the status bar while you are connected. More modifications coming. Colorized source code for a recent version.

xWTSAPI - A Basic Session Control for TS Sessions

This is a small Activex control which includes the functionality of the Client IP Checker, and also lets you access the Session ID and server uptime. It will allow you to log off or disconnect a session from script. Includes basic XML documentation and a simple demo script. I also have a revised version with more functionality but little testing done called TsScript.

Tier6

This is an integrated remote control client which can be used to connect to a variety of computing remote computing platforms; below is a graphic showing the front end. You can download it from SourceForge. [Remote Desktop Client updated for MS02-0047]

Script-Based Terminal Services Automatic Logon

This WSF demonstrates a couple of interesting oddities. It is a WSH script which makes a Terminal Server/Remote Desktop connection automatically and then logs the session on. I also have an HTA-based automatic logon and you can download both the HTA and WSF in a single ZIP archive.

Where is TSWeb installed?

A simple script to read the registry for the location of the TSWeb folder, then pop it open. Help for those quick TSWeb repairs.

Command-line ICA

A script for running the Citrix ICA client from the command line. I also have a detailed breakdown of the script.

Command-line Terminal Services Client

Let me tell you, the TS developers took all the fun out of this script with the TSAC. Of course, this was fun I didn't like. The only point to this script is that it shortens the command line you need to use to run mstsc by "Wrapping" various screen resolutions up as single number arguments. Works for XP's Remote Desktop as well, of course.

TS/RD Client Error Lookup Script

I wrote this for rapid description lookup whenever someone gives me a TSAC/Remote Desktop client error code; not very exciting, but it keeps you from having to memorize codes.

VNC Tools

I have too many of these, so this is a separate web page.

MSI Package of the "new" ActiveX TS/RD Client - 5.1.2600.1095

Handy for LANs where the web interface is used locally; an MSI can push out this control via Active Directory, or you can even install it remotely with WMI.

Seamless Terminal Services Application Windows

Save this file as an HTA and edit the server address to see what a quick seamless window looks like. This isn't very flexible, but it proves you can get the look with TS.

Demo .NET Wrapper for the Terminal Services Client

This is a very simple project in Visual Basic.NET which wraps the Terminal Services client OCX redistributable. The primary intent is to show how it's done. It's also very tiny; the entire binary package plus the source files comes to about 40 KB.

2007年10月21日 星期日

UltraVNC

軟體名稱 最新版本 授權形式 介面語言 評價
UltraVNC 綠色軟體圖標1.0.1 Freeware English ★★★★★
官方網站 UltraVNC [http://ultravnc.sourceforge.net/]
相關連結 (無)
下載位址 (見官方網站)
功能簡介:用來操控遠端電腦的軟體。

相關教學

安裝步驟
1. 免安裝,解壓縮後可直接執行。
2. 網站上另外有 UltraVNC Mirror Driver,可以加強對畫面更新的敏感度與效率。
操作說明
以下簡稱被控端為 Server、操控端則稱為 Client。
Server 端
1. 在 Server 電腦上執行 winvnc.exe,以便稍後讓 Client 進行連線。
2. 第一次執行 winvnc.exe 時,必須設定「VNC Password」(不可空白或使用預設),作為連線密碼。
3. 設定成功後,右下角會出現一個藍色眼睛小圖示。
4. 將滑鼠移到該小圖示上,會出現這台電腦目前使用的 IP 位址。

Client 端
1. 在 Client 電腦上執行 vncviewer.exe。
2. 在「VNC Server」處輸入 Server 的 IP(或 Domain Name)與 port(預設為5900),格式為「host:port」(如:192.168.1.1:5900)。
3. 若成功則出現輸入連線密碼的畫面,輸入正確密碼後即會出現 Server 的畫面。

使用 Listen Mode 進行連線

使用時機:當 Server 位於 router(如:路由器、IP 分享器)下,只有虛擬 IP 時。

此時必須先於 Client 開啟 vncviewer.exe 的「Listen Mode」,再由 Server 的 winvnc.exe 進行新增 Client 的動作來建立連線。

Client 端
1. 在 Client 電腦上執行 vncviewer.exe /listen,進入操控程式的「Listen Mode」。
2. 成功後,右下角會出現一個綠色眼睛小圖示。
3. 將滑鼠移到該小圖示上,會出現這台電腦目前使用的 IP 位址及 port。

Server 端
1. 在 Server 電腦上執行 winvnc.exe。
2. 第一次執行 winvnc.exe 時,必須設定 VNC Password(不可空白或使用預設),作為連線密碼。
3. 設定成功後,右下角會出現一個藍色眼睛小圖示。
4. 將滑鼠移到該小圖示上,以滑鼠右鍵點擊、選擇「Add New Client」。
5. 於「Host Name」輸入 Client 的 IP(或 Domain Name)與 port(預設為5500)後按 OK。
6. 成功後,Client 會自動出現 Server 的畫面。

使用心得:功能齊全的遠端操控程式,除了遠端遙控外,也可以傳輸訊息、檔案。

雖然作業平台僅限於 Windows,但內建的 JavaViewer 讓支援 Java 的網頁瀏覽器在沒有操控程式的情況下也能進行簡單的操作。

2007年10月19日 星期五

rsync 資料同步

http://ohaha.ks.edu.tw/rsyncd.htm
◎敘述:
rsync和rcp的模式很相似,不過rsync有需多參數可以使用來加速檔案傳送.
rsync遠端更新協定(remote-update protocol)可以透過網路來傳輸兩端檔案不同的地方.
◎語法:
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... SRC [SRC]... DEST
rsync [OPTION]... [USER@]HOST::SRC [DEST]
rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
◎使用模式:
o 當來源端或目的端的路徑都未包含 : 這個分隔符號時,表示複製本地端的檔案.
o 當目的端路徑包含單個 : 這個分隔符號時,表示複製本地端檔案到遠端機器(透過ssh或rsh).
o 當來源端路徑包含 : 這個分隔符號時,表示複製遠端檔案到本地端.
o 當來源端路徑包含 :: 或 rsync:// 這個符號時,表示從遠端rsync伺服器複製檔案到本地端.
o 當目的端路徑包含 :: 或 rsync:// 這個符號時,表示從本地端複製檔案到rsync伺服器.
o 當來源端路徑包含 :: 和加上--rsh=COMMANS (-e COMMAND)參數,表示使用遠端shell程式(remote shell)
並透過遠端的rsync伺服器,複製遠端檔案到本地端

o 當目的端路徑抱含 :: 和加上--rsh=COMMAND 參數,表示使用遠端shell程式並透過遠端的rsync伺服器,
複製本地端檔案到遠端機器

o 列出遠端機器的檔案,跟rsync傳輸相同,只不過把本地端的目的地位置留空.
注意: 在所有狀況下(列出遠端機器檔案除外),來源端及目的端的路徑最少要有一個是本地端路徑.

◎使用方式:
rsync -t *.c foo:src/
傳輸目前路徑下所有符合*.c檔案,到foo這台機器的src資料夾.

rsync -avz foo:src/bar /data/tmp
傳輸foo機器src/bar資料夾下的所有檔案到 /data/tmp 資料夾.
-a 表示archive模式,也就是保持原有的檔案權限.
-z 表示傳輸時壓縮資料.

檔案傳輸來源後加上一個/可以避免再目的資料夾下額外建立出一個資料夾.
你可以把來源有沒有/這個符號結尾,想像成"複製這個資料夾下的內容"和"複製這個資料夾".
如: rsync -av /src/foo /dest 則會在 /dest產生一個foo資料夾;
rsync -av /src/foo/ /dest 則不會.

◎安裝方式:
安裝了rsync服務,就可以透過remote shell來比對傳輸機器間的檔案.
預設rsync使用ssh在機器間溝通及傳輸.(可以透過 -e 參數修改)
需要注意的是,來源端和目的端的機器都必須安裝有rsync

rysnc client端:安裝rsync只是為了取得rsync這個執行檔案.
路徑: /usr/ports/net/rsync/

安裝完成後,會看到如下的畫面告訴您要如何啟動rsync服務,及執行檔位置.

a.設定用來和rsync伺服端連結的密碼檔,內容為密碼.(密碼要和伺服端相同)
路徑: /usr/local/etc/rsyncd.secret
(檔案名稱及路徑可以自行變更,執行時在--password-file 指定即可)

某些rsync伺服器需要進行身分認證,當您與這些伺服器連結時,系統會要求您輸入密碼.
您可以透過設定密碼到 RSYNC_PASSWORD 這個環境變數,來避免此狀況發生.
(這個在FreeBSD上面好像是無效的.)

rsync伺服端:伺服端的機器也要安裝 (路徑:/usr/ports/net/rsync/ ,安裝方式同client端).
a.設定 /usr/local/etc/rsyncd.conf rsyncd 的設定檔:

說明:
[ohaha]: rsync區段的設定名稱
path: 備份資料存放的路徑
auth users: 連結rsync服務的帳號
uid,gid: 採用何種身分進行檔案存取
secerts file: 帳號密碼檔位置
read only: 是否唯讀

b.設定給rsync client端傳輸用的帳號及密碼,並且更改權限為root唯讀(600)
格式: 帳號:密碼 (每行一組,帳號和密碼用:分隔,此例帳號為ohaha密碼為ohahabackup)
路徑: /usr/local/etc/rsyncd.secret
(檔案名稱及路徑可以自行變更,與rysncd.conf中的設定相同即可)

c.修改 /etc/rc.conf 新增 rsyncd_enble="YES" (開機自動執行)

d.啟動 rsyncd 服務

◎參數:
-h , --help 顯示rsync求助資訊.
--version 顯示rsync版本.
-v , --verbose 複雜的輸出訊息.
-q , --quiet 安靜模式,幾乎沒有訊息產生.常用在以cron執行rsync.
-I, --ignore-times 通常rsync為了加快速度會忽略同樣檔案大小且同樣存取時間點的檔案.
可以透過此參數關閉此快速檢查.
--size-only rsync只檢查檔案大小是否改變,不管時間存取點是否改變.
通常用在mirror,且對方時間不太正確時.
-c, --checksum 在傳送之前透過128bit的md4檢查碼來檢查所有要傳送的檔案.(會拖慢速度.)
-a, --archive archive mode 權限保存模式,相當於 -rlptgoD 參數.
很快速的保存幾乎所有的權限設定,除了硬式連結(透過-H設定).
-r, --recursive 複製所有下層的資料(遞迴)
-R, --relative 使用相對路徑.
如: rsync foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo.c檔案
rsync -R foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo/bar/foo.c 檔案
-R, --relative 不使用相對路徑.
-b, --backup 目的地端先前已經存在的檔案在傳輸或刪除前會被備份.
--backup-dir=DIR 設定備份的資料夾.
--suffix=SUFFIX 指定備份的檔案名稱字尾形式(預設為~).
-K, --keep-dirlinks 接收方將連結到資料夾的檔案視為資料夾處理
-l, --links 複製所有的連結
-H, --hard-links 保留硬式連結
-p, --perms 保留檔案權限
-o, --owner 保留檔案擁有者(root only)
-g, --group 保留檔案群組
-D, --devices 保留device資訊(root only)
-t, --times 保留時間點
-n, --dry-run 不實際執行傳送,只顯示將會有的傳輸動作
-S, --sparse 嘗試去處理稀疏的檔案,讓這些檔案在目的端佔去較少的磁碟空間.
-W, --whole-file 複製所有的檔案,不額外作檢查.
--no-whole-file 關閉 --whole-file 參數
-x, --one-file-system 不要跨越檔案系統分界(只在一個檔案系統處理)
-B, --block-size=SIZE 強制透過rsync程式去比對修復block-sizeforce
-e --rsh=COMMAND 定義所使用的remote shell
--rsync-path=PATH 定義rsync在遠端機器存放資料的路徑
--existing 只比對更新目的端已經存在的檔案
--ignore-existing 忽略目的端已經存在的檔案(也就是不更新)
--delete 刪除傳送端已經不存在,而目的端存在的檔案
--delete-excluded 除了把傳送端已經不存在,而目的端存在的檔案刪除之外,
也刪除 --exclude 參數所包含的檔案.
--delete-after rsync預設會在檔案傳送前進行相關刪除動作確保接收端有足夠的檔案空間,
但可以透過 --delete-after 讓刪除動作在檔案傳送後再行刪除.
--ignore-errors 忽略任何錯誤既使是I/O error 也進行 --delete 刪除動作.
--max-delete=NUM 定義rsync不要刪除超過 NUM 個檔案.
--partial rsync若遇到傳輸過程中斷時,會把那些已經傳輸的檔案刪除.
在某種狀況下保留那些部分傳送的檔案是令人高興的.
你可以透過 --partial 參數達到這個目的.
--partial-dir=DIR 在 --partial 參數啟動時,你還可以定義rsync把那些部分傳送的檔案
寫入定義的資料夾,而非直接寫入目的端.需要注意的是,
此資料夾不應該被其他使用者可以寫入.(如:/tmp)
--force 當目的端資料夾被傳送端非資料夾名稱覆蓋時,強制rsync刪除資料夾,
即使該資料夾不是空的.
--numeric-ids 不將傳送端檔案的uid及gid值,與目的端的使用者/群組進行配對.
若傳送端並沒有uid及gid的對應名稱(如:原帳號群組被刪除的遺留檔案),
或目的端沒有相對應的帳號/群組,保留數字型態的uid/gid
--timeout=TIMEOUT 設定 I/O 逾時的時間(秒). 超過這個秒數而沒有資料傳送,rsync將會結束.
預設為0,也就是沒有定義逾時時間.
-T, --temp-dir=DIR 定義rsync在接收端產生暫時性的複製檔案時使用資料夾暫存.
預設是直接在接收端資料夾直接產生暫存檔案.
--compare-dest=DIR 定義rsync在目的端建立資料夾來比對傳送過來的檔案.
--link-dest=DIR 與 --compare-dest 相同,但同時會針對無法改變的檔案建立硬式連結.
-z, --compress 壓縮模式,當資料在傳送到目的端進行檔案壓縮.
-P -P參數和 --partial --progress 相同.只是為了把參數簡單化.
-C, --cvs-exclude 排除那些通常不希望傳送的檔案.定義的方式與CVS傳送相同:
RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state
.nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej
.del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/
符合以上條件的都會被忽略而不傳送.
--exclude=PATTER 符合PATTERN(規則表示式)樣式的檔案不進行傳送
--exclude-from=FILE 和--exclude參數相同,不過是把不進行傳送的檔案事先寫入某一檔案.
執行時,透過此參數讓rsync讀取.
(; #開頭的行列或空白行會被rsync忽略)
--include=PATTERN 定義rsync不要排除符合pattern樣式的檔案.
--include-from=FILE 和--include參數相同,只不過把要包含的檔案寫到某一檔案.
--files-from=FILE 把要傳送的檔案名稱都精確的寫入某一檔案,讓rsync讀取.
如: rsync -a --files-from=/tmp/foo /usr remote:/backup
-0 --from0 定義檔案所要讀取的檔案是null字元結尾.
--version 顯示版本訊息.
--daemon 定義rsync以daemon型態執行.
--no-detach 當以daemon型態執行時,不要進行分裂且變成背景程序.
--address=ADDRESS 定義所要連結(bind)的ip位址或是host名稱(daemon限定)
--config=FILE 定義所要讀取的設定檔rsyncd.conf位置(daemon限定)
預設值為 /usr/local/etc/rsyncd.conf
--port=PORT 定義rsyncd(daemon)要執行的port(預設為tcp 873)
--blocking-io 使用blocking I/O連結遠端的shell,如rsh , remsh
--no-blocking-io 使用non-blocking連結遠端的shell,如ssh (預設值)
--stats 顯示檔案傳送時的資訊狀態
--progress 顯示傳送的進度.(給檔案傳送時,怕無聊的人用的..)
--log-format=FORMAT 定義log的格式(在rsyncd.conf設定)
--password-file=FILE 從檔案讀取與遠端rsync伺服器連結的密碼
--bwlimit=KBPS 定義傳輸頻寬的大小(KBytes/秒)
--write-batch=FILE 把紀錄資料寫入一個檔案(給其他相同環境且相同需求的機器使用)
--read-batch=FILE 透過讀取紀錄檔案來進行傳輸.(檔案由 --write-batch 參數產生)
--checksum-seed=NUM 定義檔案 checksum-seed 的大小(byte)
-4 --ipv4 使用IPv4協定
-6 --ipv6 使用IPv6協定

◎傳輸實作:
實例:備份 ohaha.ks.edu.tw 的所有網頁內容(/usr/local/www/data/).
rsync 伺服端: backup.mlc.edu.tw
rsync client: ohaha.ks.edu.tw
分別設定好伺服端(bakcup)及client端機器(ohaha)的rsync服務.
在client端(ohaha)透過以下指令,把/usr/local/www/data/的所有資料透過rsync放到伺服端的
/backup/ohaha/data/ 資料夾下.
指令: rsync -rvlHpogDtS --password-file=/usr/local/etc/rsyncd.secrets /usr/local/www/data/ ohaha@backup.mlc.edu.tw::ohaha
說明: rsync 指令
rvlHpogDtS 參數 (部分參數可以用-a取代)
--password-file=/usr/local/etc/rsyncd.secrets 所要讀取的密碼檔位置(檔案內容只有密碼)
/usr/local/www/data/ 要備份的資料來源
ohaha@backup.mlc.edu.tw::ohaha 透過ohaha這個帳號,連結rsync伺服端(backup)的[ohaha]設定值.
順利的話就會看到如下的畫面,rsync正在建立檔案表列.

依照檔案的大小與多寡,經過一段時間之後會看到最後的結尾.
顯示傳輸狀況及結果:

若client端的密碼檔的權限設定有問題(非600,root所有)就會出現如下的畫面,
並要求手動輸入連結的密碼.

◎檔案:
設定檔: /usr/local/etc/rsyncd.conf 或 rsyncd.conf

◎作者:
Andrew Tridgell 和 Paul Mackerras.
http://lists.samba.org

在 Windows 下如何讀取 Linux 中的資料?

在 Windows 下如何讀取 Linux 中的資料?

如何從windows下讀取ext2/ext3的檔案

使用Explore2fs ,網址 http://uranus.it.swin.edu.au/~jn/linux/explore2fs.htm#Download及 http://www.fs-driver.org/download/Ext2IFS_1_10a.exe
http://mtchangtw.blogspot.com/2006/01/windowslinuxext2rfs.html

把工作的桌面換成Linux想了很久了,但是一直有很多問題存在,不得不依賴windows系統。
雖然使用fat32格式,來讓來讓兩個系統都可以讀取及寫入達到資料共享的目的,但有用過fat32的人大概都知道,他的名字叫做fat不是叫假的,硬碟一大檔案一多檔案配置表肥的讓人以為買到爛硬碟....
於是起了,想把系統放到ext2下面的念頭,且...比較安全..XX較不會被發現...^_^!!所以今天找了一下windows讀取linux檔案格是的driver大概有這幾個...首先推薦,這套...
http://uranus.it.swin.edu.au/~jn/linux/explore2fs.htm
支援ext2/ext3檔案格是的explorer最新的版本加入了utf8的支援,所以在中文顯示上已經沒有問題了,但還在beta版狀態,應該過陣子就會正式版了...
下面的工具也是有支援,沒用過有用過的歡迎回應給我!!
http://p-nand-q.com/download/rfstool.html
http://www.fs-driver.org/index.html
http://rfsd.sourceforge.net/
http://www.linuxquestions.org/questions/showthread.php?s=&threadid=20241

如果還是覺得不是很好用.那就自己來!!
http://www.microsoft.com/whdc/devtools/ifskit/default.mspx
微軟提供這套SDK開發套件

2007年10月17日 星期三

KLA 說明

The defect source identifier displays the data collected from the wafer defect inspection process and the scanning electron microscope process 206 in the defects table 406 of the defect summary screen. All defects are assigned an on-the-fly class from wafer defect inspection process. Selected defects may be analyzed further using an optical microscope and be provided a revisit class. A subset of these defects can be analyzed even further using the scanning electron microscope process 206 and be given a scanning electron microscope-automated defect classification class. Thus, a single defect may be assigned various defect classifications depending upon the metrology tools used to inspect the defect.
At the end of inspection, a single KLA result file is generated by each metrology tool used to inspect the defect along with image files for each defect. For the scanning electron microscope process 206, the KLA result file is produced per wafer. For the wafer defect inspection process, the KLA result file is produced per lot. If the revisit process is performed on a wafer, only one wafer defect inspection process KLA file is produced showing the combined information for the on-the-fly and revisit classifications.

The wafer defect inspection process and the scanning electron microscope process 206 export their KLA result files and image files to a directory that is located locally to the process and/or 206 i.e., either in the tool's computer or in the client computer. These export directories are available to the defect source identifier as Network File System mountable file systems as described above.

The KLA file typically is configured to contain many records. One embodiment of the records used by the KLA file of the defect source identifier can be arranged as follows:

InspectionStationID ;
ResultTimestamp

2007年10月12日 星期五

如何關閉一個程式呢

只要知道該程式名稱,並使用taskkilll指令即可
例如要關掉IE,則輸入:

taskkill /im iexplore.exe

另外在lss實驗室這邊看到了將指令運用到網路的技巧

taskkill /s pc403-01 /im iexplore.exe /u administrator /p admpasswd
* /s pc403-01 :遠端電腦名稱為 pc403-01 。
* /im iexplore.exe :要關閉的應用程式為 iexplore.exe ,即 IE 瀏覽器 ( im 為 image name 的縮寫 ) 。
* /u administrator :遠端電腦執行 taskkill 的帳號,用管理員就對了。
* /p admpasswd :遠端電腦的管理員密碼。如果只寫 /p 而省略密碼,則會提示輸入。
* /f 是強迫關閉程式

接下來,要批次關閉整間電腦教室就要動用到批次命令了。簡單一點的方法,就是用批次檔替每個學生電腦寫一行 taskkill 命令。不過,我個人偏好使用 for 命令。在 Windows 遠端關機的文章裡已經介紹過 for 命令了,這裡直接看完整指令吧:
for /l %a in (1,1,9) do taskkill /s pc403-0%a /im iexplore.exe
for /l %a in (10,1,46) do taskkill /s pc403-%a /im iexplore.exe

那還有 start 命令呢?因為並不是每個學生都在上網,於是便會遇到 taskkill 尋找遠端電腦裡不存在的執行中應用程式而造成延遲。因為上個命令尚未執行完畢的話,批次檔裡的下個命令無法繼續執行,整個批次命令的執行時間便會拉長,於是便想看看能不能讓每個 taskkill 在背景執行。經過一番研究,找到了 start 加上 /b 參數。

同樣地, start 的用法請自行參閱 Windows 的說明與支援或 start /? 的說明,下面是修改過的用法:
for /l %a in (1,1,9) do start /b taskkill /s pc403-0%a /im iexplore.exe
for /l %a in (10,1,46) do start /b taskkill /s pc403-%a /im iexplore.exe

如何遠端呼叫程式執行

Q :
假設在A電腦裡有一個VB.NET的檔案-->A.exe,執行A.exe會以今天的日期產生一個date.txt檔。
然後在網路上的另一台B電腦有一個VB.NET的檔案-->B.exe,執行B.exe會去呼叫執行A電腦裡的A.exe,然後,下載它產生的date.txt檔。
如上,我想請有人知道如何遠端呼叫程式執行,就是B.exe呼叫A.exe去執行這部分。
A:
試試看用process.Start方式來做
process.Start("\\192.168.200.34\a.exe")
Q:
Process.Start("")還是無法完全達到要求也,因為要是透過網際網路的話,就行不通了,除打htt://xxxxxxxxx/xxxx/x.exe才行,但是這樣的話,就會出現ie
權限要處理
要把[Runtime Security Policy]中[Machine]中[Internet_Zone]中的[Permission Set]設定成FullTrust就可以使用遠端程式了

做駭客?用IE就行

  編者按:聽說過灰鴿子、冰河等可以實現遠端控制,但你聽說過IE也可以實現嗎?不錯,一款基於IE的新鮮工具——rmtSvc&vIDC即可讓微軟的IE成為一個超級駭客幫兇。本文除了將為你展現rmtSvc&vIDC是如何基於IE遠端控制肉雞以外,更在如何「暗殺」殺毒軟體、攻擊思路上有較強的指導性。

  如果我問你IE能做什麼?你的答案絕對不完整!IE可不僅僅能流覽網頁。如果我再告訴你IE還能用來遠端控制、遠端傳輸、進程管理、代理服務,甚至遠端開啟Telnet、FTP服務等等呢?你一定覺得不可思議吧,有了rmtSvc&vIDC,這一切皆有可能!

  有IE,想黑就黑!

  首先在http://www.sixvee.com/520yy/tools/rmtsvc247.rar下載rmtSvc&vIDC的最新版本2.4.7版(以下簡稱rmtSvc)。簡單點說,rmtSvc是一款集FTP、Telnet服務、 Proxy服務以及vIDC服務的遠端控制工具。用戶可以通過此款工具方便地對遠端電腦進行控制。此工具和其他遠端控制工具不同,它採用B/S結構(無需安裝),用戶可通過流覽器進行遠端控制(我們的口號是:有IE,想黑就黑!)。

  下面,筆者就以入侵控制的實例來為大家分別介紹rmtSvc常用功能的使用方法及技巧。解壓下載後的壓縮包,先別急著讓rmtSvc.exe在目的機運行(未加殼的程式會遭到殺毒軟體的查殺),筆者先告訴大家如何給根源程式加殼從而避免被查殺吧(不然就沒得玩了-_-|)。在http://www.sixvee.com/520yy/tools/AsPack.rar下載加殼程式AsPack Ver2.12版,運行程式,進入「選項」功能表,勾選「保留額外資料」,然後「打開檔」,選擇根源程式rmtSvc.exe後就會自動壓縮了。

  特別提醒:壓縮後的rmtSvc.exe不會被殺毒軟體查殺,而且檔體積會減少近50%(經過金山毒霸6增強版、KV2005、諾頓2005測試),如果想進一步增強隱蔽性,請參考2004年第50期G9版《披著羊皮的狼——將Radmin改造為百分百木馬》一文介紹的「超級捆綁」軟體的使用方法。木馬程式的欺騙發送本文就不作進一步討論了。

  武裝rmtSvc,「暗殺」殺毒軟體

  1.打開流覽器輸入http://IP:port(其中IP為被控機的IP位址, port為rmtSvc的服務埠,默認為7778)。連接成功後將會看到如圖1的歡迎登錄畫面,輸入訪問密碼(默認為123456),就可以進行 rmtSvc所支持的操作(如果之前已經連同msnlib.dll和webe目錄都發給了對方,那麼rmtSvc將會多出用MSN進行遠端控制和HTTP 方式檔管理的功能)。

  2.歡迎登錄畫面的上方為rmtSvc的系統功能表,從左至右的功能依次為:Pview (進程查看)、Spy++(遠端控制管理)、Proxy(啟動或停止rmtSvc的代理服務)、vIDC(設置vIDCs的訪問許可權)、logoff (註銷對rmtSvc登錄)、Option(配置rmtSvc的運行參數)、About(rmtsvc歡迎/登錄畫面)。

  3.第一次登錄需進入rmtSvc的參數設置更改敏感資訊(圖2),這樣才能保障其安全性。先在「Modify Password」修改rmtSvc訪問密碼,再在「Service Port」更改rmtSvc服務埠為任意一個4位不常用的埠(需要重啟服務才會生效,建議設為高端埠)。然後將「Start Control、Stolen mode」選上,這樣rmtSvc會自動安裝為Windows服務隨機啟動且服務為隱藏屬性,這也就意味著在下次啟動時,你可以繼續控制目的機器。


  4.接下來在「Start mode」選項中,設置rmtSvc運行後自動啟動FTP和Telnet服務(另外還有Proxy、vIDCs映射等)。通過FTP可以方便地進行檔上傳下載。再將「Auto install service」和「Forbid detaching Dll」選擇上,這樣每次程式運行時會自動檢測rmtSvc服務是否已安裝,如果沒有安裝則自動安裝為服務(相當於自我修復功能)並釋放一個DLL檔(可修改檔案名,默認為inject.dll),這是為了防止自動釋放的未加殼的DLL被殺毒軟體查殺,用戶可以選擇不釋放DLL。手工將加殼後的DLL拷入到被控機的系統目錄下,在釋放DLL的名稱處填入你加殼後的DLL名稱。

  高手傳經:rmtSvc釋放的DLL主要有以下用處:隱藏進程、類比「Ctrl+Alt+Del」按鍵、顯示密碼框密碼、監視rmtSvc運行情況。如果異常退出或被殺掉則會自動重新啟動,將配置參數寫入rmtSvc程式本身(強烈建議選擇)。

  5.接下來在「Killed Program」中,設定rmtSvc監視並自動殺掉的進程名稱,如有多個進程,各個名稱之間以逗號分隔。例如輸入:PFW.exe,KAVSvc.exe就可以把金山毒霸和天網防火牆關閉。

  6.一切設置無誤後,點擊「Save」保存當前配置,在彈出的對話方塊中輸入reg,將配置參數寫入到註冊表。輸入self則是將配置參數寫入該EXE檔自身,如果填寫其他則會生成相應檔案名的.exe的副本,並將配置參數寫入此EXE副本。例如:輸入c:\abc.exe,將在c盤根目錄下生成一個abc.exe副本,並將配置參數寫入此副本。

  7.隨後rmtSvc服務會重新啟動運行。

  高手傳經:隱藏模式下才可以將配置參數寫入EXE本身,如果沒有保存,每次在rmtSvc正常退出時也會將配置參數寫入EXE本身。

  8.再次使用新設密碼登錄後,單擊Pview進入「進程查看」頁面,在這裡將顯示三個部分的資訊:系統資訊、進程/模組資訊、CPU/記憶體使用資訊。在頁面的右邊為進程模組顯示區域,點擊某個進程名則顯示此進程的相關模組資訊,點擊「Kill It」按鈕就可以殺掉該進程(需要注意的是進程列表不會即時自動刷新,用戶必須手工刷新)。現在你的rmtSvc已經被武裝到了牙齒,還等什麼,可以出手了。

  用IE控制過把癮

  把擋路的安全軟體給「暗殺」後,接下來就可以趁對方不在時使用Spy++遠端控制管理來遠端控制機器了。當然在控制前我們需要將相關參數設置妥當,這樣才能得到更好的控制效果。

  1.在「Quality」顯示效果中選擇Good(好),「Stretch」設置捕獲圖像的縮小比率80%。最後將「Cursor」選上,這樣在捕獲遠端電腦螢幕時就會連同滑鼠游標一起捕捉,以便用戶知道當前滑鼠游標位置。設置好後點擊「Set」使上述三個參數生效。

  2.接下來就可以嘗試控制了。當遠端桌面圖像處於焦點狀態(滑鼠在圖像區域內),你就可以直接敲擊鍵盤發送按鍵資訊,和你操作本地機器一樣。但是對於輸入大段的文本這是非常不方便的,因為你的每次按鍵動作都會作為一次HTTP請求發出,輸入速度很慢。

  如果你想輸入大段文本,可以將滑鼠選中Input輸入框,然後輸入你想要發送的文本,按下回車即可;如果選中了Crlf核取方塊,則在你輸入的文本後面會自動加入回車換行。

  3.但是在進行遠端電腦登錄時,有些機器可能無法通過Input輸入框直接輸入登錄密碼,只能通過類比鍵盤輸入登錄密碼。方法如下:通過滑鼠直接點擊桌面圖像,系統會自動識別你的滑鼠的單擊、雙擊鍵資訊。如果你在按下滑鼠的同時按下了「Shift」、「Alt」或「Ctrl」鍵,系統也能自動識別。

  4.為了更方便地控制遠端桌面,可以將遠端桌面圖像設為自動刷新,這樣就不會出現有動作發出而圖像沒有變化需要手工刷新的情況了。方法如下,勾選「Auto-refresh」項,在右邊輸入自動刷新間隔,默認為500ms。

  高手傳經:如果想知道遠端被控機中密碼框中的密碼。則需要用到Password→Text項,在有密碼框時此項會變為 Text→Password。此時只要用滑鼠左鍵點擊遠端桌面圖像的密碼輸入框,則遠端被控機密碼框中的密碼會被翻譯成明文顯示。如果你取消此項功能,點擊Text→Password項即可,此時此項就會變為Password→Text。

  5.如果要遠端執行程式,選擇Start下拉清單框的Run項,輸入你要遠端執行的檔案名和參數即可,使用方法和Windows的開始功能表的運行命令一致。

  如此這般,通過IE就能像操作本機一樣控制目的機了。

  FTP/Telnet,一個都不能少

  遠端控制似乎並不能讓我們感到滿足,那就再來開啟對方的FTP/Telnet服務,徹底過把入侵癮吧。

  1.進入「FTP&Telnet」功能表,點擊FTP/Telnet服務旁邊的「Run」就可以啟動相關服務了。

  FTP/Telnet port:設置FTP/Telnet服務的埠,默認FTP為2121,Telnet為2323。

  Anonymous access:設置訪問FTP服務的許可權,是否允許匿名訪問(enable),如果不允許則設置訪問的用戶名和密碼。

  2.另外,我們還要允許設置不同訪問的帳號,每個帳號可以指定是否可寫/可刪除/可執行以及設置不同的FTP根目錄。可以在FTP設置的文本輸入框中輸入多個訪問帳號資訊,各個帳號資訊用回車換行分隔,帳號資訊格式如下:

  [帳號名] SP [密碼] SP [訪問許可權] SP [允許訪問的目錄] CRLF

  高手傳經:設置PERMISSION(訪問許可權)時,0:僅僅唯讀,1:可寫,3:可寫並且可刪除 7:可寫可刪除可執行。例如:[cytkk] sp [123456] sp [7] sp [c:] 就建立了一個擁有管理員許可權,密碼為123456的cytkk帳戶。

  3.此時FTP帳號資訊僅僅寫入註冊表保存,不會保存到EXE中。

  現在就可以利用FTP工具和Windows自帶的Telnet工具進行登錄和操作了,此時你想怎麼玩就怎麼玩吧!

  到此,rmtSvc基本功能的使用大家就已經學會了,限於篇幅,它更多的功能就不在此一一舉例了,有興趣的朋友可以通過駭客營論壇與我們共同探討。

  最後感謝rmtSvc的漢化作者yyc在程式調試過程中給予的技術支持!