Kelp-Space 是記錄一些生活雜事的Blog
如有任何程式設計的問題歡迎到 飛特技術論壇 討論

2008-07-31

檢視本站完整介紹

本站成立時間:
2008-06-29 星期日 清晨六點。

本站主題:
1.發佈原創作品,並且記錄開發過程。
2.程式相關教學。
3.生活碎碎唸。
4.旅遊記錄。

網站導覽:
標籤-C#.NET、MCU、VB6 C#.NET、MCU、VB6的程式教學
標籤-Ubuntu Linux-Ubuntu系統相關教學
標籤-作品發佈 張貼目前最新作品
標籤-工作日誌 記錄作品開發過程,作品只要更新後會把舊版本移到這邊
標籤-軟體教學 本站作品的使用教學
標籤-駭客活動 主要記錄駭客們的聚會

Kelp 參與管理的網站:
飛特技術論壇
飛特技術論壇 是一個開放的技術交流區,討論內容包含資訊安全、高階程式語言、腳本語言、韌體設計......等。
Kelp目前為飛特技術論壇站長。

Vi Taiwan 人 - 生活在北歐
Vi Taiwan 人 提供在瑞典的華人一些資訊,對想去北歐玩的遊客來說也是很棒的網站。
Kelp 協助 ViTaiwan人 管理這個網站。

2008-07-30

文字/二進制檔案讀寫 - System.IO

首先在using程式碼中加入: 複製程式碼(Copy to clipboard)
using System.IO;


文字檔讀取: 複製程式碼(Copy to clipboard)
StreamReader ReadFile = new StreamReader("D:\\test.txt");   //開啟"D:\test.txt"
string SReadData = "";
while (ReadFile.Peek() != -1)                               //讀到檔案結束為止
{
    SReadData = SReadData + "\r\n" + ReadFile.ReadLine();   //一次讀取一行
}
ReadFile.Close();                                           //關閉檔案


文字檔寫入: 複製程式碼(Copy to clipboard)
StreamWriter WriteFile = new StreamWriter("D:\\test.txt");  //開啟"D:\test.txt"
WriteFile.WriteLine("test");    //寫入文字
WriteFile.Flush();              //清除緩衝區
WriteFile.Close();              //關閉檔案


二進制檔讀取: 複製程式碼(Copy to clipboard)

byte[] BData;
FileStream BFile = new FileStream("D:\\test.txt", FileMode.Open); //開啟檔案串流
FileInfo FI = new FileInfo("D:\\test.txt"); //初始化FI物件 (為了得到檔案長度)
BData = new byte[FI.Length];                //初始化二進制陣列長度

BFile.Read(BData, 0, Convert.ToInt16(FI.Length));
//將二進制陣列寫入檔案中 第一個參數是二進制陣列 第二個代表資料起始位置 第三個是資料長度

BFile.Close();



二進制檔寫入: 複製程式碼(Copy to clipboard)

byte[] BData;   //宣告陣列
BData = Encoding.UTF8.GetBytes("Kelp-Space");   //將"Kelp-Space"寫入二進制陣列中
FileStream BFile = new FileStream("D:\\test.txt", FileMode.Create); //開啟"D:\test.txt"
BFile.Write(BData, 0, BData.GetUpperBound(0) + 1);
//將二進制陣列寫入檔案中 第一個參數是二進制陣列 第二個代表資料起始位置 第三個是資料長度

BFile.Flush();
BFile.Close();


FileMode.Open 開啟存在檔案
FileMode.Append 如果當案存在,開啟串流在檔尾,如果不存在則建立檔案
FileMode.Create 如果檔案存在,覆寫檔案,如果不存在則建立檔案
FileMode.OpenOrCreate 如果檔案存在,開啟檔案,如果不存在則建立檔案

檔案與資料夾操作 - System.IO

在using程式碼中加入:
using System.IO;

System.IO底下的類別:
Directory 提供類別方法來建立、移動、複製資料夾......等功能
DirectoryInfo 一個資料夾就是一個DirectoryInfo物件
File 提供類別方法來建立、移動、複製檔案......等功能
FileInfo 一個檔案就是一個FileInfo物件
StreamReader 使用位元組串流來讀取文字檔
StreamWriter 使用位元組串流來寫入文字檔
FileStream 建立檔案串流,可以用來處理二進制檔

Directory類別方法:
CreateDirectory(path) 建立路徑為path的資料夾
Exists(path) 檢查路徑為path的資料夾是否存在(存在時傳回true)
Delete(path, bool) 刪除路徑為path的資料夾,bool為true時代表要刪除子資料夾
GetCurrentDirectory() 取得目前的工作路徑

示範: 複製程式碼(Copy to clipboard)
//如果資料夾"D:\test"存在時就刪除它
if (Directory.Exists("D:\\test"))
{
   Directory.Delete("D:\\test",true);
}

File類別方法:
Copy(SourPath, DestPath, bool) 複製SourPath至DestPath,bool為true時表示覆寫
Delete(path) 刪除路徑為path的檔案
Exists(path) 檢查路徑為path的檔案是否存在

示範: 複製程式碼(Copy to clipboard)
//檢查"D:\test.txt"是否存在,存在的話將它複製到"D:\test2.txt"
if (File.Exists("D:\\test.txt"))
{
    File.Copy("D:\\test.txt", "D:\\test2.txt", true);
}

FileInfo類別方法:
使用FileInfo時要先建立FileInfo物件 //path為檔案路徑 資料型態為string
FileInfo FI = new FileInfo(path);

Name 檔案名稱
FullName 檔案全名,包含檔案路徑
Extension 檔案副檔名
Directory 取得父資料夾的DirectoryInfo物件
CreationTime 建立日期
LastAccessTime 存取日期
Length 檔案大小

示範: 複製程式碼(Copy to clipboard)
//取得"D:\test.txt"的檔案大小
FileInfo FI = new FileInfo("D:\\test.txt");
MessageBox.Show(FI.Length.ToString());

C#動態控制項陣列化

以下程式使用Label當作範例,進行控制項陣列化及動態載入控制項示範。
控制項的事件範例使用Click。
上面兩段程式碼都是對應到最下方的事件。


將Form上的控制項陣列化:
複製程式碼(Copy to clipboard)
//Form上原本就拉好的物件
//在Form上要先有label2跟label3這兩個物件
Label[] labAryB = new Label[2];
labAryB[0] = label2;
labAryB[1] = label3;
labAryB[0].Click += new EventHandler(tb_Click);
labAryB[1].Click += new EventHandler(tb_Click);

使用程式來載入控制項:
複製程式碼(Copy to clipboard)
//透過程式新增物件
Label[] labAry = new Label[3];
labAry[0] = new Label();
labAry[1] = new Label();
labAry[2] = new Label();
for (int i = 0; i != labAry.Length; i++)
{
    this.Controls.Add(labAry[i]);
    labAry[i].Text = "Test" + i;
    labAry[i].Top = labAry[i].Height * i;
    labAry[i].Click += new EventHandler(tb_Click);
}

控制項的事件:
複製程式碼(Copy to clipboard)

void tb_Click(object sender, EventArgs e) //若有人對新增的控制項Click
{
    Label srcLabel = sender as Label;

    MessageBox.Show(srcLabel.Text);  //可以透過物件的屬性來判斷,如TabIndex
}

2008-07-29

C#動態陣列

陣列宣告方法:
//宣告SData(0 to 0)
string[] SData = new string[1];

取得陣列資訊:
test.GetLength(int) 傳回int維度的元素
test.GetLowerBound(int) 傳回int維度的LowerBound
test.GetUpperBound(int) 傳回int維度的UppBound

在程式中更改陣列長度:
複製程式碼(Copy to clipboard)
    public static Array ReDim(Array origArray, Int32 desiredSize)
    {
        Type t = origArray.GetType().GetElementType();
        Array newArray = Array.CreateInstance(t, desiredSize);
        Array.Copy(origArray, 0, newArray, 0, Math.Min(origArray.Length, desiredSize));
        return newArray;
    }
呼叫範例:
//將SData的陣列長度加1
SData = (string[])ReDim(SData, SData.GetUpperBound(0) + 2);

2008-07-26

抓取SubKey的資料(string)

呼叫範例:
複製程式碼(Copy to clipboard)
WinRARPath = Mid(GetKeyString(HKEY_CLASSES_ROOT, "Applications\WinRAR.exe\shell\open\command", ""), 2)
WinRARPath = Left(WinRARPath, InStr(1, WinRARPath, Chr(34), vbBinaryCompare) - 1)   '取得WinRAR安裝路徑


以下程式碼請複製到模組。
複製程式碼(Copy to clipboard)

Option Explicit

'''''''''''''''''''''''''''''''key'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Public Const HKEY_PERFORMANCE_DATA = &H80000004
Public Const HKEY_CURRENT_CONFIG = &H80000005
Public Const HKEY_DYN_DATA = &H80000006

Public Const REG_NONE = 0
Public Const REG_SZ = 1
Public Const REG_EXPAND_SZ = 2
Public Const REG_BINARY = 3
Public Const REG_DWORD = 4
Public Const REG_DWORD_BIG_ENDIAN = 5
Public Const REG_MULTI_SZ = 7

Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String, lpcbValue As Long) As Long
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Public Function GetKeyString(hKey As Long, Key As String, SubKey As String) As String
    Dim LKey As Long
    Dim SData As String
    Dim lenData As Long
    Dim typeData As Long

    If RegOpenKey(hKey, Key, LKey) = 0 Then '判斷key是否存在
        If RegQueryValueEx(LKey, SubKey, 0, typeData, ByVal vbNullString, lenData) = 0 Then '判斷subkey是否存在
            SData = String(lenData, Chr(0))
            RegQueryValueEx LKey, SubKey, 0, typeData, ByVal SData, lenData
            GetKeyString = Left(SData, InStr(SData, Chr(0)) - 1)
        End If
    End If
   
    RegCloseKey LKey
End Function

C#字串函數簡介

length() 取得字串長度
Remove(int1,int2) 從int1(起始位置)開始刪除長度為int2的字串
Insert(int,string) 在int的位置插入string
Substring(int) 從參數開始取出剩下的字串
Substring(int1,int2) 取出int1開始長度為int2的字串

IndexOf(string) 傳回第一次搜尋到字串(string)的位置
IndexOf(string,int) 傳回第一次搜尋到字串(string)的位置,開始搜尋位置為int
LastIndexOf(string) 跟IndexOf功能類似,但從後面開始搜尋
LastIndexOf(string,int) 跟IndexOf功能類似,但從後面開始搜尋
Replace(char,char) 取代字元

ToLower() 將英文轉成小寫
ToUpper() 將英文轉成大寫
Trim() 刪除字串前後的空白字元
TrimEnd() 刪除字串尾部的空白字元
TrimStart() 刪除字串開頭的空白字元


呼叫範例:
str = str.Remove(2,2);
integer = IndexOf("test");
str = str.ToLower();
C#的字串起始位置是0,VB慣用者要注意一下。
string test = "www";
int itest = test.IndexOf("w");
這時候itest的值是0。

2008-07-24

B807專案開發紀錄

雖然說是teamwork,但協助開發的卻不是team裡的人= =|||
感謝kLoEr。
程式碼抓取核心完成。

2008-07-14

MCU的IO種類

這是在2007年一月底學到的,上課的老師是許先生(網路ID:太乙)。
在上他的課之前也有接觸過一些單晶片,但沒有聽過這種IO分類(書上很少看到)。

1.真IO
例如51的P0。
可同時輸入輸出,設定後可變成高阻抗。
2.假IO
例如PIC、HOLTEK。
有一個SFR來控制IO當輸入或輸出。
這就是扇出能力高於51的關係。
3.準IO
例如51的P1、P2、P3。
可同時可當輸入輸出。

更換語言的時機到了

從開始接觸VB6到現在已經四年了,VB6也是我第二個學的語言。
VB6跟Delphi都是寫木馬的最佳工具,因為編譯出來的檔案小。
可是VB6的優點漸漸消失了,XP SP3會把.net framework一起安裝進去。
如果不把.net framework的容量算進去,Visual Studio所開發的木馬會比VB6寫出來的還小。

VB6不但容量的優勢消失,他本身也有很多致命傷,如編譯出來的檔案不穩。
這個要用久了才有感覺,他編譯出來的執行檔只要連續運作好幾個星期就會怪怪的(要複雜的程式才會)。
VB6在網路上也被莫名其妙的冠上一堆缺點,如"因為直譯所以速度慢","自動定義自由資料型態"....
(VB6也能編譯啊,程式碼加上Option Explicit他就不會自動定義了 = =|||)

總之以後要換成C#了。
Vista跟XP SP3肉雞增多的情況下使用.net framework是能接受的。
謎:養雞業者新革命。
而且工作也能用(正派工作)。
Evis Ain短時間內不會升級到1.3版,因為1.3版要使用C#撰寫。
FC寫到完成後也會開始更換語言。

2008-07-13

Linux 3D特效-Compiz安裝教學


(影片位置)

安裝方法如下

Step1.
在超級終端機內執行
sudo wget http://download.tuxfamily.org/3v1deb/DD800CD9.gpg -O- | sudo apt-key add -

Step2.
系統 -> 管理 -> Synaptic套件管理程式
在"Synaptic套件管理程式"裡找到 設定 -> 套件庫 -> 第三方軟體 -> 加入
把下面兩行打進去
deb http://download.tuxfamily.org/3v1deb feisty eyecandy
deb-src http://download.tuxfamily.org/3v1deb feisty eyecandy

Step3.
更新&安裝:
在超級終端機內執行
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install compiz compiz-gnome
sudo apt-get install compizconfig-settings-manager
sudo apt-get install compiz-fusion-*

Step4.
啟動:
在超級終端機內執行
compiz --replace -c emerald

Step5.
安裝成功候可以到這裡設定特效
系統 -> 偏好設定 -> Advanced Desktop Effects Settings

2008-07-08

Evis FC 1.0 beta 開發記錄

荒廢幾天後再來寫程式果然很累,昨天更是看30分的動畫寫10分鐘的程式。
不想去公司裡寫的原因就是這個。
程式寫到一半突然宅起來那可好玩了 >"<

確定要把硬體控制核心與Servant程序分成兩個。
兩個程序都不允許當掉,因此不編寫自行再啟動程式。
硬體控制核心的Initialize完成。
型號的特徵描述腳本語法完成。
兩個核心的溝通系統完成。

Evis Ain 1.2.1365 beta

修正內容:
修正暫停下載後再重新啟動程式並開始下載時會變成上傳的BUG。
載點:
Evis Ain-Master v1.2.1365 (控制端)
Evis Ain-Servant v1.2.237 (被控端)
說明書
說明:
Evis Ain是用來管理遠端Windows電腦的免費軟體。
它的特色是能夠同時控制數台遠端電腦。
Evis Ain採用指令介面,並搭配巨集系統,讓使用者能夠自行編輯指令。
例如,Evis Ain沒有提供的功能使用者能夠自己寫一個執行檔,透過上傳加執行的指令來完成。

居又更新了 = =a
一天一BUG是吧 ~"~
Screenshot:

2008-07-07

Evis Ain 1.2.1362 beta

修正內容:
Menu上的"Taregt"修正為"Target"。(感謝破曉的lunglungyu)
載點:
Evis Ain-Master v1.2.1362 (控制端)
Evis Ain-Servant v1.2.237 (被控端)
說明書
說明:
Evis Ain是用來管理遠端Windows電腦的免費軟體。
它的特色是能夠同時控制數台遠端電腦。
Evis Ain採用指令介面,並搭配巨集系統,讓使用者能夠自行編輯指令。
例如,Evis Ain沒有提供的功能使用者能夠自己寫一個執行檔,透過上傳加執行的指令來完成。

居然一天內更新兩次 = =a
感謝網友告知,在HIT前得把明顯BUG都挑出來才行。
Screenshot:

Evis Ain 1.2.1361 beta

修正內容:
修正F-IP檔製造後檔案傳輸會停止的BUG。
音效檔替換。
載點:
Evis Ain-Master v1.2.1361 (控制端)
Evis Ain-Servant v1.2.237 (被控端)
說明書
說明:
Evis Ain是用來管理遠端Windows電腦的免費軟體。
它的特色是能夠同時控制數台遠端電腦。
Evis Ain採用指令介面,並搭配巨集系統,讓使用者能夠自行編輯指令。
例如,Evis Ain沒有提供的功能使用者能夠自己寫一個執行檔,透過上傳加執行的指令來完成。

這次突然又發現BUG = =a
不然到1359後真的不太想再更改。
所以這次用替換檔案的方式直接將新的檔案更新到1359的載點。
Screenshot:

Evis如何同時對多個被控端下指令

Evis中的target是指令接收目標。
控制target的指令有To及Group,或是由滑鼠控制。
To只能將target設定成單一目標,引數為LinkID。
Group能夠將target設定成多個目標,但在使用指令前必須將被控端加入group。
本篇文章使用滑鼠操作的方式做示範。


↑將控制端選取後按右鍵 選擇Target


↑用一個指令測試兩台電腦是否都有反應

副標籤:Evis使用教學

2008-07-06

十六進制轉十進制

晶片:HT46R24
語言:組合語言
此副程式最大值為FFFFFFH轉16777215。
位數越大時會自動切換連加倍率,所以速度還OK(不會永遠都笨笨的加1)。
使用方法:
1.把欲轉換的十六進制值丟到hmode3(最高位元),hmode2,hmode1(最低位元)
2.呼叫sum_dec.:
3.把數值從nmode4~nmode1中提出來
例如:
丟0CH進去hmode1其他為零,傳回值nmode1為12H。
複製程式碼(Copy to clipboard)

        nmode1                equ        [55h]        ;十進制傳回值最低位元組
        nmode2                equ        [56h]        ;十進制傳回值
        nmode3                equ        [57h]        ;十進制傳回值
        nmode4                equ        [58h]        ;十進制傳回值最高位元組
        hmode1                equ        [5bh]        ;十六進制引數最低位元組
        hmode2                equ        [59h]        ;十六進制引數
        hmode3                equ        [5ah]        ;十六進制引數最高位元組


;------hex to dec--------------
sum_dec:
        clr                nmode1
        clr                nmode2
        clr                nmode3
        clr                nmode4
        sz                 hmode1
        jmp                seach
        sz                 hmode2
        jmp                seach2
        sz                 hmode3
        jmp                seach3
        ret
seach:
        inc                nmode1
        mov                a,nmode1
        clr                status
        daa                nmode1

        sz                 status
        call               redeem

        sdz                hmode1
        jmp                seach
        sz                 hmode2
        jmp                seach2
        sz                 hmode3
        jmp                seach3
        ret
seach2:
        dec                hmode2
        mov                a,56h
        add                a,nmode1
        clr                status
        daa                nmode1
        mov                a,status
        addm               a,nmode2

        mov                a,02h
        add                a,nmode2
        clr                status
        daa                nmode2
        mov                a,status
        addm               a,nmode3
        sz                 hmode2
        jmp                seach2
        sz                 hmode3
        jmp                seach3
        ret
seach3:
        dec                hmode3
        mov                a,36h
        add                a,nmode1
        clr                status
        daa                nmode1
        mov                a,status
        addm               a,nmode2

        mov                a,55h
        add                a,nmode2
        clr                status
        daa                nmode2
        mov                a,status
        addm               a,nmode3
        sz                 c
        inc                nmode4

        mov                a,06h
        add                a,nmode3
        daa                nmode3
        sz                 c
        inc                nmode4
        sz                 hmode3
        jmp                seach3
        ret
redeem:
        mov                a,status
        addm               a,nmode2

        clr                status
        mov                a,nmode2
        daa                nmode2
        mov                a,status
        addm               a,nmode3
        ret
;-----------------------------

抓取網卡序號(PhysicalAddress)

本程式只能抓取第一張網卡序號。
可以用來確認電腦身份。
以下程式碼要貼到模組上,使用時呼叫GetPhysicalAddress即可,傳回值為String。

複製程式碼(Copy to clipboard)

'此程式碼放置於模組內
Option Explicit

Public Const MAX_HOSTNAME_LEN = 132
Public Const MAX_DOMAIN_NAME_LEN = 132
Public Const MAX_SCOPE_ID_LEN = 260
Public Const MAX_ADAPTER_NAME_LENGTH = 260
Public Const MAX_ADAPTER_ADDRESS_LENGTH = 8
Public Const MAX_ADAPTER_DESCRIPTION_LENGTH = 132

Type IP_ADDR_STRING
            Next As Long
            IpAddress As String * 16
            IpMask As String * 16
            Context As Long
End Type

Type IP_ADAPTER_INFO
            Next As Long
            ComboIndex As Long
            AdapterName As String * MAX_ADAPTER_NAME_LENGTH
            Description As String * MAX_ADAPTER_DESCRIPTION_LENGTH
            AddressLength As Long
            Address(MAX_ADAPTER_ADDRESS_LENGTH - 1) As Byte
            Index As Long
            Type As Long
            DhcpEnabled As Long
            CurrentIpAddress As Long
            IpAddressList As IP_ADDR_STRING
            GatewayList As IP_ADDR_STRING
            DhcpServer As IP_ADDR_STRING
            HaveWins As Boolean
            PrimaryWinsServer As IP_ADDR_STRING
            SecondaryWinsServer As IP_ADDR_STRING
            LeaseObtained As Long
            LeaseExpires As Long
End Type

Public Declare Function GetAdaptersInfo Lib "IPHlpApi" (IpAdapterInfo As Any, pOutBufLen As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public Function GetPhysicalAddress() As String
    Dim AdapterInfoSize As Long
    Dim i As Integer
    Dim PhysicalAddress  As String
    Dim AdapterInfo As IP_ADAPTER_INFO
    Dim Buffer2 As IP_ADAPTER_INFO

    On Error GoTo ErrMsg

    GetAdaptersInfo ByVal 0&, AdapterInfoSize

    ReDim AdapterInfoBuffer(AdapterInfoSize - 1)

    GetAdaptersInfo AdapterInfoBuffer(0), AdapterInfoSize

    CopyMemory AdapterInfo, AdapterInfoBuffer(0), Len(AdapterInfo)

    CopyMemory Buffer2, AdapterInfo, Len(Buffer2)
   
    For i = 0 To Buffer2.AddressLength - 1
        PhysicalAddress = PhysicalAddress & Right("0" & Hex(Buffer2.Address(i)), 2)
        If i < Buffer2.AddressLength - 1 Then
            PhysicalAddress = PhysicalAddress & "-"
        End If
    Next
    GetPhysicalAddress = PhysicalAddress
    Exit Function
ErrMsg:
    GetPhysicalAddress = "Error"
End Function

2008-07-05

抓取Windows版本

以下程式放在模組中
只要呼叫GetOS_Version就能傳回OS版本
傳回資料型態為String

複製程式碼(copy to clipboard)

Option Explicit

Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
Public Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type
Public OS_Version As OSVERSIONINFO

Public Function GetOS_Version() As String
    OS_Version.dwOSVersionInfoSize = Len(OS_Version)
    GetVersionEx OS_Version
   
    If OS_Version.dwPlatformId = 2 Then
        GetOS_Version = "Windows" & " " & OS_Version.dwMajorVersion & "." & OS_Version.dwMinorVersion
    ElseIf OS_Version.dwPlatformId = 1 Then
        If OS_Version.dwMinorVersion = 90 Then
            GetOS_Version = "Windows Me"
        ElseIf OS_Version.dwMinorVersion = 10 Then
            GetOS_Version = "Windows 98"
        ElseIf OS_Version.dwMinorVersion = 0 Then
            GetOS_Version = "Windows 95"
        Else
            GetOS_Version = "Error"
        End If
    Else
        GetOS_Version = "Error"
    End If
End Function

Evis Ain 1.2.1359 beta

修正內容:
Master修正連線密碼錯誤時當掉的情況。
載點:
Evis Ain-Master v1.2.1359 (控制端)
Evis Ain-Servant v1.2.237 (被控端)
說明書
說明:
Evis Ain是用來管理遠端Windows電腦的免費軟體。
它的特色是能夠同時控制數台遠端電腦。
Evis Ain採用指令介面,並搭配巨集系統,讓使用者能夠自行編輯指令。
例如,Evis Ain沒有提供的功能使用者能夠自己寫一個執行檔,透過上傳加執行的指令來完成。
Screenshot:

2008-07-04

Evis - 控制端如何與被控端進行檔案傳輸

下載應該大家都會
上傳的話可能跟一般的軟體不太一樣
上傳:

↑先在本機的位置複製一個檔案 (也能用explorer複製檔案"Ctrl + C")


↑到遠端的檔案管理介面裡 選擇要存放的目錄並按下右鍵選擇Upload

Evis的上傳檔案路徑是從剪貼簿中讀取的
下載:

↑在遠端檔案的地方選取要下載的檔案 按下右鍵 選擇Download

下載的檔案一定會存放於Download資料夾內

副標籤:Evis使用教學

2008-07-03

Evis Ain 1.2.1358 beta 病毒掃瞄報告

Evis Ain-Master 1.2.1358 有一隻防毒軟體有反應
Evis Ain-Servant 1.2.237 有三隻防毒軟體有反應
我只能說是誤認
因為寫法真的很像是在寫後門 = =

檔案 Evis_Ain-Master.exe 接收於 2008.07.03 12:01:23 (CET)
反病毒引擎版本最後更新掃瞄結果
AhnLab-V32008.7.3.22008.07.03-
AntiVir7.8.0.642008.07.03-
Authentium5.1.0.42008.07.02-
Avast4.8.1195.02008.07.03-
AVG7.5.0.5162008.07.02-
BitDefender7.22008.07.03-
CAT-QuickHeal9.502008.07.02-
ClamAV0.93.12008.07.03-
DrWeb4.44.0.091702008.07.03-
eSafe7.0.17.02008.07.03-
eTrust-Vet31.6.59222008.07.02-
Ewido4.02008.07.02-
F-Prot4.4.4.562008.07.02-
F-Secure7.60.13501.02008.07.01Suspicious:W32/VB.bbx!Gemini
Fortinet3.14.0.02008.07.03-
GData2.0.7306.10232008.07.03-
IkarusT3.1.1.26.02008.07.03-
Kaspersky7.0.0.1252008.07.03-
McAfee53302008.07.02-
Microsoft1.37042008.07.03-
NOD32v232382008.07.03-
Norman5.80.022008.07.02-
Panda9.0.0.42008.07.02-
Prevx1V22008.07.03-
Rising20.51.32.002008.07.03-
Sophos4.30.02008.07.03-
Sunbelt3.1.1509.12008.07.03-
Symantec102008.07.03-
TheHacker6.2.96.3692008.07.03-
TrendMicro8.700.0.10042008.07.03-
VBA323.12.6.82008.07.02-
VirusBuster4.5.11.02008.07.02-
Webwasher-Gateway6.6.22008.07.03-
 
附加訊息
File size: 1265664 bytes
MD5...: 67afc6296099b5531145ee43c9fd2077
SHA1..: 8b3332b14d2682916950f375e339382ca0825e05
SHA256: 696c07b2c2489bce8e8d7dd2348dfe1e29ba38e65d7d2eae95f6804589d9cc26
SHA512: f52d5cf6abb65d9756ec7f1c043c853c096d6c7d8e89824509a37ccd8c173c12
829b6506082bf5a3333566578e0c98c403cd5ae04850a3d39d7f743dc68d98d0



------------------------------------------------------------------------------------
檔案 Evis_Ain-Servant.exe 接收於 2008.07.03 12:51:31 (CET)
反病毒引擎版本最後更新掃瞄結果
AhnLab-V32008.7.3.22008.07.03-
AntiVir7.8.0.642008.07.03-
Authentium5.1.0.42008.07.02-
Avast4.8.1195.02008.07.03-
AVG7.5.0.5162008.07.02-
BitDefender7.22008.07.03-
CAT-QuickHeal9.502008.07.02-
ClamAV0.93.12008.07.03-
DrWeb4.44.0.091702008.07.03-
eSafe7.0.17.02008.07.03-
eTrust-Vet31.6.59222008.07.02-
Ewido4.02008.07.02-
F-Prot4.4.4.562008.07.02-
F-Secure7.60.13501.02008.07.01Backdoor.Win32.VB.gen
Fortinet3.14.0.02008.07.03-
GData2.0.7306.10232008.07.03-
IkarusT3.1.1.26.02008.07.03-
Kaspersky7.0.0.1252008.07.03Backdoor.Win32.VB.gen
McAfee53302008.07.02-
Microsoft1.37042008.07.03-
NOD32v232382008.07.03-
Norman5.80.022008.07.02-
Panda9.0.0.42008.07.02Suspicious file
Prevx1V22008.07.03-
Rising20.51.32.002008.07.03-
Sophos4.30.02008.07.03-
Sunbelt3.1.1509.12008.07.03-
Symantec102008.07.03-
TheHacker6.2.96.3692008.07.03-
TrendMicro8.700.0.10042008.07.03-
VBA323.12.6.82008.07.02-
VirusBuster4.5.11.02008.07.02-
Webwasher-Gateway6.6.22008.07.03-
 
附加訊息
File size: 114688 bytes
MD5...: a8b3cec42707960569b1925c9195d5c7
SHA1..: 45c407fa882073a36addc6fb9f4e81f23ae6f7b3
SHA256: cb1a1cdff01747cd79d5ea169bdcc7a5df2ac7c5b3268657aff37fc19072b831
SHA512: 7e9291f09242d572dd0f52eb2a1d29ea6e85f8a05eb2934bfc8aa62a13b06d29
0339db87fbc12e52b57eecec96b3041077dc0e58a6a62b38887c2b363f6fe6df

2008-07-02

Evis AutoConnect功能使用教學

Evis能夠自動執行Connect [IP]指令
在Evis Ain-Master.exe檔案的旁邊有一個AutoConnect.ini
將要連線的IP填入即可
ex:
127.0.0.1
192.168.0.100

IP位置與IP位置之間使用換行進行分隔
之後在Evis裡執行 "AutoConnect ON"
這個狀態Evis會進行紀錄
因此下次使用Evis時不需要再次執行這個指令

副標籤:Evis使用教學

Evis Ain 1.2.1358 beta

F-IP Producer進行修正

Evis Ain 是遠端電腦管理軟體
她能同時控制數台遠端電腦

載點
http://www.phate.tw/evis/EvisAin_v1.2.1358_beta.rar


Evis如何使用反向連結建立連線

Evis 能夠去抓取 web 上的IP位置進行連結
我們拿hinet的免費網頁空間做示範


↑視窗標題上按右鍵選擇FTP Set


↑輸入FTP帳號跟密碼


↑在巨集中編輯要上傳的檔案位置 (要切換頁面巨集才會存檔喔~)
(UIP = UIP1 ftp://upload.myweb.hinet.net/IP.htm + UIP2 ftp://upload.myweb.hinet.net/IP.htm)


↑視窗標題上按右鍵選擇 F-IP File Producer


↑選擇HTTP Web (Master IP)
(Evis提供兩組連線位置,只使用一組或第二組使用IP, Domain Name都可以)


↑輸入IP位置存放的檔案網址


↑將evis06120903.dat存放於Evis Ain-Servant.exe旁邊


↑執行之前編輯好的UIP指令 (執行成功時會跑出藍色的字)


↑執行Evis Ain-Servant.exe


↑等候40秒左右Servant就會跟Master連線

副標籤:Evis使用教學

第一次使用Evis 記得設定密碼

第一次使用時建議設定密碼
這是要提高安全性使用的
控制端與被控端要密碼相符時才能進行操控



↑在視窗標題上按右鍵選擇 Evis Password


↑隨便輸入一串英文字母 事後忘記也沒關係 Evis 會進行儲存

存檔後這組密碼會在製作F-IP File時同時寫進去
也就是F-IP File製作完成後再去修改Evis的密碼時會造成無法連線的狀況

副標籤:Evis使用教學

2008-07-01

列舉/結束Process

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Program by Kelp
' 建立日期 2007/06/02
' 改版日期 2007/08/19
' 說明
' GetProcesses 取得所有Process名稱及ID 傳回值為String
' GetWindowsProcess 取得視窗標題及ProcessID 傳回值為String
' KillProcessById 藉由ProcessID關閉該Process 引數為Long
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


複製程式碼(copy to clipboard)

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'   Program by Kelp
'
'   建立日期    2007/06/02
'   改版日期    2007/08/19
'
'   說明
'       GetProcesses        取得所有Process名稱及ID     傳回值為String
'       GetWindowsProcess   取得視窗標題及ProcessID     傳回值為String
'       KillProcessById     藉由ProcessID關閉該Process  引數為Long
'
'   改版內容
'       增加列舉有視窗之Process函數
'       列舉時具有排序功能
'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Option Explicit

'PROCESSES
Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long

Public Coll As Collection
Public WindowsProc As String
Private ProcessesNum As Integer

Public Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Public Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function terminateprocess Lib "kernel32" Alias "TerminateProcess" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Public Const TH32CS_SNAPPROCESS = &H2
Public Const TH32CS_SNAPheaplist = &H1
Public Const TH32CS_SNAPthread = &H4
Public Const TH32CS_SNAPmodule = &H8
Public Const TH32CS_SNAPall = TH32CS_SNAPPROCESS + TH32CS_SNAPheaplist + TH32CS_SNAPthread + TH32CS_SNAPmodule
Public Const MAX_PATH As Integer = 260

Public Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long
    th32DefaultHeapID As Long
    th32ModuleID As Long
    cntThreads As Long
    th32ParentProcessID As Long
    pcPriClassBase As Long
    dwFlags As Long
    szExeFile As String * MAX_PATH
End Type

Public Type ProcessData
    ProcessName As String
    ProcessID As Long
End Type

Public Pro() As ProcessData
Dim FirstLoop As Boolean
   
Public Function GetProcesses() As String
    Dim ret
    Dim TheLoopingProcess
    Dim proc As PROCESSENTRY32
    Dim snap As Long
    Dim STemp As String
    Dim STemp2 As String
    Dim ILoop As Integer
    Dim ILoop2 As Integer
    Dim WordValue As Long
   
    ReDim Pro(0) As ProcessData
    snap = CreateToolhelpSnapshot(TH32CS_SNAPall, 0)    'get snapshot handle
    proc.dwSize = Len(proc)
    TheLoopingProcess = ProcessFirst(snap, proc)        'first process and return value

    FirstLoop = True
    GetProcesses = "[ID]" + vbTab + "[Process]"
    While TheLoopingProcess <> 0      'next process
        If proc.th32ProcessID <> 0 Then
            ILoop = ILoop + 1
            STemp = Left(proc.szExeFile, InStr(proc.szExeFile, Chr(0)) - 1)
            STemp2 = Right(STemp, 4)
            If Replace(STemp2, ".exe", "", , , vbTextCompare) = "" Then
                STemp = Mid(STemp, 1, Len(STemp) - 4)
            End If
            If FirstLoop Then
                Pro(0).ProcessID = proc.th32ProcessID
                Pro(0).ProcessName = STemp
                FirstLoop = False
            Else
                ReDim Preserve Pro(UBound(Pro) + 1) As ProcessData
                Pro(UBound(Pro)).ProcessID = proc.th32ProcessID
                Pro(UBound(Pro)).ProcessName = STemp
            End If
        End If
        proc.szExeFile = ""
        TheLoopingProcess = ProcessNext(snap, proc)
    Wend
    SortProcess
    For ILoop2 = 0 To UBound(Pro)
        GetProcesses = GetProcesses & vbCrLf & Pro(ILoop2).ProcessID & vbTab & Pro(ILoop2).ProcessName
    Next ILoop2
    GetProcesses = GetProcesses + vbCrLf + "Total :" + Str(ILoop)
    CloseHandle snap
End Function

Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
    Dim STemp As String, pid As Long
   
    If GetParent(hwnd) = 0 Then
        '讀取 hWnd 的視窗標題
        STemp = String(80, 0)
        GetWindowText hwnd, STemp, 80
        STemp = Left(STemp, InStr(STemp, Chr(0)) - 1)
        GetWindowThreadProcessId hwnd, pid
        '當沒有標題的hWnd之pid被加入Coll的Collection時,
        '若pid重覆會有錯,我們不管它
        On Error Resume Next
        If Len(STemp) <> 0 Then
            If IsWindowVisible(hwnd) Then
                ProcessesNum = ProcessesNum + 1
                STemp = Left(STemp, InStr(STemp, Chr(0)) - 1)
                If FirstLoop Then
                    Pro(0).ProcessID = pid
                    Pro(0).ProcessName = STemp
                    FirstLoop = False
                Else
                    ReDim Preserve Pro(UBound(Pro) + 1) As ProcessData
                    Pro(UBound(Pro)).ProcessID = pid
                    Pro(UBound(Pro)).ProcessName = STemp
                End If
            End If
        End If
    End If
    EnumWindowsProc = True ' 表示繼續列舉 hWnd
End Function

Public Sub SortProcess()    '程序排列,採用泡沫排序法。
    Dim PTemp As ProcessData
    Dim ILoop As Integer
    Dim ILoop2 As Integer
    Dim ILoop3 As Integer
    Dim Same As Boolean
    Dim Changed As Boolean
   
    For ILoop = 1 To UBound(Pro)
        Changed = False
        For ILoop2 = 0 To UBound(Pro) - 1
            If Len(Pro(ILoop2).ProcessName) < Len(Pro(ILoop2 + 1).ProcessName) Then
                For ILoop3 = 1 To Len(Pro(ILoop2).ProcessName)
                    If Val(Mid(Str(Asc(UCase(Mid(Pro(ILoop2 + 1).ProcessName, ILoop3, 1)))), 2)) < Val(Mid(Str(Asc(UCase(Mid(Pro(ILoop2).ProcessName, ILoop3, 1)))), 2)) Then
                        '下方資料較小,進行交換。
                        PTemp.ProcessName = Pro(ILoop2).ProcessName
                        PTemp.ProcessID = Pro(ILoop2).ProcessID
                        Pro(ILoop2).ProcessName = Pro(ILoop2 + 1).ProcessName
                        Pro(ILoop2).ProcessID = Pro(ILoop2 + 1).ProcessID
                        Pro(ILoop2 + 1).ProcessName = PTemp.ProcessName
                        Pro(ILoop2 + 1).ProcessID = PTemp.ProcessID
                        Changed = True
                        Exit For
                    ElseIf Val(Mid(Str(Asc(UCase(Mid(Pro(ILoop2 + 1).ProcessName, ILoop3, 1)))), 2)) > Val(Mid(Str(Asc(UCase(Mid(Pro(ILoop2).ProcessName, ILoop3, 1)))), 2)) Then
                        '下方資料較大,直接跳出。
                        Exit For
                    End If
                Next ILoop3
            Else
                Same = True
                For ILoop3 = 1 To Len(Pro(ILoop2 + 1).ProcessName)
                    If Val(Mid(Str(Asc(UCase(Mid(Pro(ILoop2 + 1).ProcessName, ILoop3, 1)))), 2)) < Val(Mid(Str(Asc(UCase(Mid(Pro(ILoop2).ProcessName, ILoop3, 1)))), 2)) Then
                        '下方資料較小,進行交換。
                        PTemp.ProcessName = Pro(ILoop2).ProcessName
                        PTemp.ProcessID = Pro(ILoop2).ProcessID
                        Pro(ILoop2).ProcessName = Pro(ILoop2 + 1).ProcessName
                        Pro(ILoop2).ProcessID = Pro(ILoop2 + 1).ProcessID
                        Pro(ILoop2 + 1).ProcessName = PTemp.ProcessName
                        Pro(ILoop2 + 1).ProcessID = PTemp.ProcessID
                        Changed = True
                        Same = False
                        Exit For
                    ElseIf Val(Mid(Str(Asc(UCase(Mid(Pro(ILoop2 + 1).ProcessName, ILoop3, 1)))), 2)) > Val(Mid(Str(Asc(UCase(Mid(Pro(ILoop2).ProcessName, ILoop3, 1)))), 2)) Then
                        '下方資料較大,直接跳出。
                        Same = False
                        Exit For
                    End If
                Next ILoop3
                If Same Then
                    '資料一樣但下方資料長度較短,進行交換。
                    PTemp.ProcessName = Pro(ILoop2).ProcessName
                    PTemp.ProcessID = Pro(ILoop2).ProcessID
                    Pro(ILoop2).ProcessName = Pro(ILoop2 + 1).ProcessName
                    Pro(ILoop2).ProcessID = Pro(ILoop2 + 1).ProcessID
                    Pro(ILoop2 + 1).ProcessName = PTemp.ProcessName
                    Pro(ILoop2 + 1).ProcessID = PTemp.ProcessID
                    Changed = True
                End If
            End If
        Next ILoop2
        If Not Changed Then
            '第二層洄圈完全沒進行過交換,排序直接結束。
            Exit Sub
        End If
    Next ILoop
End Sub

Public Sub KillProcessById(p_lngProcessId As Long)
    Dim lnghProcess As Long
    Dim lngReturn As Long
   
    lnghProcess = OpenProcess(1&, -1&, p_lngProcessId)
    lngReturn = terminateprocess(lnghProcess, 0&)
End Sub

Public Function GetWindowsProcess() As String
    Dim ILoop As Integer
   
    FirstLoop = True
    WindowsProc = "[ID]" + vbTab + "[Process]"
    ProcessesNum = 0
    ReDim Pro(0) As ProcessData
    EnumWindows AddressOf EnumWindowsProc, 0&
    SortProcess
    For ILoop = 0 To UBound(Pro)
        WindowsProc = WindowsProc & vbCrLf & Pro(ILoop).ProcessID & vbTab & Pro(ILoop).ProcessName
    Next ILoop
    GetWindowsProcess = WindowsProc + vbCrLf + "Total :" + Str(ProcessesNum)
End Function

Evis Ain 1.2.1356 beta

這次新增兩個指令
FSend跟FGet
這兩這指令用來上傳跟下載檔案
配合巨集使用會很有意思

說明書的部分也更新成1.2版
其實能算是Evis設計藍圖了
裡面有簡單說明Evis的架構


目前還是beta階段
有bug的話就請各位貼上來咯~

Evis Ain v1.2.1356 beta 載點
檔案更新 結束下載