接着外掛教程 VB 從零開始編外掛
需要VBAPI函數: FindWindow←尋找窗口列表中第一個符合指定條件的頂級窗口 GetWindowThreadProcessId←獲取與指定窗口關聯在一起的一個進程和線程標識符 -------------------------------------------------------------------------------------------------------------------------------------------------------- 相關API聲明: FindWindow ↓ PrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLong GetWindowThreadProcessId ↓ PrivateDeclareFunctionGetWindowThreadProcessIdLib"user32"(ByValhwndAsLong,lpdwProcessIdAsLong) AsLong -------------------------------------------------------------------------------------------------------------------------------------------------------- 需要的控件:Label、Timer --------------------------------------------------------------------------------------------------------------------------------------------------------自定義函數: DimhwndAsLong --------------------------------------------------------------------------------------------------------------------------------------------------------源代碼: PrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLong PrivateDeclareFunctionGetWindowThreadProcessIdLib"user32"(ByValhwndAsLong,lpdwProcessIdAsLong)AsLong PrivateSubTimer1_Timer() DimhwndAsLong''儲存FindWindow函數返回的句柄 hwnd=FindWindow(vbNullString,"WindowsMediaPlayer")''取得進程標識符 ''只要把WindowsMediaPlayer換成遊戲的名稱就可了! Ifhwnd=0Then Label1.Caption="遊戲未運行" Else Label1.Caption="遊戲已運行" EndIf EndSub 相信大家,在製作遊戲外掛的時候,都會用到FPE、金山遊俠、GE修改器、GameMaster8.0等等這些軟件,但是如今的網絡遊戲基本上都加了NP,下面來了解一下NP。知己知彼,百戰不殆嘛! 什麼是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這些發包一樣的原理 躲避了NP的掃描現在就可以模擬了! -------------------------------------------------------------------------------------------------------------------------------------------------------- 需要VBAPI函數: keybd_event←函數模擬了鍵盤行動 -------------------------------------------------------------------------------------------------------------------------------------------------------- 相關API聲明: keybd_event ↓ PrivateDeclareSubkeybd_eventLib"user32"(ByValbVkAsByte,ByValScanAsByte,ByValdwFlagsAsLong,ByValdwExtraInfoAsLong) -------------------------------------------------------------------------------------------------------------------------------------------------------- 需要的控件:Timer(interval不爲空) -------------------------------------------------------------------------------------------------------------------------------------------------------- 代碼: PrivateDeclareSubkeybd_eventLib"user32"(ByValbVkAsByte,ByValScanAsByte,ByValdwFlagsAsLong,ByValdwExtraInfoAsLong) PrivateSubTimer1_Timer() Callkeybd_event(82,0,0,0)''模擬按下"R"鍵 EndSub -------------------------------------------------------------------------------------------------------------------------------------------------------- 其它模擬: 方法一: AppActivatesTitle SendKeys"5" 方法二: AppActivatesTitle SendKeysvbKey5 方法三: SendMessageHwnd,WM_KEYDOWN,vbKey5,0& SendMessageHwnd,WM_KEYUP,vbKey5,0& 方法四: AppActivatesTitle keybd_event53,0,0,0 keybd_event53,0,KEYEVENTF_KEYUP,0 方法五: PostMessagelHwnd,WM_KEYDOWN,vbKey5,0& PostMessagelHwnd,WM_KEYUP,vbKey5,0& 前邊談了模擬鍵盤,下面說說模擬鼠標。 -------------------------------------------------------------------------------------------------------------------------------------------------------- 需要VBAPI函數: mouse_event←模擬一次鼠標事件 -------------------------------------------------------------------------------------------------------------------------------------------------------- 相關API聲明: mouse_event ↓ PrivateDeclareSubmouse_eventLib"user32"(ByValdwFlagsAsLong,ByValdxAsLong,ByValdyAsLong,ByValcButtonsAsLong,ByValdwExtraInfoAsLong) -------------------------------------------------------------------------------------------------------------------------------------------------------- 定義變量: ConstMOUSEEVENTF_LEFTDOWN=&H2 ConstMOUSEEVENTF_LEFTUP=&H4 ConstMOUSEEVENTF_MIDDLEDOWN=&H20 ConstMOUSEEVENTF_MIDDLEUP=&H40 ConstMOUSEEVENTF_MOVE=&H1 ConstMOUSEEVENTF_ABSOLUTE=&H8000 ConstMOUSEEVENTF_RIGHTDOWN=&H8 ConstMOUSEEVENTF_RIGHTUP=&H10 -------------------------------------------------------------------------------------------------------------------------------------------------------- MOUSEEVENTF_LEFTDOWN''鼠標左鍵按下 MOUSEEVENTF_LEFTUP''鼠標鬆開 MOUSEEVENTF_RIGHTDOWN''鼠標右鍵按下 MOUSEEVENTF_RIGHTUP''鼠標右鍵鬆開 -------------------------------------------------------------------------------------------------------------------------------------------------------- 代碼: PrivateDeclareSubmouse_eventLib"user32"(ByValdwFlagsAsLong,ByValdxAsLong,ByValdyAsLong,ByValcButtonsAsLong,ByValdwExtraInfoAsLong) ConstMOUSEEVENTF_LEFTDOWN=&H2 ConstMOUSEEVENTF_LEFTUP=&H4 ConstMOUSEEVENTF_MIDDLEDOWN=&H20 ConstMOUSEEVENTF_MIDDLEUP=&H40 ConstMOUSEEVENTF_MOVE=&H1 ConstMOUSEEVENTF_ABSOLUTE=&H8000 ConstMOUSEEVENTF_RIGHTDOWN=&H8 ConstMOUSEEVENTF_RIGHTUP=&H10 ''這裏是鼠標左鍵按下和鬆開兩個事件的組合即一次單擊 mouse_eventMOUSEEVENTF_LEFTDOWNOrMOUSEEVENTF_LEFTUP,0,0,0,0 ''模擬鼠標右鍵單擊事件 mouse_eventMOUSEEVENTF_RIGHTDOWNOrMOUSEEVENTF_RIGHTUP,0,0,0,0 ''兩次連續的鼠標左鍵單擊事件構成一次鼠標雙擊事件 mouse_eventMOUSEEVENTF_LEFTDOWNOrMOUSEEVENTF_LEFTUP,0,0,0,0 mouse_eventMOUSEEVENTF_LEFTDOWNOrMOUSEEVENTF_LEFTUP,0,0,0,0 應用實戰 -------------------------------------------------------------------------------------------------------------------------------------------------------- 需要VBAPI函數: FindWindow GetWindowThreadProcessId OpenProcess ReadProcessMemory CloseHandle -------------------------------------------------------------------------------------------------------------------------------------------------------- 相關API聲明: FindWindow ↓ PrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLong GetWindowThreadProcessId ↓ PrivateDeclareFunctionGetWindowThreadProcessIdLib"user32"(ByValhwndAsLong,lpdwProcessIdAsLong) AsLong OpenProcess ↓ PrivateDeclareFunctionOpenProcessLib"kernel32"(ByValdwDesiredAccessAsLong,ByValbInherITHandleAsLong,ByValdwProcessIdAsLong)AsLong ReadProcessMemory ↓ PrivateDeclareFunctionReadProcessMemoryLib"kernel32"(ByValhProcessAsLong,ByVallpBaseAddressAsAny,ByVallpBufferAsAny,ByValnSizeAsLong,lpNumberOfBytesWrittenAsLong)AsLong CloseHandle ↓ PrivateDeclareFunctionCloseHandleLib"kernel32"(ByValhObjectAsLong)AsLong GetCurrentProcess ↓ PrivateDeclareFunctionGetCurrentProcessLib"kernel32"()AsLong -------------------------------------------------------------------------------------------------------------------------------------------------------- 需要的控件:Label、Timer(interval不爲空)、Text -------------------------------------------------------------------------------------------------------------------------------------------------------- 定義函數: DimSetHpAsInteger''定義設定的體力值 DimSetMpAsInteger''定義設定的魔法值 DimNowHpAsLong''定義目前的體力值 DimNowMpAsLong''定義目前的魔法值 DimMaxHpAsLong''定義角色的最高體力值 DimMaxMpAsLong''定義角色的最高魔法值 DimDiZhiAsLong''定義內存地址函數 DimhwndAsLong''儲存FindWindow函數返回的句柄 -------------------------------------------------------------------------------------------------------------------------------------------------------- 代碼: PrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLong PrivateDeclareFunctionGetWindowThreadProcessIdLib"user32"(ByValhwndAsLong,lpdwProcessIdAsLong) AsLong PrivateDeclareFunctionOpenProcessLib"kernel32"(ByValdwDesiredAccessAsLong,ByValbInheritHandleAsLong,ByValdwProcessIdAsLong)AsLong PrivateDeclareFunctionReadProcessMemoryLib"kernel32"(ByValhProcessAsLong,ByVallpBaseAddressAsAny,ByVallpBufferAsAny,ByValnSizeAsLong,lpNumberOfBytesWrittenAsLong)AsLong PrivateDeclareFunctionCloseHandleLib"kernel32"(ByValhObjectAsLong)AsLong PrivateDeclareFunctionGetCurrentProcessLib"kernel32"()AsLong DimSetHpAsInteger''定義設定的體力值 DimSetMpAsInteger''定義設定的魔法值 DimNowHpAsLong''定義目前的體力值 DimNowMpAsLong''定義目前的魔法值 DimMaxHpAsLong''定義角色的最高體力值 DimMaxMpAsLong''定義角色的最高魔法值 DimDiZhiAsLong''定義內存地址函數 PrivateFunctionncnr(lpADDressAsLong)AsInteger ''聲明一些需要的變量 DimhwndAsLong''儲存FindWindow函數返回的句柄 DimpidAsLong''儲存進程標識符(ProcessId) DimpHandleAsLong''儲存進程句柄 hwnd=FindWindow(vbNullString,"封神榜·網絡版") ''取得進程標識符 GetWindowThreadProcessIdhwnd,pid ''使用進程標識符取得進程句柄 pHandle=OpenProcess(PROCESS_ALL_ACCESS,False,pid) ''在內存地址中讀取數據 ReadProcessMemorypHandle,lpADDress,ByValVarPtr(ncnr),4,0& ''關閉進程句柄 CloseHandlehProcess EndFunction ConstSTANDARD_RIGHTS_REQUIRED=&HF0000 ConstSYNCHRONIZE=&H100000 ConstSPECIFIC_RIGHTS_ALL=&HFFFF ConstSTANDARD_RIGHTS_ALL=&H1F0000 ConstPROCESS_ALL_ACCESS=STANDARD_RIGHTS_REQUIREDOrSYNCHRONIZEOr&HFFF ConstPROCESS_VM_OPERATION=&H8& ConstPROCESS_VM_READ=&H10& ConstPROCESS_VM_WRITE=&H20& PrivateSubForm_Load() ''體力:07F68F3這裏替換你所搜索到的地址魔法:07F6860同前 DiZhi=&H07F68F3 Timer1.Enabled=True Timer2.Enabled=False Timer3.Enabled=False EndSub PrivateSubTimer1_Timer() DimhwndAsLong hwnd=FindWindow(vbNullString,"封神榜·網絡版") Ifhwnd=0Then Label12.Caption="遊戲未加載" Timer1.Enabled=True Timer2.Enabled=False Timer3.Enabled=False ExitSub EndIf Label12.Caption="遊戲已加載" SetHp=Text1.Text''獲取設定的體力值 SetMp=Text2.Text''獲取設定的魔法值 NowHp=ncnr(DiZhi)''獲取當前的體力值 NowMp=ncnr(DiZhi+12)''獲取當前的魔法值 MaxHp=ncnr(DiZhi+4)''獲取角色的最高體力值 MaxMp=ncnr(DiZhi+16)''獲取角色的最高魔法值 Label3.Caption=Str(NowHp)+"/"+Str(MaxHp)''顯示角色體力值狀態 Label4.Caption=Str(NowMp)+"/"+Str(MaxMp)''顯示角色魔法值狀態 IfCheck1.ValueThen Timer2.Enabled=True Else Timer2.Enabled=False EndIf IfCheck2.ValueThen Timer3.Enabled=True Else Timer3.Enabled=False EndIf EndSub PrivateSubTimer2_Timer() ''體力值小於設定值按下數字鍵1 If(NowHp)<SetHpThen SendKeys"1" EndIf EndSub PrivateSubTimer3_Timer() ''魔法值小於設定值按下數字鍵2 If(NowMp)<SetMpThen SendKeys"2" EndIf EndSub -------------------------------------------------------------------------------------------------------------------------------------------------------- 鉤子:喜歡外掛的人都知道,很多外掛都是在遊戲當中才能呼出。這個就用到了鉤子 N多人說:“哎,VB做鉤子想都別想!去學C語言吧!”只要大家遇到這種人,就別理會他。 可以說他是個垃圾。在實現鉤子方面VB可能沒有VC快,但是也不像那種人說的“想都別想” C語言,我最近幾天看了看。{};這些太多了。腦袋也大了!可能那些學C語言的人是接觸電腦 編程的時候就學的它吧!但是呢,我接觸電腦學的就是VB。沒辦法我愛它! -------------------------------------------------------------------------------------------------------------------------------------------------------- 好了下面介紹簡單的鉤子吧! -------------------------------------------------------------------------------------------------------------------------------------------------------- SetWindowsHookEx定義如下: DeclareFunctionSetWindowsHookExLib"user32"Alias"SetWindowsHookExA"(ByValidHookAsLong,ByVallpfnAsLong,ByValhmodAsLong,ByValdwThreadIdAsLong)AsLong idHook是鉤子類型,如WH_KEYBOARD捕捉鍵盤消息,而WH_MOUSE捕捉鼠標消息。 hmod用於全局鉤子,VB要實現鉤子,必須設爲0。 dwThreadId用於線程鉤子VB中可以設置爲App.ThreadID。 lpfn爲鉤子函數,在VB中可以使用AddressOf獲得鉤子函數的地址。 這個函數因爲鉤子類型不同而有所不同。 -------------------------------------------------------------------------------------------------------------------------------------------------------- 如鍵盤鉤子爲: PublicFunctionKeyboardProc(ByValnCodeAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong ''如果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 -------------------------------------------------------------------------------------------------------------------------------------------------------- 其它的就不多說了,開學了。到暑假的時候再寫東西吧! 希望大家努力,相信一點, 什麼工具什麼語言不重要,只要有思路就行! 做外掛的人都知道,目前有兩種辦法制作網絡遊戲外掛。一種是封包式另外一種是內存式!下面就給大家制作一個抓包器,來研究一下,網絡遊戲的數據! ---------------------------------------------------------------------------------------------------- PrivateSubForm_Load() CountID=0 ExitID=False ListView1.ColumnHeaders.Add1,,"源IP",1500 ListView1.ColumnHeaders.Add2,,"源端口",1500 ListView1.ColumnHeaders.Add3,,"目標IP",1500 ListView1.ColumnHeaders.Add4,,"目標端口",1500 ListView1.ColumnHeaders.Add5,,"協議",1500 ListView1.ColumnHeaders.Add6,,"時間",1500 EndSub PrivateSubForm_Unload(CancelAsInteger) CallWCleanup(s) UnloadMe EndSub PrivateSubListView1_Click() DimcounAsLong DimsarAsString,sar3AsString Dimsar1AsString,sar2AsString RichTextBox1.Text=""''清除RichTextBox1 Dimbuffer()AsByte buffer=str IfListView1.SelectedItemIsNothingThen''如果ListView1控件沒有數值則提示錯誤 ExitSub EndIf ''將buffer的值(即通過Recibir接收的數據包)轉換爲一定格式並在RichTextBox1控件下顯示出來 Fori=0Toresarray(ListView1.SelectedItem.Index) coun=coun+1 IfLen(Hex(buffer(i)))=1Then sar="0"&Hex(buffer(i)) Else sar=Hex(buffer(i)) EndIf sar3=sar3&sar IfAsc(Chr("&h"&Hex(buffer(i))))<32Then sar1="." Else sar1=Chr("&h"&Hex(buffer(i))) EndIf sar2=sar2&sar1 RichTextBox1.Text=RichTextBox1.Text&sar&"" Ifcoun=15Then RichTextBox1.Text=RichTextBox1.Text&"|"&sar2&vbCrLf: coun=0 sar2="" sar3="" EndIf Nexti Ifcoun<15Then r=44-(coun*3)+1 es=String(r,Chr(32)) RichTextBox1.Text=RichTextBox1.Text&es&"|"&sar2 EndIf EndSub PrivateSubM_Clear_Click() ListView1.ListItems.Clear RichTextBox1.Text="" EndSub ''程序開始捕捉 PrivateSubM_Start_Click() ListView1.ListItems.Clear RichTextBox1.Text="" Connectingip(hostname),MsgHwnd''開始截取封包 EndSub PrivateSubM_Stop_Click() ExitID=True''停止截取封包 EndSub PrivateSubMsgHwnd_MouseUp(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle) CountID=CountID+1 Recibirs,1 IfExitID=TrueThen CallWCleanup(s) ExitID=False MsgBox"退出",vbOKOnly,"數據封包截取" EndIf EndSub 模塊: OptionExplicit ''WSAstartup用來判斷Windows所支持的Winsock版本,也就是初始化WinsockDLL,其中第一個參數爲你所想需要的Winsock版本!低字節爲主版本,高字節爲副版本!由於目前Winsock有兩個版本:1.1和2.2,因此該參數可以是0x101或0x202;第二個參數是一個WSADATA結構,用於接收函數的返回信息!WSAStartup函數調用成功會返回0,否則返回非0值! ''WSACleanup用來關閉Winsock,與WSAstartup一起使用,即WSAstartup也可以看爲啓動Winsock ''gethostbyname用來返回一個關於主機信息的結構的指針 PublicDeclareFunctionWSAstartupLib"wsock32.dll"Alias"WSAStartup"(ByValwVersionRequiredAsInteger,ByReflpWSADataAsWS Adata)AsLong PublicDeclareFunctionWsACleanupLib"wsock32.dll"Alias"WSACleanup"()AsLong PublicDeclareSubCopyMemoryLib"kernel32.dll"Alias"RtlMoveMemory"(DestinationAsAny,SourceAsAny,ByVallengthAsLong) PublicDeclareFunctionlstrlenLib"kernel32.dll"Alias"lstrlenA"(ByVallpStringAsAny)AsLong PublicDeclareFunctionlstrcpyLib"kernel32.dll"Alias"lstrcpyA"(ByVallpString1AsAny,ByVallpString2AsAny)AsLong PublicDeclareFunctioninet_ntoaLib"wsock32.dll"(ByValaddrAsLong)AsLong PublicDeclareFunctiongethostnameLib"wsock32.dll"(ByValnameAsString,ByValnamelenAsLong)AsLong PublicDeclareFunctiongethostbynameLib"wsock32.dll"(ByValnameAsString)AsLong PublicDeclareFunctionclosesocketLib"wsock32.dll"(ByValsAsLong)AsLong PublicDeclareFunctionrecvLib"wsock32.dll"(ByValsAsLong,bufAsAny,ByValbuflenAsLong,ByValflagsAsLong)AsLong PublicDeclareFunctionsocketLib"wsock32.dll"(ByValafAsLong,ByVals_typeAsLong,ByValprotocolAsLong)AsLong PublicDeclareFunctionWSAAsyncSelectLib"wsock32.dll"(ByValsAsLong,ByValhWndAsLong,ByValwMsgAsLong,ByVallEventAsLong)AsLong PublicDeclareFunctionWSAIoctlLib"ws2_32.dll"(ByValsAsLong,ByValdwIoControlCodeAsLong,lpvInBufferAsAny,ByValcbInBufferAsLong,lpvOutBufferAsAny,ByValcbOutBufferAsLong,lpcbBytesReturnedAsLong,lpOverlappedAsLong,lpCompletionRoutineAsLong)AsLong PublicDeclareFunctioninet_addrLib"wsock32.dll"(ByValcpAsString)AsLong PublicDeclareFunctionbindLib"wsock32.dll"(ByValsAsInteger,addrAssockaddr,ByValnamelenAsInteger)AsInteger PublicDeclareFunctionntohsLib"wsock32.dll"(ByValnetshortAsLong)AsInteger PublicTypeWSAdata wVersionAsInteger wHighVersionAsInteger szDescriptionAsString*255 szSystemStatusAsString*128 iMaxSocketsAsInteger iMaxUdpDgAsInteger lpVendorInfoAsLong EndType ''sock地址結構 PublicTypesockaddr sin_familyAsInteger sin_portAsInteger sin_addrAsLong sin_zeroAsString*8 EndType PublicTypeHOSTENT h_nameAsLong h_aliasesAsLong h_addrtypeAsInteger h_lengthAsInteger h_addr_listAsLong EndType ''ip頭結構 PublicTypeipheader lenverAsByte tosAsByte lenAsInteger identAsInteger flagsAsInteger ttlAsByte protoAsByte checksumAsInteger sourceIPAsLong destIPAsLong EndType ''TCP頭結構 PublicTypetcp_hdr th_sportAsInteger th_dportAsInteger th_seqAsLong th_ackAsLong th_lenresAsByte th_flagAsByte th_winAsInteger th_sumAsInteger th_urpAsInteger EndType ''UDP頭結構 PublicTypeudp_hdr th_sportAsInteger th_dportAsInteger th_lenAsInteger th_sumAsInteger EndType ''ICMP頭結構 PublicTypeicmp_hdr th_typeAsByte th_codeAsByte th_sumAsInteger th_idAsInteger th_seqAsInteger th_timeAsLong EndType ''常量 PublicConstPF_INET=2 PublicConstSOCK_RAW=3 PublicConstAF_INET=2 PublicConstFD_READ=&H1 PublicConstSIO_RCVALL=&H98000001 PublicConstEM_REPLACESEL=&HC2 PublichostAsHOSTENT PublicsAsLong PublicsockAssockaddr PublicHeaderAsipheader PublictcpHeadAstcp_hdr PublicudpHeadAsudp_hdr PublicicmpHeadAsicmp_hdr Publicresarray()AsLong,strAsString PubliciAsLong,CountIDAsLong''i爲臨時變量,循環語句用,CountID用來計算一共有多少個數據包 PublicprotocolAsString Publicbuffer()AsByte''存放數據包 PublicresAsLong''返回值,臨時變量 PublicExitIDAsBoolean''退出標識 ''開始 PublicSubWstartup() DimDataAsWSAdata CallWSAstartup(&H202,Data)''初始化Winsock爲2.2 EndSub ''結束 PublicSubWCleanup(sAsLong) CallWsACleanup''關閉Winsock closesockets EndSub ''獲得當前主機的IP PublicFunctionip(ByRefaddressAsString)AsString DimpipAsLong DimuipAsLong DimsAsLong DimssAsString DimculAsLong CopyMemoryhost,ByValgethostbyname(address),Len(host)''將gethostbyname獲得的值放到host CopyMemorypip,ByValhost.h_addr_list,4''將host.h_addr_list的值放到pip CopyMemoryuip,ByValpip,4''將pip的值放到uip s=inet_ntoa(uip)''將uip轉換爲標準的IPV4格式 ss=Space(lstrlen(s))''去掉空格 cul=lstrcpy(ss,s) ip=ss''獲得IPV4格式的地址並將其放如ip EndFunction ''獲得當前機器的主機名 PublicFunctionhostname()AsString DimrAsLong DimsAsString DimhostAsString Wstartup host=String(255,0) r=gethostname(host,255)''獲得當前主機的主機名 Ifr=0Then hostname=Left(host,InStr(1,host,vbNullChar)-1) EndIf EndFunction ''連接IP PublicSubConnecting(ByRefipAsString,picAsPictureBox) DimresAsLong,bufAsLong,bufbAsLong buf=1 Wstartup''初始化Winsock s=socket(AF_INET,SOCK_RAW,0)''創建套接字,s是socket功能返回的文件描述符 Ifs<1Then CallWCleanup(s) ExitSub''如果創建失敗則退出 EndIf sock.sin_family=AF_INET''socket類型 sock.sin_addr=inet_addr(ip)''所用的IP地址 res=bind(s,sock,Len(sock))''綁定端口 Ifres<>0Then CallWCleanup(s) ExitSub''如果綁定失敗則退出 EndIf res=WSAIoctl(s,SIO_RCVALL,buf,Len(buf),0,0,bufb,ByVal0,ByVal0)''改變SocketIO模式,將其改爲混亂模式,即接受與自己無關的數據,則SIO_RCVALL Ifres<>0Then CallWCleanup(s) ExitSub EndIf res=WSAAsyncSelect(s,pic.hWnd,&H202,ByValFD_READ)''設置套接字處於阻塞方式或者非阻塞方式,消息發送的窗口是pic,即Form1.Picture1 Ifres<>0Then CallWCleanup(s) ExitSub EndIf EndSub ''接收信息 PublicSubRecibir(sAsLong,ByValRecFormatAsLong) IfRecFormat=FD_READThen ReDimbuffer(2000)''重定義緩衝區大小爲2000 Do res=recv(s,buffer(0),2000,0&)''接收信息 Ifres>0Then ReDimPreserveresarray(CountID)''改變數組大小,並保留以前的數據 str=buffer() resarray(CountID)=res CopyMemoryHeader,buffer(0),Len(Header)''將buffer裏面的數據複製到Header結構裏面 ''根據IP頭結構的標識來獲得是什麼類型的數據包,並將IP從頭結構中分離出來 IfHeader.proto=1Then protocol="ICMP" proticmpinversaip(Hex(Header.destIP)),inversaip(Hex(Header.sourceIP)) EndIf IfHeader.proto=6Then protocol="TCP" protcpinversaip(Hex(Header.destIP)),inversaip(Hex(Header.sourceIP)) EndIf IfHeader.proto=17Then protocol="UDP" proudpinversaip(Hex(Header.destIP)),inversaip(Hex(Header.sourceIP)) EndIf EndIf LoopUntilres<>2000 EndIf EndSub ''將16進制轉換爲IP地址 PublicFunctioninversaip(ByReflngAsString)AsString DimipsAsString SelectCaseLen(lng) Case1 lng="0000000"&lng Case2 lng="000000"&lng Case3 lng="00000"&lng Case4 lng="0000"&lng Case5 lng="000"&lng Case6 lng="00"&lng Case7 lng="0"&lng EndSelect Fori=1ToLen(lng)Step2 ips=ips&Val("&h"&Mid(lng,Len(lng)-i,2))&"." Nexti inversaip=Mid(ips,1,Len(ips)-1) EndFunction PublicFunctionproticmp(saaAsString,socAsString)AsString DimListTempAsVariant SetListTemp=Form1.ListView1.ListItems.Add(,,soc) ListTemp.SubItems(2)=saa ListTemp.SubItems(4)=protocol ListTemp.SubItems(5)=Time CopyMemoryicmpHead,buffer(0+20),Len(icmpHead) EndFunction PublicSubprotcp(saaAsString,socAsString) DimListTempAsVariant CopyMemorytcpHead,buffer(0+20),Len(tcpHead) SetListTemp=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 EndSub PublicSubproudp(saaAsString,socAsString) DimListTempAsVariant CopyMemoryudpHead,buffer(0+20),Len(udpHead) SetListTemp=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 EndSub --------------------------------------------------------------------------------------------------- 彩色的太費時間了,所以就直接貼了!呵呵! 分析篇:分析主要就是分析ram裏面的東西拉。可以到“看雪”去學學簡單的彙編命令 004f3b9c/$53pushebx 004f3b9d|.83c4f8addesp,-8 004f3ba0|.8bdamovebx,edx;解密後數據目標地址 004f3ba2|.8bd4movedx,esp;數據傳遞目標地址 004f3ba4|.b904000000movecx,4;傳遞個數爲4 004f3ba9|.e812eef8ffcallclient.004829c0;把侍解密的4數值傳遞過來進行解密 004f3bae|.8a0424moval,byteptrss:[esp];第一位 004f3bb1|.c1e002shleax,2 004f3bb4|.33d2xoredx,edx 004f3bb6|.8a542401movdl,byteptrss:[esp+1];第二位 004f3bba|.c1ea04shredx,4 004f3bbd|.0ac2oral,dl;第一位與每二位0r 004f3bbf|.8803movbyteptrds:[ebx],al;輸出第1位 004f3bc1|.43incebx;計數器+1指向第二位 004f3bc2|.8a442401moval,byteptrss:[esp+1];第二位 004f3bc6|.c1e004shleax,4 004f3bc9|.33d2xoredx,edx 004f3bcb|.8a542402movdl,byteptrss:[esp+2];第三位 004f3bcf|.c1ea02shredx,2 004f3bd2|.0ac2oral,dl;第二位與第三位or 004f3bd4|.8803movbyteptrds:[ebx],al;輸出第二位 004f3bd6|.43incebx;計數器+1指向第三位 004f3bd7|.8a442402moval,byteptrss:[esp+2];第三位 004f3bdb|.c1e006shleax,6 004f3bde|.8a542403movdl,byteptrss:[esp+3];第4個 004f3be2|.0ac2oral,dl;第三個與第四個or 004f3be4|.8803movbyteptrds:[ebx],al;輸出第三位 004f3be6|.59popecx 004f3be7|.5apopedx 004f3be8|.5bpopebx 004f3be9/.c3retn 004f3bea8bc0moveax,eax 004f3bec/$53pushebx 004f3bed|.56pushesi 004f3bee|.57pushedi 004f3bef|.55pushebp 004f3bf0|.50pusheax;封包 004f3bf1|.b802000000moveax,2 004f3bf6|>81c404f0ffff/addesp,-0ffc 004f3bfc|.50|pusheax 004f3bfd|.48|deceax 004f3bfe|.^75f6/jnzshortclient.004f3bf6 004f3c00|.8b84240020000>moveax,dwordptrss:[esp+2000] 004f3c07|.8bd9movebx,ecx 004f3c09|.8bfamovedi,edx 004f3c0b|.8bd3movedx,ebx 004f3c0d|.81e203000080andedx,80000003 004f3c13|.7905jnsshortclient.004f3c1a 004f3c15|.4adecedx 004f3c16|.83cafcoredx,fffffffc 004f3c19|.42incedx 004f3c1a|>85d2testedx,edx 004f3c1c|.7405jeshortclient.004f3c 23 004f3c1e|.83c8fforeax,ffffffff 004f3c21|.eb7bjmpshortclient.004f3c9e 004f3c23|>8bd3movedx,ebx 004f3c25|.85d2testedx,edx 004f3c27|.7903jnsshortclient.004f3c2c 004f3c29|.83c203addedx,3 004f3c2c|>c1fa02saredx,2 004f3c2f|.891424movdwordptrss:[esp],edx 004f3c32|.8d542404leaedx,dwordptrss:[esp+4] 004f3c36|.8bcbmovecx,ebx 004f3c38|.e883edf8ffcallclient.004829c0;整理出封包傳遞給解密地址進行解密 004f3c3d|.c6441c0400movbyteptrss:[esp+ebx+4],0 004f3c42|.8b1c24movebx,dwordptrss:[esp] 004f3c45|.c1e302shlebx,2 004f3c48|.4bdecebx 004f3c49|.85dbtestebx,ebx 004f3c4b|.7c28jlshortclient.004f3c75 004f3c4d|.43incebx 004f3c4e|.8d442404leaeax,dwordptrss:[esp+4];一個封包 004f3c52|>8a10/movdl,byteptrds:[eax];第n位 004f3c54|.80fa3b|cmpdl,3b 004f3c57|.7205|jbshortclient.004f3c5e 004f3c59|.80fa7a|cmpdl,7a 004f3c5c|.7605|jbeshortclient.004f3c63 004f3c5e|>83c8ff|oreax,ffffffff;出錯處理 004f3c61|.eb3b|jmpshortclient.004f3c9e 004f3c63|>81e2ff000000|andedx,0ff 004f3c69|.8a923def5a00|movdl,byteptrds:[edx+5aef3d];54ef3d是一串字符串. 004f3c6f|.8810|movbyteptrds:[eax],dl;轉換後代碼 004f3c71|.40|inceax;下一個封包字符 004f3c72|.4b|decebx;計數器減1 004f3c73|.^75dd/jnzshortclient.004f3c52 004f3c75|>8b1c24movebx,dwordptrss:[esp] 004f3c78|.4bdecebx 004f3c79|.85dbtestebx,ebx 004f3c7b|.7c1bjlshortclient.004f3c98 004f3c7d|.43incebx 004f3c7e|.33edxorebp,ebp 004f3c80|.8d742404leaesi,dwordptrss:[esp+4];取上面轉化後的數值 004f3c84|>8d546d00/leaedx,dwordptrss:[ebp+ebp*2] 004f3c88|.03d7|addedx,edi;目標地址每次轉化3 004f3c8a|.8bc6|moveax,esi;源地址每次取 004f3c8c|.e80bffffff|callclient.004f3b9c;解密數據(取4個.轉化3個) 004f3c91|.45|incebp 004f3c92|.83c604|addesi,4 004f3c95|.4b|decebx 004f3c96|.^75ec/jnzshortclient.004f3c84 004f3c98|>8b0424moveax,dwordptrss:[esp] 004f3c9b|.8d0440leaeax,dwordptrds:[eax+eax*2] 004f3c9e|>81c404200000addesp,2004 004f3ca4|.5dpopebp 004f3ca5|.5fpopedi 004f3ca6|.5epopesi 004f3ca7|.5bpopebx 004f3ca8/.c3retn 封包的比對!網絡遊戲都是通過數據交換實現遊戲競技滴,所以分析封包是製作外掛的一個步驟。 -------------------------------------------------------------------------------------------------------------------------------------------------------- 網絡遊戲封包分爲2種封包:1。明文封包2。加密封包 多數網絡遊戲都是加密封包,其原因是爲了信息不被修改。明文封包的也有,呵呵“cs”呀這些 -------------------------------------------------------------------------------------------------------------------------------------------------------- 好了,進入正題。封包這玩意其實很難。但是如果你入門了就不難了! 明文的好對付,but加密的就有點.......但也是有辦法滴 就是“多抓包,多分析,多解密!”呵呵! -------------------------------------------------------------------------------------------------------------------------------------------------------- 抓包篇:什麼抓包呢?抓包當然就是用wpe,或者自己編寫軟件拉,上次(呵呵`也就是昨天)已經做過了! 0056df384e3e545356554a6c776463424d466a6en>tsvujlwdcbmfjn 0056df48414b623f7178767965477a664c503d5fakb?qxvyegzflp=_ [email=0056df584552405a5c616d5d4368676f57443b51er@z am]chgowd;q]0056df584552405a5c616d5d4368676f57443b51er@z/am]chgowd;q[/email] 0056df6875585b3c746b70725e606949484f5973ux[0056df782e331e011322100b282d200d193c3b06.3"(-.<; 0056df88111c0c003d1d2f21030205042c313e23..=/!,1># 0056df98322427381f3925120a09181b2a293a0e2$''''89%..*): 0056dfa83507260f2b3614373f3430160815171a5&+67?40 這個就是某個網絡遊戲的封包!當然是加了密的。 00878be055414e4e4e4e4e4e4e4e4e424e4e704euannnnnnnnnbnnpn 00878bf04145564e3e413e58794e4b65aevn>a>xynke 00878be005100000000000000000000b00003600...........6. 00878bf0102004000110013117001118.1. 0087cc0415000000000000000b000d8042010005.........?b. 0087cc1400715c0458.q/x 什麼意思呢?當然就是要分析拉! -------------------------------------------------------------------------------------------------------------------------------------------------------- 前天晚上我跟封包玩了一晚上,因纔開始(第一次跟封包)說一下我一晚上的發現吧 我是直接用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應該會立刻斷住, 你會看見MOVDWORDPTRDS:[EAX+ECX*8+EB4],EDI, 在客戶端中,位置是0x4B2C74, 你可以修改遊戲的進程, 把MOVDWORDPTRDS:[EAX+ECX*8+EB4], EDI改成一個E9XXXXXXXX9090, JMP到進程中.rsrc和.data之間的空餘地址, 把(XXXXXXXX)+0x4B2C74+5處的代碼修改成MOVY,EDI, 下一條做原來的MOVDWORDPTRDS:[EAX+ECX*8+EB4],EDI, 再來個E9ZZZZZZZZ, 設置好ZZZZZZZZ使其再跳到原來DWORDPTRDS:[EAX+ECX*8+EB4], EDI的下一句,就是0x4B2C7B處, 這樣HP的地址就固定下來了,只要看Y就知道HP了。 -------------------------------------------------------------------------------------------------------------------------------------------------------- 下面說說客服端的破解(小試牛刀!)有興趣的朋友可以製作一個DLL 來實現加血鎖定血量! .text:004E8EF0sub_4E8EF0procnear .text:004E8EF0 .text:004E8EF0arg_0=dwordptr4 .text:004E8EF0arg_4=dwordptr8 .text:004E8EF0arg_8=dwordptr0Ch .text:004E8EF0 .text:004E8EF0movecx,[esp+arg_0];可能是長度LEN地址 .text:004E8EF4pushebx .text:004E8EF5moveax,[esp+4+arg_4];緩存地址 .text:004E8EF9pushesi .text:004E8EFAmovesi,ecx .text:004E8EFCpushedi .text:004E8EFDmovedi,[esp+0Ch+arg_8];加密KEY地址 .text:004E8F01andesi,3;相當於緩存長度除以4的餘數 .text:004E8F04shrecx,2;相當於緩存長度除以4的商 .text:004E8F07movedx,[edi];把加密KEY值放進edx .text:004E8F09movebx,ecx; .text:004E8F0Bdececx; .text:004E8F0Ctestebx,ebx; .text:004E8F0Ejbeshortloc_4E8F1E;判斷跳轉 .text:004E8F10incecx; .text:004E8F11 .text:004E8F11loc_4E8F11: .text:004E8F11movebx,[eax] .text:004E8F13addeax,4 .text:004E8F16xorebx,edx;異或運算,EDX=KEY的值,核心運算 .text:004E8F18dececx .text:004E8F19mov[eax-4],ebx .text:004E8F1Cjnzshortloc_4E8F11;相當於FOR循環運算 .text:004E8F1E .text:004E8F1Eloc_4E8F1E: .text:004E8F1Emovecx,esi .text:004E8F20decesi .text:004E8F21testecx,ecx .text:004E8F23jbeshortloc_4E8F35 .text:004E8F25leaecx,[esi+1] .text:004E8F28 .text:004E8F28loc_4E8F28: .text:004E8F28movbl,[eax] .text:004E8F2Axorbl,dl;異或運算 .text:004E8F2Cmov[eax],bl .text:004E8F2Einceax .text:004E8F2Fshredx,8 .text:004E8F32dececx .text:004E8F33jnzshortloc_4E8F28;相當於FOR循環運算 .text:004E8F35 .text:004E8F35loc_4E8F35:KEY付值運算; .text:004E8F35moveax,[edi] .text:004E8F37movedx,eax .text:004E8F39shledx,5 .text:004E8F3Csubedx,eax .text:004E8F3Emoveax,1 .text:004E8F43addedx,8088405h .text:004E8F49mov[edi],edxKEY付值 .text:004E8F4Bpopedi .text:004E8F4Cpopesi .text:004E8F4Dpopebx .text:004E8F4Eretn .text:004E8F4Esub_4E8EF0endp -------------------------------------------------------------------------------------------------------------------------------------------------------- 今天就到這裏 傳奇外掛製作的資料 -------------------------------------------------------------------------------------------------------------------------------------------------------- 顯血:7A0D3:75EB 超負重:99A40:76EB offset原改 防石化: 00466F80:7590 00466F81:2E90 穩如泰山: 0046959D:2044 004695A9:1438 如影隨行: 004634E2:0001 戰鬥退出: 004620E6:7490 004620E7:0D90 00462162:7490 00462163:0A90 004914CA:7490 004914CB:0E90 00491576:7490 00491577:0E90 相對不卡:——| 00463A8D:9900| 0049B848:2C00|——二選一 絕對不卡:| 00466F57:0001——| -------------------------------------------------------------------------------------------------------------------------------------------------------- 防止雙開: EB1CA110414A00 修改爲: 741CA110414A00 需要雙開就反過來改。 看血: 內存地址:47A0D3 75EB 找 00000075108B45EC 修改爲: 000000EB108B45EC 強退: 內存地址:004620E6(7) 7490 0D90 找 2000740D8B45 修改爲: 200090908B45 內存地址:00462162(3) 7490 0A90 找 2000740A8B45 修改爲: 200090908B45 內存地址:4914CA(B) 內存地址:491576(7) 7490 0E90 找 0080782000740EA1 修改爲: 00807820009090A1 免助跑 內存地址:00461BEB(C-F0) 0F90 8E90 7990 FD90 FF90 FF90 找 E8000F8E79FDFFFF 修改爲: E800909090909090 內存地址:461BB9(A-E) 0F90 8C90 DA90 0090 0090 0090 找 00010F8CDA000000A1 修改爲: 0001909090909090A1 跑步砍 內存地址:004634E2 0001 找 4F00008D45F0 修改爲: 4F00018D45F0 攻擊速度 內存地址:46 7016(7) 78E2 0504 找 EB0BB87805 修改爲: EB0BB84805 說明:速度由二位數指定,二位數前後互換爲真實數據,數字大爲慢小爲快 穿人 內存地址:472D17 340C 找 00000034018845 修改爲: 0000000C018845 免蠟 內存地址:471BDE 74EB 找 008038007454 修改爲: 00803800EB54 物品閃光 內存地址:471AA6 04 找 1300007625 修改爲: 0200007625 自動放藥 找 0048C21FF968FDFF 004623A276070000 修改爲: 0048C21FDD50B001 004623A27AEDB201 超負重?? Poke00499A40EB 004975A8EB5C 00499A40EB93 攻擊方法修 原版 00463425741C 0046344A7410 004634637415 半月 00463425741C 0046344A7410 004634639090 攻殺 00463425741C 0046344A9090 004634637415 烈火 004634259090 0046344A7410 004634637415 方法二 半月 Poke00463363D0 烈火 Poke00463363D1 普通 Poke00463363C6 C745E8C60B單手砍 C745E8C70B雙手砍 C745E8C80B跳躍砍 C745E8CA0B攻殺 C745E8CB0B刺殺 C745E8D00B半月 C745E8D10B烈火 無限刺殺 內存地址:463363 C6CB 找 C745E8C60B 修改爲: C745E8CB0B 內存地址:463373 C7CB 找 C745E8C70B 修改爲: C745E8CB0B 無限攻殺 內存地址:463363 C6CA 找 C745E8C60B 修改爲: C745E8CA0B 內存地址:463373 C7CA 找 C745E8C70B 修改爲: C745E8CA0B 無限半月 內存地址:463363 C6D0 找 C745E8C60B 修改爲: C745E8D00B 內存地址:463373 C7D0 找 C745E8C70B 修改爲: C745E8D00B 無限烈火 內存地址:463363 C6D1 找 C745E8C60B 修改爲: C745E8D10B 內存地址:463373 C7D1 找 C745E8C70B 修改爲: C745E8D10B 自動放藥 找 0048C21FF968FDFF 004623A276070000 修改爲: 0048C21FDD50B001 004623A27AEDB201 免蠟 內存地址:471BDE 74EB 找 008038007454 修改爲: 00803800EB54 -------------------------------------------------------------------------------------------------------------------------------------------------------- 編程工具: 1.VC高手的不二選擇 2.BorlandC++Builder如果當年是Borland做了操作系統而不是bill,也許我們現在的 編程工具更加智能更加方便更加接近人性化.如果不喜歡VC那種事事必恭的編程方式, 就用它好了,除了我們用的操作系統不是由它造的之外,幾乎所有的編程都可以用它完成. 3.BorlandDelphi和BorlandC++Builder一樣,由同一家公司出品在RAD方面個人感覺 VB在它面前只是一個小學生.與VC比嘛,除了語法上不同之外,性能及編程方面都要比VC 強過很多,不過它不是bill的產品,所以有系統底層方面比VC要差一些,不過用它做個什麼外掛之類,它還是足以勝任的. 4.VB這個就不多說了簡單的內存修改封包修改就它就好了,強烈推薦初學者使用,有了 經驗之後再用其它的工具,可以事倍功半. 內存工具: FPE2001 GameMaster GameExpert GameEnchanter 遊神 金山遊俠 ↑我最喜歡的幾樣工具(金山遊俠除外),誰說網絡遊戲不能修改。呵呵 封包修改工具 WPE winsock spyMaster ETF20 (PS:還有很多工具喲,不過不太智能化,不過也一樣有功能很強了.這些以後再介紹了) 輔助工具 變速齒輪 按鍵精靈 TrainerMakerKit MagicTrainerCreator 反編譯調試脫殼工具 UltraEdit Softice TRW2000 W32Dasm OllyDbg SPY++ 脫SafeDiscSafeCast2殼工具 脫Aspack殼工具 脫ASPro殼工具 脫UPX殼工具 脫Armadillo殼工具 VB實現指針訪問!DLL的訪問--------------------------------------------------------------------------------------------------------------------------------------------------------CopyMemory函數提供了一個簡單的方法來執行C++中見解訪問運算符(*),這個運算符可以訪問被一個指針變量所指向的變量的值。 即如有指針變量P,在C++中可以簡單的用*P來訪問,那在VB中怎麼訪問呢?在VB中,我們可以使用CopyMemory函數別名。 DeclareSubVBGetTargetLb"kernel32"Alias"RtlMoveMemory"(TargetAsAny,ByVallPointAsLong,ByValcbCopyAsLong) 例子: DimPointerAsLong DimTargetAsInteger DimiAsInteger i=123 Pointer=VarPtr(i)''獲得指針 VBGetTargetTarget,Pointer,LenB(Target) Debug.PrintTarget -------------------------------------------------------------------------------------------------------------------------------------------------------- 很長時間以來,都認爲只能通過絕對路徑引用標準DLL中的函數。其實,你也可以用相對路徑。很簡單的,現在就嘗試一下吧。1)絕對路徑方法比如你的DLL文件位於c:estDLLdebugestDLL.dll 一般來說,你需要在VB中作如下聲明 DeclareSubmytestLib"c:estDLLdubugestDLL.dll"(ByValxAsLong) 另外的一個變通方法是把testDLL.dll放在windows的系統目錄下,這樣,你就可以直接引用文件名了。不過,需要把一個文件放到windows系統目錄下,很是不爽! 2)相對路徑方法 看看我們如何用相對路徑,假設你的DLL文件位於c:estDLLdebugestDLL.dll,你的VB程序位於目錄c:estDLLvbClient 你可以在VB程序中作如下聲明: DeclareSubmytestLib"../dubug/testDLL.dll"(ByValxAsLong) 如果直接運行你的VB程序,系統會提示錯誤:找不到../dubug/testDLL.dll. 爲了使上面的聲明其作用,先暫時關閉你的VB工程。然後用一個文本編輯器(notepad,editplus,etc)打開工程文件(就是那個後綴是vbp的傢伙),通常vbp文件由幾個部分組成。 |