VB 從零開始編外掛(二) |
|||
什么是nProtect? nProtect是設計用于保護個人電腦終端不被病毒和黑客程序感染的新概念的基于網絡的反黑客和反病毒的工具。他幫助確保所有輸入個人電腦終端的信息在網絡上不落入黑客手中。在最終用戶在執行電子貿易時,可以通過將nProtect配置在那些提供電子商務、進口貿易,電子貿易的金融機構的網站上,來提高安全等級。nProtect怎樣工作?nProtect是一種基于服務器端的解決方案并且當那些需要保護的任何網絡應用被運行時而自動啟動。nProtect被載入內存,所以最終用戶不需要安裝任何應用程序,只要nProtect啟動,就開始拒絕黑客工具和病毒的入侵! -------------------------------------------------------------------------------------------------------------------------------------------------------- 下面介紹它如何工作: 用戶登陸時nProtect自動啟動。 瀏覽器確認和自動安裝安全模塊到用戶的個人電腦。掃描黑客工具和病毒通知用戶目前的安全狀態如果有黑客工具和病毒嘗試刪除在被入侵時端駐留內存來鎖定黑客工具直到電腦或者nProtect關閉。 可惡的韓國人,把這個加進了網絡游戲。我只能說:“呸!” -------------------------------------------------------------------------------------------------------------------------------------------------------- 下面講講躲過NP的掃描的幾個方法: 一、FPE篇 臺灣人開發的東西,哎。出名了的,沒辦法誰叫它這么好呢! 1.先裝一個FPE把,呵呵←這個是廢話! 2.不要把安裝程序刪除,按照:開始→運行→regedit→HEKY_LOCAL_MACHINE→SOFTWARE →jaw→FPE 打開!(問:有什么用? 答:修改呀!) 3.運行FPE,然后在搜索里面輸入 ''jaw''(一定要家'''')一般是6個地址,然后全部都選中輸入: 313131c313131(意思就是111,兩邊多輸入31就是1111!)不要關FPE!(關了就完了!) 4.修改注冊表,把注冊表里面的jaw、FPE(FPE的是全改)關閉FPE出現對話框。(什么鳥語不認識!呵呵) 5.將現在FPE的文件夾修改為1112000(原來是FPE2000撒),把FPE.exe修改為111.exe 6.然后重新安裝一次FPE也把那個DLL文件復制到你修改過的FPE文件目錄下!(呵呵!) 7.開FPE進游戲里面亂來拉!哈哈 -------------------------------------------------------------------------------------------------------------------------------------------------------- 二、任務管理器篇 比爾·蓋茨那崽兒設計的東西,還可以在這上面派上用場!(問:是什么東西?答WINDOWS自帶的撒!呵呵!) 1.首先用快捷鍵Ctrl+Alt+Delete/.打開任務管理器 2.查看進程,一般垃圾點的網絡游戲會出現多的進程。你就殺了就行了! 3.沒有多的進程怎么辦?BIN這個是大多數網絡游戲都有的把,官方的登陸器和私服的登陸器一樣的,都是調用BIN進入游戲。登陸器打開后,更新完畢。點擊運行游戲,間隔幾秒殺掉登陸器的進程(這個要看你自己的計算機配置如何了,可能是2秒、可能是10秒!反正不超過15秒)這樣就可以閉屏NP拉! 呵呵又可以亂來了! -------------------------------------------------------------------------------------------------------------------------------------------------------- 三、直接篇 直接篇說白了就不用任何東西!怎么做?跟著我眼鏡來撒! 《封神榜》知道把?(答:不知道!反答:去死!)它的保護是有的,官方都已經公布了 但是有些人說《封神榜》沒NP,(注意:NP現在就是保護的代名詞了!)別聽那些人的! 首先,運行登陸器(更新的那個)進入游戲。關閉用登陸器進入的游戲馬上運行Game.exe 呵呵,沒NP了。FPE等東西可以亂來了。魔法疊加、免負重等等都可以實現! 還有一種就是DAT文件或者BIN文件直接修改為EXE。呵呵! -------------------------------------------------------------------------------------------------------------------------------------------------------- 四、編程篇(VB、VC、DELPHI等等!) 怎么辦呢?呵呵,我不懂怎么編VC和DELPHI的。***我就喜歡VB怎么著? VB可以簡單的實現虛擬nProtect的消息發送。具體的就不說了! 一句話虛擬nProtect消息(你不等于沒說嘛!)-_-!呵呵這個嘛......! 代碼就不寫了,麻煩。就像用WPE這些發包一樣的原理 |
VB 從零開始編外掛(三) | |
-------------------------------------------------------------------------------------------------------------------------------------------------------- 需要VB API函數: keybd_event ←函數模擬了鍵盤行動 -------------------------------------------------------------------------------------------------------------------------------------------------------- 相關API聲明: keybd_event ↓ Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal Scan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) -------------------------------------------------------------------------------------------------------------------------------------------------------- 需要的控件:Timer(interval不為空) -------------------------------------------------------------------------------------------------------------------------------------------------------- 代碼: Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal Scan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Sub Timer1_Timer() Call keybd_event(82, 0, 0, 0) ''模擬按下"R"鍵 End Sub -------------------------------------------------------------------------------------------------------------------------------------------------------- 其它模擬: 方法一: AppActivate sTitle SendKeys "5" 方法二: AppActivate sTitle SendKeys vbKey5 方法三: SendMessage Hwnd, WM_KEYDOWN, vbKey5, 0& SendMessage Hwnd, WM_KEYUP, vbKey5, 0& 方法四: AppActivate sTitle keybd_event 53, 0, 0, 0 keybd_event 53, 0, KEYEVENTF_KEYUP, 0 方法五: PostMessage lHwnd, WM_KEYDOWN, vbKey5, 0& PostMessage lHwnd, WM_KEYUP, vbKey5, 0& |
VB 從零開始編外掛(四) | |
-------------------------------------------------------------------------------------------------------------------------------------------------------- 需要VB API函數: GetAsyncKeyState ←判斷函數調用時指定虛擬鍵的狀態 -------------------------------------------------------------------------------------------------------------------------------------------------------- 相關API聲明: GetAsyncKeyState ↓ Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Integer Private Function MyHotKey(vKeyCode) As Boolean -------------------------------------------------------------------------------------------------------------------------------------------------------- 需要的控件:Timer(interval不為空) -------------------------------------------------------------------------------------------------------------------------------------------------------- 代碼: Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Integer Private Function MyHotKey(vKeyCode) As Boolean MyHotKey = (GetAsyncKeyState(vKeyCode) < 0) End Function ''然后在循環中或Timer的Timer事件中檢測: Private Sub Timer1_Timer() If MyHotKey(vbKeyA) And vbKeyControl Then ''ctrl+A End ''關閉 End If ''其中vbkeyA是鍵盤″A″的常數,其他鍵可按F1查得。 End Sub -------------------------------------------------------------------------------------------------------------------------------------------------------- 其它方法: 比如按下"ctrl+A"就退出! ''可以設置Form的KeyPreview屬性為True,然后在Form_KeyDown事件中添加代碼: Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = Asc("A") And Shift = vbCtrlMask Then unload me ''如果ctrl+A鍵被按下就退出 End Sub |
VB 從零開始編外掛(五) | |||||
-------------------------------------------------------------------------------------------------------------------------------------------------------- 需要VB API函數: mouse_event ←模擬一次鼠標事件 -------------------------------------------------------------------------------------------------------------------------------------------------------- 相關API聲明: mouse_event ↓ Private Declare Sub mouse_event Lib "user32" ( ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long ) -------------------------------------------------------------------------------------------------------------------------------------------------------- 定義變量: Const MOUSEEVENTF_LEFTDOWN = &H2 Const MOUSEEVENTF_LEFTUP = &H4 Const MOUSEEVENTF_MIDDLEDOWN = &H20 Const MOUSEEVENTF_MIDDLEUP = &H40 Const MOUSEEVENTF_MOVE = &H1 Const MOUSEEVENTF_ABSOLUTE = &H8000 Const MOUSEEVENTF_RIGHTDOWN = &H8 Const MOUSEEVENTF_RIGHTUP = &H10 -------------------------------------------------------------------------------------------------------------------------------------------------------- MOUSEEVENTF_LEFTDOWN''鼠標左鍵按下 MOUSEEVENTF_LEFTUP''鼠標松開 MOUSEEVENTF_RIGHTDOWN ''鼠標右鍵按下 MOUSEEVENTF_RIGHTUP''鼠標右鍵松開 -------------------------------------------------------------------------------------------------------------------------------------------------------- 代碼: Private Declare Sub mouse_event Lib "user32" ( ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long ) Const MOUSEEVENTF_LEFTDOWN = &H2 Const MOUSEEVENTF_LEFTUP = &H4 Const MOUSEEVENTF_MIDDLEDOWN = &H20 Const MOUSEEVENTF_MIDDLEUP = &H40 Const MOUSEEVENTF_MOVE = &H1 Const MOUSEEVENTF_ABSOLUTE = &H8000 Const MOUSEEVENTF_RIGHTDOWN = &H8 Const MOUSEEVENTF_RIGHTUP = &H10 ''這里是 鼠標左鍵按下 和松開兩個事件的組合即一次單擊 mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ''模擬鼠標右鍵單擊事件 mouse_event MOUSEEVENTF_RIGHTDOWN Or MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 ''兩次連續的鼠標左鍵單擊事件 構成一次鼠標雙擊事件 mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
![]()
|
VB 從零開始編外掛(七) |
|
文章類別:VB專區????發表日期:2005-08-21 |

-------------------------------------------------------------------------------------------------------------------------------------------------------- 鉤子:喜歡外掛的人都知道,很多外掛都是在游戲當中才能呼出。這個就用到了鉤子 N多人說:“哎,VB做鉤子想都別想!去學C語言吧!”只要大家遇到這種人,就別理會他。 可以說他是個垃圾。在實現鉤子方面VB可能沒有VC快,但是也不像那種人說的“想都別想” C語言,我最近幾天看了看。{ } ;這些太多了。腦袋也大了!可能那些學C語言的人是接觸電腦 編程的時候就學的它吧!但是呢,我接觸電腦學的就是VB。沒辦法我愛它! -------------------------------------------------------------------------------------------------------------------------------------------------------- 好了下面介紹簡單的鉤子吧! -------------------------------------------------------------------------------------------------------------------------------------------------------- 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 idHook是鉤子類型,如WH_KEYBOARD捕捉鍵盤消息,而WH_MOUSE捕捉鼠標消息。 hmod用于全局鉤子,VB要實現鉤子,必須設為0。 dwThreadId用于線程鉤子VB中可以設置為App.ThreadID。 lpfn為鉤子函數,在VB中可以使用AddressOf獲得鉤子函數的地址。 這個函數因為鉤子類型不同而有所不同。 -------------------------------------------------------------------------------------------------------------------------------------------------------- 如鍵盤鉤子為: Public Function KeyboardProc( ByVal nCode As Long , ByVal wParam As Long , ByVal lParam As Long ) As Long '如果Code不為0,鉤子函數必須調用CallNextHookEx,將消息傳遞給下面的鉤子。wParam和lParam不是按鍵 。 -------------------------------------------------------------------------------------------------------------------------------------------------------- 下面給大家一個VB鉤子運用很好的例子!(全局鉤子) 我在論壇上遇到了王者,王者可以說是我見到的VB最棒的一個人。可以說王者是個 VB狂人,很多學C語言的人看來VB不能實現的東西。王者都實現了!這不是在打廣告 這是真的。VB實現全局鉤子前幾年在某某VB學習網站上看見過“VB全局鉤子是根本不能實現的!站長發布”呵呵!真的有點駭人聽聞! 但是大家看到了下面這個“萬能吃藥”外掛就知道了! http://www.v2best.com/dispbbs.asp?boardID=6&ID=171&page=1 -------------------------------------------------------------------------------------------------------------------------------------------------------- 其它的就不多說了,開學了。到暑假的時候再寫東西吧! 希望大家努力,相信一點, 什么工具什么語言不重要,只要有思路就行! -------------------------------------------------------------------------------------------------------------------------------------------------------- |
VB 從零開始編外掛(八) | |
CountID = 0 ExitID = False ListView1.ColumnHeaders.Add 1, , "源 IP", 1500 ListView1.ColumnHeaders.Add 2, , "源端口", 1500 ListView1.ColumnHeaders.Add 3, , "目標 IP", 1500 ListView1.ColumnHeaders.Add 4, , "目標端口", 1500 ListView1.ColumnHeaders.Add 5, , "協議", 1500 ListView1.ColumnHeaders.Add 6, , "時間", 1500 End Sub Private Sub Form_Unload(Cancel As Integer) Call WCleanup(s) Unload Me End Sub Private Sub ListView1_Click() Dim coun As Long Dim sar As String, sar3 As String Dim sar1 As String, sar2 As String RichTextBox1.Text = "" ''清除 RichTextBox1 Dim buffer() As Byte buffer = str If ListView1.SelectedItem Is Nothing Then ''如果 ListView1 控件沒有數值則提示錯誤 Exit Sub End If ''將 buffer 的值(即通過 Recibir 接收的數據包)轉換為一定格式并在 RichTextBox1 控件下顯示出來 For i = 0 To resarray(ListView1.SelectedItem.Index) coun = coun + 1 If Len(Hex(buffer(i))) = 1 Then sar = "0" & Hex(buffer(i)) Else sar = Hex(buffer(i)) End If sar3 = sar3 & sar If Asc(Chr("&h" & Hex(buffer(i)))) < 32 Then sar1 = "." Else sar1 = Chr("&h" & Hex(buffer(i))) End If sar2 = sar2 & sar1 RichTextBox1.Text = RichTextBox1.Text & sar & " " If coun = 15 Then RichTextBox1.Text = RichTextBox1.Text & " |" & sar2 & vbCrLf: coun = 0 sar2 = "" sar3 = "" End If Next i If coun < 15 Then r = 44 - (coun * 3) + 1 es = String(r, Chr(32)) RichTextBox1.Text = RichTextBox1.Text & es & " |" & sar2 End If End Sub Private Sub M_Clear_Click() ListView1.ListItems.Clear RichTextBox1.Text = "" End Sub ''程序開始捕捉 Private Sub M_Start_Click() ListView1.ListItems.Clear RichTextBox1.Text = "" Connecting ip(hostname), MsgHwnd ''開始截取封包 End Sub Private Sub M_Stop_Click() ExitID = True ''停止截取封包 End Sub Private Sub MsgHwnd_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) CountID = CountID + 1 Recibir s, 1 If ExitID = True Then Call WCleanup(s) ExitID = False MsgBox "退出", vbOKOnly, "數據封包截取" End If End Sub 模塊: Option Explicit ''WSAstartup 用來判斷 Windows 所支持的 Winsock 版本,也就是初始化 Winsock DLL,其中第一個參數為你所想需要的Winsock版本!低字節為主版本,高字節為副版本!由于目前Winsock有兩個版本:1.1和2.2,因此該參數可以是0x101或0x202;第二個參數是一個WSADATA結構,用于接收函數的返回信息!WSAStartup函數調用成功會返回0,否則返回非0值! ''WSACleanup 用來關閉 Winsock,與 WSAstartup 一起使用,即 WSAstartup 也可以看為啟動 Winsock ''gethostbyname 用來返回一個關于主機信息的結構的指針 Public Declare Function WSAstartup Lib "wsock32.dll" Alias "WSAStartup" (ByVal wVersionRequired As Integer, ByRef lpWSAData As WSAdata) As Long Public Declare Function WsACleanup Lib "wsock32.dll" Alias "WSACleanup" () As Long Public Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long) Public Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Any) As Long Public Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long Public Declare Function inet_ntoa Lib "wsock32.dll" (ByVal addr As Long) As Long Public Declare Function gethostname Lib "wsock32.dll" (ByVal name As String, ByVal namelen As Long) As Long Public Declare Function gethostbyname Lib "wsock32.dll" (ByVal name As String) As Long Public Declare Function closesocket Lib "wsock32.dll" (ByVal s As Long) As Long Public Declare Function recv Lib "wsock32.dll" (ByVal s As Long, buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long Public Declare Function socket Lib "wsock32.dll" (ByVal af As Long, ByVal s_type As Long, ByVal protocol As Long) As Long Public Declare Function WSAAsyncSelect Lib "wsock32.dll" (ByVal s As Long, ByVal hWnd As Long, ByVal wMsg As Long, ByVal lEvent As Long) As Long Public Declare Function WSAIoctl Lib "ws2_32.dll" (ByVal s As Long, ByVal dwIoControlCode As Long, lpvInBuffer As Any, ByVal cbInBuffer As Long, lpvOutBuffer As Any, ByVal cbOutBuffer As Long, lpcbBytesReturned As Long, lpOverlapped As Long, lpCompletionRoutine As Long) As Long Public Declare Function inet_addr Lib "wsock32.dll" (ByVal cp As String) As Long Public Declare Function bind Lib "wsock32.dll" (ByVal s As Integer, addr As sockaddr, ByVal namelen As Integer) As Integer Public Declare Function ntohs Lib "wsock32.dll" (ByVal netshort As Long) As Integer Public Type WSAdata wVersion As Integer wHighVersion As Integer szDescription As String * 255 szSystemStatus As String * 128 iMaxSockets As Integer iMaxUdpDg As Integer lpVendorInfo As Long End Type ''sock 地址結構 Public Type sockaddr sin_family As Integer sin_port As Integer sin_addr As Long sin_zero As String * 8 End Type Public Type HOSTENT h_name As Long h_aliases As Long h_addrtype As Integer h_length As Integer h_addr_list As Long End Type ''ip 頭結構 Public Type ipheader lenver As Byte tos As Byte len As Integer ident As Integer flags As Integer ttl As Byte proto As Byte checksum As Integer sourceIP As Long destIP As Long End Type ''TCP 頭結構 Public Type tcp_hdr th_sport As Integer th_dport As Integer th_seq As Long th_ack As Long th_lenres As Byte th_flag As Byte th_win As Integer th_sum As Integer th_urp As Integer End Type ''UDP 頭結構 Public Type udp_hdr th_sport As Integer th_dport As Integer th_len As Integer th_sum As Integer End Type ''ICMP 頭結構 Public Type icmp_hdr th_type As Byte th_code As Byte th_sum As Integer th_id As Integer th_seq As Integer th_time As Long End Type ''常量 Public Const PF_INET = 2 Public Const SOCK_RAW = 3 Public Const AF_INET = 2 Public Const FD_READ = &H1 Public Const SIO_RCVALL = &H98000001 Public Const EM_REPLACESEL = &HC2 Public host As HOSTENT Public s As Long Public sock As sockaddr Public Header As ipheader Public tcpHead As tcp_hdr Public udpHead As udp_hdr Public icmpHead As icmp_hdr Public resarray() As Long, str As String Public i As Long, CountID As Long ''i 為臨時變量,循環語句用,CountID 用來計算一共有多少個數據包 Public protocol As String Public buffer() As Byte ''存放數據包 Public res As Long ''返回值,臨時變量 Public ExitID As Boolean ''退出標識 ''開始 Public Sub Wstartup() Dim Data As WSAdata Call WSAstartup(&H202, Data) ''初始化 Winsock 為 2.2 End Sub ''結束 Public Sub WCleanup(s As Long) Call WsACleanup ''關閉 Winsock closesocket s End Sub ''獲得當前主機的 IP Public Function ip(ByRef address As String) As String Dim pip As Long Dim uip As Long Dim s As Long Dim ss As String Dim cul As Long CopyMemory host, ByVal gethostbyname(address), Len(host) ''將 gethostbyname 獲得的值放到 host CopyMemory pip, ByVal host.h_addr_list, 4 ''將 host.h_addr_list 的值放到 pip CopyMemory uip, ByVal pip, 4 ''將 pip 的值放到 uip s = inet_ntoa(uip) ''將 uip 轉換為標準的 IPV4 格式 ss = Space(lstrlen(s)) ''去掉空格 cul = lstrcpy(ss, s) ip = ss ''獲得 IPV4 格式的地址并將其放如 ip End Function ''獲得當前機器的主機名 Public Function hostname() As String Dim r As Long Dim s As String Dim host As String Wstartup host = String(255, 0) r = gethostname(host, 255) ''獲得當前主機的主機名 If r = 0 Then hostname = Left(host, InStr(1, host, vbNullChar) - 1) End If End Function ''連接 IP Public Sub Connecting(ByRef ip As String, pic As PictureBox) Dim res As Long, buf As Long, bufb As Long buf = 1 Wstartup ''初始化 Winsock s = socket(AF_INET, SOCK_RAW, 0) ''創建套接字,s 是socket功能返回的文件描述符 If s < 1 Then Call WCleanup(s) Exit Sub ''如果創建失敗則退出 End If sock.sin_family = AF_INET ''socket類型 sock.sin_addr = inet_addr(ip) ''所用的IP地址 res = bind(s, sock, Len(sock)) ''綁定端口 If res <> 0 Then Call WCleanup(s) Exit Sub ''如果綁定失敗則退出 End If res = WSAIoctl(s, SIO_RCVALL, buf, Len(buf), 0, 0, bufb, ByVal 0, ByVal 0) ''改變Socket IO模式,將其改為混亂模式,即接受與自己無關的數據,則 SIO_RCVALL If res <> 0 Then Call WCleanup(s) Exit Sub End If res = WSAAsyncSelect(s, pic.hWnd, &H202, ByVal FD_READ) ''設置套接字處于阻塞方式或者非阻塞方式,消息發送的窗口是 pic,即 Form1.Picture1 If res <> 0 Then Call WCleanup(s) Exit Sub End If End Sub ''接收信息 Public Sub Recibir(s As Long, ByVal RecFormat As Long) If RecFormat = FD_READ Then ReDim buffer(2000) ''重定義緩沖區大小為 2000 Do res = recv(s, buffer(0), 2000, 0&) ''接收信息 If res > 0 Then ReDim Preserve resarray(CountID) ''改變數組大小,并保留以前的數據 str = buffer() resarray(CountID) = res CopyMemory Header, buffer(0), Len(Header) ''將 buffer 里面的數據復制到 Header 結構里面 ''根據IP頭結構的標識來獲得是什么類型的數據包,并將 IP 從頭結構中分離出來 If Header.proto = 1 Then protocol = "ICMP" proticmp inversaip(Hex(Header.destIP)), inversaip(Hex(Header.sourceIP)) End If If Header.proto = 6 Then protocol = "TCP" protcp inversaip(Hex(Header.destIP)), inversaip(Hex(Header.sourceIP)) End If If Header.proto = 17 Then protocol = "UDP" proudp inversaip(Hex(Header.destIP)), inversaip(Hex(Header.sourceIP)) End If End If Loop Until res <> 2000 End If End Sub ''將 16 進制轉換為 IP 地址 Public Function inversaip(ByRef lng As String) As String Dim ips As String Select Case Len(lng) Case 1 lng = "0000000" & lng Case 2 lng = "000000" & lng Case 3 lng = "00000" & lng Case 4 lng = "0000" & lng Case 5 lng = "000" & lng Case 6 lng = "00" & lng Case 7 lng = "0" & lng End Select For i = 1 To Len(lng) Step 2 ips = ips & Val("&h" & Mid(lng, Len(lng) - i, 2)) & "." Next i inversaip = Mid(ips, 1, Len(ips) - 1) End Function Public Function proticmp(saa As String, soc As String) As String Dim ListTemp As Variant Set ListTemp = Form1.ListView1.ListItems.Add(, , soc) ListTemp.SubItems(2) = saa ListTemp.SubItems(4) = protocol ListTemp.SubItems(5) = Time CopyMemory icmpHead, buffer(0 + 20), Len(icmpHead) End Function Public Sub protcp(saa As String, soc As String) Dim ListTemp As Variant CopyMemory tcpHead, buffer(0 + 20), Len(tcpHead) Set ListTemp = Form1.ListView1.ListItems.Add(, , soc) ListTemp.SubItems(1) = ntohs(tcpHead.th_sport) ListTemp.SubItems(2) = saa ListTemp.SubItems(3) = ntohs(tcpHead.th_dport) ListTemp.SubItems(4) = protocol ListTemp.SubItems(5) = Time End Sub Public Sub proudp(saa As String, soc As String) Dim ListTemp As Variant CopyMemory udpHead, buffer(0 + 20), Len(udpHead) Set ListTemp = Form1.ListView1.ListItems.Add(, , soc) ListTemp.SubItems(1) = ntohs(udpHead.th_sport) ListTemp.SubItems(2) = saa ListTemp.SubItems(3) = ntohs(udpHead.th_dport) ListTemp.SubItems(4) = protocol ListTemp.SubItems(5) = Time End Sub -------------------------------------------------------------------------------------------------------------------------------------------------------- 彩色的太費時間了,所以就直接貼了!呵呵! |
VB 從零開始編外掛(九) | |
-------------------------------------------------------------------------------------------------------------------------------------------------------- 網絡游戲封包分為2種封包:1。明文封包 2。加密封包 多數網絡游戲都是加密封包,其原因是為了信息不被修改。明文封包的也有,呵呵“CS”呀這些 -------------------------------------------------------------------------------------------------------------------------------------------------------- 好了,進入正題。封包這玩意其實很難。但是如果你入門了就不難了! 明文的好對付,BUT加密的就有點.......但也是有辦法滴 就是“多抓包,多分析,多解密!”呵呵! -------------------------------------------------------------------------------------------------------------------------------------------------------- 抓包篇:什么抓包呢?抓包當然就是用WPE,或者自己編寫軟件拉,上次(呵呵`也就是昨天)已經做過了! 0056DF38 4E 3E 54 53 56 55 4A 6C 77 64 63 42 4D 46 6A 6E N>TSVUJlwdcBMFjn 0056DF48 41 4B 62 3F 71 78 76 79 65 47 7A 66 4C 50 3D 5F AKb?qxvyeGzfLP=_ 0056DF58 45 52 40 5A 5C 61 6D 5D 43 68 67 6F 57 44 3B 51 ER@Z\am]ChgoWD;Q 0056DF68 75 58 5B 3C 74 6B 70 72 5E 60 69 49 48 4F 59 73 uX[<tkpr^`iIHOYs 0056DF78 2E 33 1E 01 13 22 10 0B 28 2D 20 0D 19 3C 3B 06 .3" (- .<; 0056DF88 11 1C 0C 00 3D 1D 2F 21 03 02 05 04 2C 31 3E 23 ..=/!,1># 0056DF98 32 24 27 38 1F 39 25 12 0A 09 18 1B 2A 29 3A 0E 2$''89%..*): 0056DFA8 35 07 26 0F 2B 36 14 37 3F 34 30 16 08 15 17 1A 5&+67?40 這個就是某個網絡游戲的封包!當然是加了密的。 00878BE0 55 41 4E 4E 4E 4E 4E 4E 4E 4E 4E 42 4E 4E 70 4E UANNNNNNNNNBNNpN 00878BF0 41 45 56 4E 3E 41 3E 58 79 4E 4B 65 AEVN>A>XyNKe 00878BE0 05 10 00 00 00 00 00 00 00 00 00 0B 00 00 36 00 ......... ..6. 00878BF0 10 20 04 00 01 10 01 31 17 00 11 18 .1. 0087CC04 15 00 00 00 00 00 00 00 0B 00 0D 80 42 01 00 05 ....... ..?B. 0087CC14 00 71 5C 04 58 .q\X 什么意思呢?當然就是要分析拉! -------------------------------------------------------------------------------------------------------------------------------------------------------- 分析篇:分析主要就是分析RAM里面的東西拉。可以到“看雪”去學學簡單的匯編命令 004F3B9C /$ 53 PUSH EBX 004F3B9D |. 83C4 F8 ADD ESP,-8 004F3BA0 |. 8BDA MOV EBX,EDX ; 解密后數據目標地址 004F3BA2 |. 8BD4 MOV EDX,ESP ; 數據傳遞目標地址 004F3BA4 |. B9 04000000 MOV ECX,4 ; 傳遞個數為 4 004F3BA9 |. E8 12EEF8FF CALL CLIENT.004829C0 ; 把侍解密的4數值傳遞過來進行解密 004F3BAE |. 8A0424 MOV AL,BYTE PTR SS:[ESP] ; 第一位 004F3BB1 |. C1E0 02 SHL EAX,2 004F3BB4 |. 33D2 XOR EDX,EDX 004F3BB6 |. 8A5424 01 MOV DL,BYTE PTR SS:[ESP+1] ; 第二位 004F3BBA |. C1EA 04 SHR EDX,4 004F3BBD |. 0AC2 OR AL,DL ; 第一位與每二位 0r 004F3BBF |. 8803 MOV BYTE PTR DS:[EBX],AL ; 輸出第1位 004F3BC1 |. 43 INC EBX ; 計數器+1 指向第二位 004F3BC2 |. 8A4424 01 MOV AL,BYTE PTR SS:[ESP+1] ; 第二位 004F3BC6 |. C1E0 04 SHL EAX,4 004F3BC9 |. 33D2 XOR EDX,EDX 004F3BCB |. 8A5424 02 MOV DL,BYTE PTR SS:[ESP+2] ; 第三位 004F3BCF |. C1EA 02 SHR EDX,2 004F3BD2 |. 0AC2 OR AL,DL ; 第二位與第三位 or 004F3BD4 |. 8803 MOV BYTE PTR DS:[EBX],AL ; 輸出第二位 004F3BD6 |. 43 INC EBX ; 計數器+1 指向第三位 004F3BD7 |. 8A4424 02 MOV AL,BYTE PTR SS:[ESP+2] ; 第三位 004F3BDB |. C1E0 06 SHL EAX,6 004F3BDE |. 8A5424 03 MOV DL,BYTE PTR SS:[ESP+3] ; 第4個 004F3BE2 |. 0AC2 OR AL,DL ; 第三個與第四個 or 004F3BE4 |. 8803 MOV BYTE PTR DS:[EBX],AL ; 輸出第三位 004F3BE6 |. 59 POP ECX 004F3BE7 |. 5A POP EDX 004F3BE8 |. 5B POP EBX 004F3BE9 \. C3 RETN 004F3BEA 8BC0 MOV EAX,EAX 004F3BEC /$ 53 PUSH EBX 004F3BED |. 56 PUSH ESI 004F3BEE |. 57 PUSH EDI 004F3BEF |. 55 PUSH EBP 004F3BF0 |. 50 PUSH EAX ; 封包 004F3BF1 |. B8 02000000 MOV EAX,2 004F3BF6 |> 81C4 04F0FFFF /ADD ESP,-0FFC 004F3BFC |. 50 |PUSH EAX 004F3BFD |. 48 |DEC EAX 004F3BFE |.^75 F6 \JNZ SHORT CLIENT.004F3BF6 004F3C00 |. 8B8424 0020000>MOV EAX,DWORD PTR SS:[ESP+2000] 004F3C07 |. 8BD9 MOV EBX,ECX 004F3C09 |. 8BFA MOV EDI,EDX 004F3C0B |. 8BD3 MOV EDX,EBX 004F3C0D |. 81E2 03000080 AND EDX,80000003 004F3C13 |. 79 05 JNS SHORT CLIENT.004F3C1A 004F3C15 |. 4A DEC EDX 004F3C16 |. 83CA FC OR EDX,FFFFFFFC 004F3C19 |. 42 INC EDX 004F3C1A |> 85D2 TEST EDX,EDX 004F3C1C |. 74 05 JE SHORT CLIENT.004F3C23 004F3C1E |. 83C8 FF OR EAX,FFFFFFFF 004F3C21 |. EB 7B JMP SHORT CLIENT.004F3C9E 004F3C23 |> 8BD3 MOV EDX,EBX 004F3C25 |. 85D2 TEST EDX,EDX 004F3C27 |. 79 03 JNS SHORT CLIENT.004F3C2C 004F3C29 |. 83C2 03 ADD EDX,3 004F3C2C |> C1FA 02 SAR EDX,2 004F3C2F |. 891424 MOV DWORD PTR SS:[ESP],EDX 004F3C32 |. 8D5424 04 LEA EDX,DWORD PTR SS:[ESP+4] 004F3C36 |. 8BCB MOV ECX,EBX 004F3C38 |. E8 83EDF8FF CALL CLIENT.004829C0 ; 整理出封包傳遞給解密地址進行解密 004F3C3D |. C6441C 04 00 MOV BYTE PTR SS:[ESP+EBX+4],0 004F3C42 |. 8B1C24 MOV EBX,DWORD PTR SS:[ESP] 004F3C45 |. C1E3 02 SHL EBX,2 004F3C48 |. 4B DEC EBX 004F3C49 |. 85DB TEST EBX,EBX 004F3C4B |. 7C 28 JL SHORT CLIENT.004F3C75 004F3C4D |. 43 INC EBX 004F3C4E |. 8D4424 04 LEA EAX,DWORD PTR SS:[ESP+4] ; 一個封包 004F3C52 |> 8A10 /MOV DL,BYTE PTR DS:[EAX] ; 第N位 004F3C54 |. 80FA 3B |CMP DL,3B 004F3C57 |. 72 05 |JB SHORT CLIENT.004F3C5E 004F3C59 |. 80FA 7A |CMP DL,7A 004F3C5C |. 76 05 |JBE SHORT CLIENT.004F3C63 004F3C5E |> 83C8 FF |OR EAX,FFFFFFFF ; 出錯處理 004F3C61 |. EB 3B |JMP SHORT CLIENT.004F3C9E 004F3C63 |> 81E2 FF000000 |AND EDX,0FF 004F3C69 |. 8A92 3DEF5A00 |MOV DL,BYTE PTR DS:[EDX+5AEF3D] ; 54ef3d是一串字符串. 004F3C6F |. 8810 |MOV BYTE PTR DS:[EAX],DL ; 轉換后代碼 004F3C71 |. 40 |INC EAX ; 下一個封包字符 004F3C72 |. 4B |DEC EBX ; 計數器減1 004F3C73 |.^75 DD \JNZ SHORT CLIENT.004F3C52 004F3C75 |> 8B1C24 MOV EBX,DWORD PTR SS:[ESP] 004F3C78 |. 4B DEC EBX 004F3C79 |. 85DB TEST EBX,EBX 004F3C7B |. 7C 1B JL SHORT CLIENT.004F3C98 004F3C7D |. 43 INC EBX 004F3C7E |. 33ED XOR EBP,EBP 004F3C80 |. 8D7424 04 LEA ESI,DWORD PTR SS:[ESP+4] ; 取上面轉化后的數值 004F3C84 |> 8D546D 00 /LEA EDX,DWORD PTR SS:[EBP+EBP*2] 004F3C88 |. 03D7 |ADD EDX,EDI ; 目標地址 每次轉化3 004F3C8A |. 8BC6 |MOV EAX,ESI ; 源地址 每次取 004F3C8C |. E8 0BFFFFFF |CALL CLIENT.004F3B9C ; 解密數據 (取4個.轉化3個) 004F3C91 |. 45 |INC EBP 004F3C92 |. 83C6 04 |ADD ESI,4 004F3C95 |. 4B |DEC EBX 004F3C96 |.^75 EC \JNZ SHORT CLIENT.004F3C84 004F3C98 |> 8B0424 MOV EAX,DWORD PTR SS:[ESP] 004F3C9B |. 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*2] 004F3C9E |> 81C4 04200000 ADD ESP,2004 004F3CA4 |. 5D POP EBP 004F3CA5 |. 5F POP EDI 004F3CA6 |. 5E POP ESI 004F3CA7 |. 5B POP EBX 004F3CA8 \. C3 RETN 什么意思?就是要解密后制作外掛拉! -------------------------------------------------------------------------------------------------------------------------------------------------------- 外掛的制作就不介紹了設計到VB匯編指針的問題了,VB指針的應用下一次給大家講! |
VB 從零開始編外掛(十) | |
我是直接用WPE截取的,因為金山游戲本身都有截取封包的保護措施(就像MM所說),直接用WPE截取我是截取不到的,后來用Ollydbg調試的時候才截取的到。 經過前面的準備,封報的明文準備已經OK,準備進行加密,加密方式是取一個4字節的數字,對封包進行Xor運算,運算完畢后就直接發送出去,我核對過用WPE截取封包的數據,和我看到的運算結果完全一致,這說明只要用那個4字節的數字對封包進行反Xor運算就可以得到明文的封包。 其實說白了那個4字節的數字就是每次加密的密匙,也就是服務器認可的,這個4字節怎么得出的我就沒跟了,暫時只發現只要不更換場景,4字節密匙不會更變。 相同道理,服務返回的信息也是經過4字節Xor運算處理了的,客戶端解密時候取服務端4字節密匙對封包進行解密就可以得到明文封包。 大體說下封神封包加密解密流程 Send: 1,制造明文封包 2,取4字節Send密匙 3,用4字節密匙對封包進行Xor運算(保留前2位),最后不足4字節進行單字節運算。 4,發送。 Revc: 1,收到封包 2,取4字節Revc密匙 3,用4字節密匙對封包進行Xor運算(保留前2位),最后不足4字節進行單字節運算。 4,對明文封包進行分析 -------------------------------------------------------------------------------------------------------------------------------------------------------- 以上的方法比較累人!下面說說本地制作吧(既是用大家熟悉的FPE等軟件) 制作輔助外掛(自動加血,自動加藍,免負重等等) HP的地址是不固定的,我使用金山游俠先找出當前的那個地址, 然后使用softice對該地址設置斷點,softice應該會立刻斷住, 你會看見MOV DWORD PTR DS:[EAX+ECX*8+EB4],EDI, 在客戶端中,位置是0x4B2C74, 你可以修改游戲的進程, 把MOV DWORD PTR DS:[EAX+ECX*8+EB4], EDI改成一個E9 XX XX XX XX 90 90, JMP到進程中.rsrc和.data之間的空余地址, 把(XX XX XX XX) + 0x4B2C74 + 5處的代碼修改成MOV Y, EDI, 下一條做原來的MOV DWORD PTR DS:[EAX+ECX*8+EB4],EDI, 再來個E9 ZZ ZZ ZZ ZZ, 設置好ZZ ZZ ZZ ZZ使其再跳到原來DWORD PTR DS:[EAX+ECX*8+EB4], EDI的下一句,就是0x4B2C7B處, 這樣HP的地址就固定下來了,只要看Y就知道HP了。 -------------------------------------------------------------------------------------------------------------------------------------------------------- 下面說說客服端的破解(小試牛刀!)有興趣的朋友可以制作一個DLL 來實現加血鎖定血量! .text:004E8EF0 sub_4E8EF0 proc near .text:004E8EF0 .text:004E8EF0 arg_0 = dword ptr 4 .text:004E8EF0 arg_4 = dword ptr 8 .text:004E8EF0 arg_8 = dword ptr 0Ch .text:004E8EF0 .text:004E8EF0 mov ecx, [esp+arg_0] ; 可能是長度LEN地址 .text:004E8EF4 push ebx .text:004E8EF5 mov eax, [esp+4+arg_4] ; 緩存地址 .text:004E8EF9 push esi .text:004E8EFA mov esi, ecx .text:004E8EFC push edi .text:004E8EFD mov edi, [esp+0Ch+arg_8] ; 加密KEY地址 .text:004E8F01 and esi, 3 ;相當于緩存長度除以4的余數 .text:004E8F04 shr ecx, 2 ;相當于緩存長度除以4的商 .text:004E8F07 mov edx, [edi] ;把加密KEY值放進edx .text:004E8F09 mov ebx, ecx ; .text:004E8F0B dec ecx ; .text:004E8F0C test ebx, ebx ; .text:004E8F0E jbe short loc_4E8F1E ;判斷跳轉 .text:004E8F10 inc ecx ; .text:004E8F11 .text:004E8F11 loc_4E8F11: .text:004E8F11 mov ebx, [eax] .text:004E8F13 add eax, 4 .text:004E8F16 xor ebx, edx ;異或運算,EDX=KEY的值,核心運算 .text:004E8F18 dec ecx .text:004E8F19 mov [eax-4], ebx .text:004E8F1C jnz short loc_4E8F11 ;相當于FOR循環運算 .text:004E8F1E .text:004E8F1E loc_4E8F1E: .text:004E8F1E mov ecx, esi .text:004E8F20 dec esi .text:004E8F21 test ecx, ecx .text:004E8F23 jbe short loc_4E8F35 .text:004E8F25 lea ecx, [esi+1] .text:004E8F28 .text:004E8F28 loc_4E8F28: .text:004E8F28 mov bl, [eax] .text:004E8F2A xor bl, dl ;異或運算 .text:004E8F2C mov [eax], bl .text:004E8F2E inc eax .text:004E8F2F shr edx, 8 .text:004E8F32 dec ecx .text:004E8F33 jnz short loc_4E8F28;相當于FOR循環運算 .text:004E8F35 .text:004E8F35 loc_4E8F35: KEY付值運算; .text:004E8F35 mov eax, [edi] .text:004E8F37 mov edx, eax .text:004E8F39 shl edx, 5 .text:004E8F3C sub edx, eax .text:004E8F3E mov eax, 1 .text:004E8F43 add edx, 8088405h .text:004E8F49 mov [edi], edx KEY付值 .text:004E8F4B pop edi .text:004E8F4C pop esi .text:004E8F4D pop ebx .text:004E8F4E retn .text:004E8F4E sub_4E8EF0 endp -------------------------------------------------------------------------------------------------------------------------------------------------------- |
VB 從零開始編外掛(十一) | |
-------------------------------------------------------------------------------------------------------------------------------------------------------- 顯血:7A0D3: 75 EB 超負重:99A40: 76 EB offset 原 改 防石化: 00466F80: 75 90 00466F81: 2E 90 穩如泰山: 0046959D: 20 44 004695A9: 14 38 如影隨行: 004634E2: 00 01 戰斗退出: 004620E6: 74 90 004620E7: 0D 90 00462162: 74 90 00462163: 0A 90 004914CA: 74 90 004914CB: 0E 90 00491576: 74 90 00491577: 0E 90 相對不卡: ——| 00463A8D: 99 00 | 0049B848: 2C 00 |—— 二選一 絕對不卡: | 00466F57: 00 01 ——| -------------------------------------------------------------------------------------------------------------------------------------------------------- 防止雙開: EB 1C A1 10 41 4A 00 修改為: 74 1C A1 10 41 4A 00 需要雙開就反過來改。 看血: 內存地址:47A0D3 75 EB 找 00000075108B45EC 修改為: 000000EB108B45EC 強退: 內存地址:004620E6(7) 74 90 0D 90 找 2000740D8B45 修改為: 200090908B45 內存地址:00462162(3) 74 90 0A 90 找 2000740A8B45 修改為: 200090908B45 內存地址:4914CA(B) 內存地址:491576(7) 74 90 0E 90 找 0080782000740EA1 修改為: 00807820009090A1 免助跑 內存地址:00461BEB(C-F0) 0F 90 8E 90 79 90 FD 90 FF 90 FF 90 找 E8000F8E79FDFFFF 修改為: E800909090909090 內存地址:461BB9(A-E) 0F 90 8C 90 DA 90 00 90 00 90 00 90 找 00010F8CDA000000A1 修改為: 0001909090909090A1 跑步砍 內存地址:004634E2 00 01 找 4F00008D45F0 修改為: 4F00018D45F0 攻擊速度 內存地址:467016(7) 78 E2 05 04 找 EB0BB87805 修改為: EB0BB84805 說明:速度由二位數指定,二位數前后互換為真實數據,數字大為慢小為快 穿人 內存地址:472D17 34 0C 找 00000034018845 修改為: 0000000C018845 免蠟 內存地址:471BDE 74 EB 找 008038007454 修改為: 00803800EB54 物品閃光 內存地址:471AA6 04 找 1300007625 修改為: 0200007625 自動放藥 找 0048C21F F9 68 FD FF 004623A2 76 07 00 00 修改為: 0048C21F DD 50 B0 01 004623A2 7A ED B2 01 超負重?? Poke 00499A40 EB 004975A8 EB 5C 00499A40 EB 93 攻擊方法修 原版 00463425 74 1C 0046344A 74 10 00463463 74 15 半月 00463425 74 1C 0046344A 74 10 00463463 90 90 攻殺 00463425 74 1C 0046344A 90 90 00463463 74 15 烈火 00463425 90 90 0046344A 74 10 00463463 74 15 方法二 半月 Poke 00463363 D0 烈火 Poke 00463363 D1 普通 Poke 00463363 C6 C745E8 C60B 單手砍 C745E8 C70B 雙手砍 C745E8 C80B 跳躍砍 C745E8 CA0B 攻殺 C745E8 CB0B 刺殺 C745E8 D00B 半月 C745E8 D10B 烈火 無限刺殺 內存地址:463363 C6 CB 找 C745E8C60B 修改為: C745E8CB0B 內存地址:463373 C7 CB 找 C745E8C70B 修改為: C745E8CB0B 無限攻殺 內存地址:463363 C6 CA 找 C745E8C60B 修改為: C745E8CA0B 內存地址:463373 C7 CA 找 C745E8C70B 修改為: C745E8CA0B 無限半月 內存地址:463363 C6 D0 找 C745E8C60B 修改為: C745E8D00B 內存地址:463373 C7 D0 找 C745E8C70B 修改為: C745E8D00B 無限烈火 內存地址:463363 C6 D1 找 C745E8C60B 修改為: C745E8D10B 內存地址:463373 C7 D1 找 C745E8C70B 修改為: C745E8D10B 自動放藥 找 0048C21F F9 68 FD FF 004623A2 76 07 00 00 修改為: 0048C21F DD 50 B0 01 004623A2 7A ED B2 01 免蠟 內存地址:471BDE 74 EB 找 008038007454 修改為: 00803800EB54 -------------------------------------------------------------------------------------------------------------------------------------------------------- 編程工具: 1.VC 高手的不二選擇 2.Borland C++Builder 如果當年是Borland做了操作系統而不是bill,也許我們現在的 編程工具更加智能更加方便更加接近人性化. 如果不喜歡VC那種事事必恭的編程方式, 就用它好了,除了我們用的操作系統不是由它造的之外,幾乎所有的編程都可以用它完 成. 3.Borland Delphi 和Borland C++Builder一樣,由同一家公司出品在RAD方面個人感覺 VB在它面前只是一個小學生.與VC比嘛,除了語法上不同之外,性能及編程方面都要比VC 強過很多,不過它不是bill的產品,所以有系統底層方面比VC要差一些,不過用它做個什 么外掛之類,它還是足以勝任的. 4.VB 這個就不多說了簡單的內存修改封包修改就它就好了,強烈推薦初學者使用,有了 經驗之后再用其它的工具,可以事倍功半. 內存工具: FPE2001 GameMaster Game Expert GameEnchanter 游神 金山游俠 ↑我最喜歡的幾樣工具(金山游俠除外),誰說網絡游戲不能修改。呵呵 封包修改工具 WPE winsock spyMaster ETF20 (PS:還有很多工具喲,不過不太智能化,不過也一樣有功能很強了.這些以后再介紹了) 輔助工具 變速齒輪 按鍵精靈 Trainer Maker Kit Magic Trainer Creator 反編譯調試脫殼工具 UltraEdit Softice TRW2000 W32Dasm OllyDbg SPY++ 脫SafeDisc SafeCast 2 殼工具 脫Aspack殼工具 脫ASPro殼工具 脫UPX殼工具 脫Armadillo殼工具 |
VB 從零開始編外掛(十二) | |
-------------------------------------------------------------------------------------------------------------------------------------------------------- CopyMemory函數提供了一個簡單的方法來執行C++中見解訪問運算符(*),這個運算符可以訪問被一個指針變量所指向的變量的值。 即如有指針變量 P,在C++中可以簡單的用 *P 來訪問,那在 VB 中怎么訪問呢? 在 VB 中,我們可以使用 CopyMemory函數別名。 Declare Sub VBGetTarget Lb "kernel32" Alias "RtlMoveMemory"(Target As Any,ByVal lPoint As Long,ByVal cbCopy As Long) 例子: Dim Pointer As Long Dim Target As Integer Dim i As Integer i=123 Pointer=VarPtr(i) ''獲得指針 VBGetTarget Target,Pointer,LenB(Target) Debug.Print Target -------------------------------------------------------------------------------------------------------------------------------------------------------- 很長時間以來,都認為只能通過絕對路徑引用標準DLL中的函數。其實,你也可以用相對路徑。很簡單的,現在就嘗試一下吧。 1)絕對路徑方法 比如你的DLL文件位于c:\testDLL\debug\testDLL.dll 一般來說,你需要在VB中作如下聲明 Declare Sub mytest Lib "c:\testDLL\dubug\testDLL.dll" (ByVal x As Long) 另外的一個變通方法是把testDLL.dll放在windows的系統目錄下,這樣,你就可以直接引用文件名了。不過,需要把一個文件放到windows系統目錄下,很是不爽! 2)相對路徑方法 看看我們如何用相對路徑,假設你的DLL文件位于c:\testDLL\debug\testDLL.dll,你的VB程序位于目錄c:\testDLL\vbClient 你可以在VB程序中作如下聲明: Declare Sub mytest Lib "../dubug/testDLL.dll" (ByVal x As Long) 如果直接運行你的VB程序,系統會提示錯誤:找不到../dubug/testDLL.dll. 為了使上面的聲明其作用,先暫時關閉你的VB工程。然后用一個文本編輯器(notepad,editplus,etc)打開工程文件(就是那個后綴是vbp的家伙),通常vbp文件由幾個部分組成。 |