鬱金香外掛hook以後如何寫內存
『壹』 如何模擬debug寫內存地址的值
debug是16位dos上的調式器,如果你用的是windows,你必須創建基於VDM(DOS虛擬機)的exe程序,使用x86的虛擬8086來運行程序,此時的內存地址是0040:0017形式的。你可以給指針賦硬值來訪問所有內存空間。
例:
char far * pvf = 0x40017;
*pvf = (你所要賦的值 );
如果你編寫32windows程序,內存地址是32位的,例如0x0045C320形式。x86機器上使用實模式,開啟分頁機制。用指針只能訪問本進程的地址空間,訪問任意進程地址空間可以用WriteProcessMemory函數
『貳』 不用循環寫內存的方式想鎖定一個程序的一個內存地址裡面的值。請問有什麼方法hook技術可以勝任嗎
include <iostream>
#include <stdio.h>
int jc(int m){
if(m!=1) return m*jc(m-1);
else return 1;
}
int c(int m,int n){
if(m>=n) return jc(m)/(jc(n)*jc(m-n));
}
int main(void){
int m,n;
scanf("%d%d",&m,&n);
printf("%d\n",c(m,n));
return 0;
}
『叄』 c++如何用hook禁用滑鼠如何讓編寫
一、 介紹
本文將討論在.NET應用程序中全局系統鉤子的使用。為此,我開發了一個可重用的類庫並創建一個相應的示常式序(見下圖)。
你可能注意到另外的關於使用系統鉤子的文章。本文與之類似但是有重要的差別。這篇文章將討論在.NET中使用全局系統鉤子,而其它文章僅討論本地系統鉤子。這些思想是類似的,但是實現要求是不同的。
二、 背景
如果你對Windows系統鉤子的概念不熟悉,讓我作一下簡短的描述:
・一個系統鉤子允許你插入一個回調函數-它攔截某些Windows消息(例如,滑鼠相聯系的消息)。
・一個本地系統鉤子是一個系統鉤子-它僅在指定的消息由一個單一線程處理時被調用。
・一個全局系統鉤子是一個系統鉤子-它當指定的消息被任何應用程序在整個系統上所處理時被調用。
已有若干好文章來介紹系統鉤子概念。在此,不是為了重新收集這些介紹性的信息,我只是簡單地請讀者參考下面有關系統鉤子的一些背景資料文章。如果你對系統鉤子概念很熟悉,那麼你能夠從本文中得到你能夠得到的任何東西。
・關於MSDN庫中的鉤子知識。
・Dino Esposito的《Cutting Edge-Windows Hooks in the .NET Framework》。
・Don Kackman的《在C#中應用鉤子》。
本文中我們要討論的是擴展這個信息來創建一個全局系統鉤子-它能被.NET類所使用。我們將用C#和一個DLL和非託管C++來開發一個類庫-它們一起將完成這個目標。
三、 使用代碼
在我們深入開發這個庫之前,讓我們快速看一下我們的目標。在本文中,我們將開發一個類庫-它安裝全局系統鉤子並且暴露這些由鉤子處理的事件,作為我們的鉤子類的一個.NET事件。為了說明這個系統鉤子類的用法,我們將在一個用C#編寫的Windows表單應用程序中創建一個滑鼠事件鉤子和一個鍵盤事件鉤子。
這些類庫能用於創建任何類型的系統鉤子,其中有兩個預編譯的鉤子-MouseHook和KeyboardHook。我們也已經包含了這些類的特定版本,分別稱為MouseHookExt和KeyboardHookExt。根據這些類所設置的模型,你能容易構建系統鉤子-針對Win32 API中任何15種鉤子事件類型中的任何一種。另外,這個完整的類庫中還有一個編譯的HTML幫助文件-它把這些類歸檔化。請確信你看了這個幫助文件-如果你決定在你的應用程序中使用這個庫的話。
MouseHook類的用法和生命周期相當簡單。首先,我們創建MouseHook類的一個實例。
mouseHook = new MouseHook();//mouseHook是一個成員變數
接下來,我們把MouseEvent事件綁定到一個類層次的方法上。
mouseHook.MouseEvent+=new MouseHook.MouseEventHandler(mouseHook_MouseEvent);
// ...
private void mouseHook_MouseEvent(MouseEvents mEvent, int x, int y){
string msg =string.Format("滑鼠事件::(,).",mEvent.ToString(),x,y);
AddText(msg);//增加消息到文本框
}
為開始收到滑鼠事件,簡單地安裝下面的鉤子即可。
mouseHook.InstallHook();
為停止接收事件,只需簡單地卸載這個鉤子。
mouseHook.UninstallHook();
你也可以調用Dispose來卸載這個鉤子。
在你的應用程序退出時,卸載這個鉤子是很重要的。讓系統鉤子一直安裝著將減慢系統中的所有的應用程序的消息處理。它甚至能夠使一個或多個進程變得很不穩定。因此,請確保在你使用完鉤子時一定要移去你的系統鉤子。我們確定在我們的示例應用程序會移去該系統鉤子-通過在Form的Dispose方法中添加一個Dispose調用。
protected override void Dispose(bool disposing) {
if (disposing) {
if (mouseHook != null) {
mouseHook.Dispose();
mouseHook = null;
}
// ...
}
}
使用該類庫的情況就是如此。該類庫中有兩個系統鉤子類並且相當容易擴充。
四、 構建庫
這個庫共有兩個主要組件。第一部分是一個C#類庫-你可以直接使用於你的應用程序中。該類庫,反過來,在內部使用一個非託管的C++ DLL來直接管理系統鉤子。我們將首先討論開發該C++部分。接下來,我們將討論怎麼在C#中使用這個庫來構建一個通用的鉤子類。就象我們討論C++/C#交互一樣,我們將特別注意C++方法和數據類型是怎樣映射到.NET方法和數據類型的。
你可能想知道為什麼我們需要兩個庫,特別是一個非託管的C++ DLL。你還可能注意到在本文的背景一節中提到的兩篇參考文章,其中並沒有使用任何非託管的代碼。為此,我的回答是,"對!這正是我寫這篇文章的原因"。當你思考系統鉤子是怎樣實際地實現它們的功能時,我們需要非託管的代碼是十分重要的。為了使一個全局的系統鉤子能夠工作,Windows把你的DLL插入到每個正在運行的進程的進程空間中。既然大多數進程不是.NET進程,所以,它們不能直接執行.NET裝配集。我們需要一種非託管的代碼代理- Windows可以把它插入到所有將要被鉤住的進程中。
首先是提供一種機制來把一個.NET代理傳遞到我們的C++庫。這樣,我們用C++語言定義下列函數(SetUserHookCallback)和函數指針(HookProc)。
int SetUserHookCallback(HookProc userProc, UINT hookID)
typedef void (CALLBACK *HookProc)(int code, WPARAM w, LPARAM l)
SetUserHookCallback的第二個參數是鉤子類型-這個函數指針將使用它。現在,我們必須用C#來定義相應的方法和代理以使用這段代碼。下面是我們怎樣把它映射到C#。
private static extern SetCallBackResults
SetUserHookCallback(HookProcessedHandler hookCallback, HookTypes hookType)
protected delegate void HookProcessedHandler(int code, UIntPtr wparam, IntPtr lparam)
public enum HookTypes {
JournalRecord = 0,
JournalPlayback = 1,
// ...
KeyboardLL = 13,
MouseLL = 14
};
首先,我們使用DllImport屬性導入SetUserHookCallback函數,作為我們的抽象基鉤子類SystemHook的一個靜態的外部的方法。為此,我們必須映射一些外部數據類型。首先,我們必須創建一個代理作為我們的函數指針。這是通過定義上面的HookProcessHandler 來實現的。我們需要一個函數,它的C++簽名為(int,WPARAM,LPARAM)。在Visual Studio .NET C++編譯器中,int與C#中是一樣的。也就是說,在C++與C#中int就是Int32。事情並不總是這樣。一些編譯器把C++ int作為Int16對待。我們堅持使用Visual Studio .NET C++編譯器來實現這個工程,因此,我們不必擔心編譯器差別所帶來的另外的定義。
接下來,我們需要用C#傳遞WPARAM和LPARAM值。這些確實是指針,它們分別指向C++的UINT和LONG值。用C#來說,它們是指向uint和int的指針。如果你還不確定什麼是WPARAM,你可以通過在C++代碼中單擊右鍵來查詢它,並且選擇"Go to definition"。這將會引導你到在windef.h中的定義。
//從windef.h:
typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM;
因此,我們選擇System.UIntPtr和System.IntPtr作為我們的變數類型-它們分別相應於WPARAM和LPARAM類型,當它們使用在C#中時。
現在,讓我們看一下鉤子基類是怎樣使用這些導入的方法來傳遞一個回叫函數(代理)到C++中-它允許C++庫直接調用你的系統鉤子類的實例。首先,在構造器中,SystemHook類創建一個到私有方法InternalHookCallback的代理-它匹配HookProcessedHandler代理簽名。然後,它把這個代理和它的HookType傳遞到C++庫以使用SetUserHookCallback方法來注冊該回叫函數,如上面所討論的。下面是其代碼實現:
public SystemHook(HookTypes type){
_type = type;
_processHandler = new HookProcessedHandler(InternalHookCallback);
SetUserHookCallback(_processHandler, _type);
}
InternalHookCallback的實現相當簡單。InternalHookCallback在用一個catch-all try/catch塊包裝它的同時僅傳遞到抽象方法HookCallback的調用。這將簡化在派生類中的實現並且保護C++代碼。記住,一旦一切都准備妥當,這個C++鉤子就會直接調用這個方法。
[MethodImpl(MethodImplOptions.NoInlining)]
private void InternalHookCallback(int code, UIntPtr wparam, IntPtr lparam){
try
catch {}
}
我們已增加了一個方法實現屬性-它告訴編譯器不要內聯這個方法。這不是可選的。至少,在我添加try/catch之前是需要的。看起來,由於某些原因,編譯器在試圖內聯這個方法-這將給包裝它的代理帶來各種麻煩。然後,C++層將回叫,而該應用程序將會崩潰。
現在,讓我們看一下一個派生類是怎樣用一個特定的HookType來接收和處理鉤子事件。下面是虛擬的MouseHook類的HookCallback方法實現:
protected override void HookCallback(int code, UIntPtr wparam, IntPtr lparam){
if (MouseEvent == null)
int x = 0, y = 0;
MouseEvents mEvent = (MouseEvents)wparam.ToUInt32();
switch(mEvent) {
case MouseEvents.LeftButtonDown:
GetMousePosition(wparam, lparam, ref x, ref y);
break;
// ...
}
MouseEvent(mEvent, new Point(x, y));
}
首先,注意這個類定義一個事件MouseEvent-該類在收到一個鉤子事件時激發這個事件。這個類在激發它的事件之前,把數據從WPARAM和 LPARAM類型轉換成.NET中有意義的滑鼠事件數據。這樣可以使得類的消費者免於擔心解釋這些數據結構。這個類使用導入的 GetMousePosition函數-我們在C++ DLL中定義的用來轉換這些值。為此,請看下面幾段的討論。
在這個方法中,我們檢查是否有人在聽這一個事件。如果沒有,不必繼續處理這一事件。然後,我們把WPARAM轉換成一個MouseEvents枚舉類型。我們已小心地構造了MouseEvents枚舉來准確匹配它們在C ++中相應的常數。這允許我們簡單地把指針的值轉換成枚舉類型。但是要注意,這種轉換即使在WPARAM的值不匹配一個枚舉值的情況下也會成功。 mEvent的值將僅是未定義的(不是null,只是不在枚舉值范圍之內)。為此,請詳細分析System.Enum.IsDefined方法。
接下來,在確定我們收到的事件類型後,該類激活這個事件,並且通知消費者滑鼠事件的類型及在該事件過程中滑鼠的位置。
最後注意,有關轉換WPARAM和LPARAM值:對於每個類型的事件,這些變數的值和意思是不同的。因此,在每一種鉤子類型中,我們必須區別地解釋這些值。我選擇用C++實現這種轉換,而不是盡量用C#來模仿復雜的C++結構和指針。例如,前面的類就使用了一個叫作GetMousePosition的 C++函數。下面是C++ DLL中的這個方法:
bool GetMousePosition(WPARAM wparam, LPARAM lparam, int amp; x, int amp; y) {
MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lparam;
x = pMouseStruct->pt.x;
y = pMouseStruct->pt.y;
return true;
}
不是盡量映射MOUSEHOOKSTRUCT結構指針到C#,我們簡單地暫時把它回傳到C++層以提取我們需要的值。注意,因為我們需要從這個調用中返回一些值,我們把我們的整數作為參考變數傳遞。這直接映射到C#中的int*。但是,我們可以重載這個行為,通過選擇正確的簽名來導入這個方法。
private static extern bool InternalGetMousePosition(UIntPtr wparam,IntPtr lparam, ref int x, ref int y)
通過把integer參數定義為ref int,我們得到通過C++參照傳遞給我們的值。如果我們想要的話,我們還可以使用out int。
五、 限制
一些鉤子類型並不適合實現全局鉤子。我當前正在考慮解決辦法-它將允許使用受限制的鉤子類型。到目前為止,不要把這些類型添加回該庫中,因為它們將導致應用程序的失敗(經常是系統范圍的災難性失敗)。下一節將集中討論這些限制背後的原因和解決辦法。
HookTypes.CallWindowProcere
HookTypes.CallWindowProret
HookTypes.ComputerBasedTraining
HookTypes.Debug
HookTypes.ForegroundIdle
HookTypes.JournalRecord
HookTypes.JournalPlayback
HookTypes.GetMessage
HookTypes.SystemMessageFilter
六、 兩種類型的鉤子
在本節中,我將盡量解釋為什麼一些鉤子類型被限制在一定的范疇內而另外一些則不受限制。如果我使用有點偏差術語的話,請原諒我。我還沒有找到任何有關這部分題目的文檔,因此,我編造了我自己的詞彙。另外,如果你認為我根本就不對,請告訴我好了。
當Windows調用傳遞到SetWindowsHookEx()的回調函數時它們會因不同類型的鉤子而被區別調用。基本上有兩種情況:切換執行上下文的鉤子和不切換執行上下文的鉤子。用另一種方式說,也就是,在放鉤子的應用程序進程空間執行鉤子回調函數的情況和在被鉤住的應用程序進程空間執行鉤子回調函數的情況。
鉤子類型例如滑鼠和鍵盤鉤子都是在被Windows調用之前切換上下文的。整個過程大致如下:
1. 應用程序X擁有焦點並執行。
2. 用戶按下一個鍵。
3. Windows從應用程序X接管上下文並把執行上下文切換到放鉤子的應用程序。
4. Windows用放鉤子的應用程序進程空間中的鍵消息參數調用鉤子回調函數。
5. Windows從放鉤子的應用程序接管上下文並把執行上下文切換回應用程序X。
6. Windows把消息放進應用程序X的消息排隊。
7. 稍微一會兒之後,當應用程序X執行時,它從自己的消息排隊中取出消息並且調用它的內部按鍵(或松開或按下)處理器。
8. 應用程序X繼續執行...
例如CBT鉤子(window創建,等等。)的鉤子類型並不切換上下文。對於這些類型的鉤子,過程大致如下:
1. 應用程序X擁有焦點並執行。
2. 應用程序X創建一個窗口。
3. Windows用在應用程序X進程空間中的CBT事件消息參數調用鉤子回調函數。
4. 應用程序X繼續執行...
這應該說明了為什麼某種類型的鉤子能夠用這個庫結構工作而一些卻不能。記住,這正是該庫要做的。在上面第4步和第3步之後,分別插入下列步驟:
1. Windows調用鉤子回調函數。
2. 目標回調函數在非託管的DLL中執行。
3. 目標回調函數查找它的相應託管的調用代理。
4. 託管代理被以適當的參數執行。
5. 目標回調函數返回並執行相應於指定消息的鉤子處理。
第三步和第四步因非切換鉤子類型而註定失敗。第三步將失敗,因為相應的託管回調函數不會為該應用程序而設置。記住,這個DLL使用全局變數來跟蹤這些託管代理並且該鉤子DLL被載入到每一個進程空間。但是這個值僅在放鉤子的應用程序進程空間中設置。對於另外其它情況,它們全部為null。
Tim Sylvester在他的《Other hook types》一文中指出,使用一個共享內存區段將會解決這個問題。這是真實的,但是也如Tim所指出的,那些託管代理地址對於除了放鉤子的應用程序之外的任何進程是無意義的。這意味著,它們是無意義的並且不能在回調函數的執行過程中調用。那樣會有麻煩的。
因此,為了把這些回調函數使用於不執行上下文切換的鉤子類型,你需要某種進程間的通訊。
我已經試驗過這種思想-使用非託管的DLL鉤子回調函數中的進程外COM對象進行IPC。如果你能使這種方法工作,我將很高興了解到這點。至於我的嘗試,結果並不理想。基本原因是很難針對各種進程和它們的線程(CoInitialize(NULL))而正確地初始化COM單元。這是一個在你可以使用 COM對象之前的基本要求。
我不懷疑,一定有辦法來解決這個問題。但是我還沒有試用過它們,因為我認為它們僅有有限的用處。例如,CBT鉤子可以讓你取消一個窗口創建,如果你希望的話。可以想像,為使這能夠工作將會發生什麼。
1. 鉤子回調函數開始執行。
2. 調用非託管的鉤子DLL中的相應的鉤子回調函數。
3. 執行必須被路由回到主鉤子應用程序。
4. 該應用程序必須決定是否允許這一創建。
5. 調用必須被路由回仍舊在運行中的鉤子回調函數。
6. 在非託管的鉤子DLL中的鉤子回調函數從主鉤子應用程序接收到要採取的行動。
7. 在非託管的鉤子DLL中的鉤子回調函數針對CBT鉤子調用採取適當的行動。
8. 完成鉤子回調函數的執行。
這不是不可能的,但是不算好的。我希望這會消除在該庫中的圍繞被允許的和受限制的鉤子類型所帶來的神秘。
七、 其它
・庫文檔:我們已經包含了有關ManagedHooks類庫的比較完整的代碼文檔。當以"Documentation"構建配置進行編譯時,這被經由Visual Studio.NET轉換成標准幫助XML。最後,我們已使用NDoc來把它轉換成編譯的HTML幫助(CHM)。你可以看這個幫助文件,只需簡單地在該方案的解決方案資源管理器中點擊Hooks.chm文件或通過查找與該文相關的可下載的ZIP文件。
・增強的智能感知:如果你不熟悉Visual Studio.NET怎樣使用編譯的XML文件(pre-NDoc output)來為參考庫的工程增強智能感知,那麼讓我簡單地介紹一下。如果你決定在你的應用程序中使用這個類庫,你可以考慮復制該庫的一個穩定構建版本到你想參考它的位置。同時,還要把XML文檔文件 (SystemHooks\ManagedHooks\bin\Debug\Kennedy.ManagedHooks.xml)復制到相同的位置。當你添加一個參考到該庫時,Visual Studio.NET將自動地讀該文件並使用它來添加智能感知文檔。這是很有用的,特別是對於象這樣的第三方庫。
・單元測試:我相信,所有的庫都應有與之相應的單元測試。既然我是一家公司(主要負責針對.NET環境軟體的單元測試)的合夥人和軟體工程師,任何人不會對此感到驚訝。因而,你將會在名為ManagedHooksTests的解決方案中找到一個單元測試工程。為了運行該單元測試,你需要下載和安裝 HarnessIt-這個下載是我們的商業單元測試軟體的一個自由的試用版本。在該單元測試中,我對這給予了特殊的注意-在此處,方法的無效參數可能導致 C++內存異常的發生。盡管這個庫是相當簡單的,但該單元測試確實能夠幫助我在一些更為微妙的情況下發現一些錯誤。
・非託管的/託管的調試:有關混合解決方案(例如,本文的託管的和非託管的代碼)最為技巧的地方之一是調試問題。如果你想單步調試該C++代碼或在C++代碼中設置斷點,你必須啟動非託管的調試。這是一個Visual Studio.NET中的工程設置。注意,你可以非常順利地單步調試託管的和非託管的層,但是,在調試過程中,非託管的調試確實嚴重地減慢應用程序的裝載時間和執行速度。
八、 最後警告
很明顯,系統鉤子相當有力量;然而,使用這種力量應該是有責任性的。在系統鉤子出了問題時,它們不僅僅垮掉你的應用程序。它們可以垮掉在你的當前系統中運行的每個應用程序。但是到這種程度的可能性一般是很小的。盡管如此,在使用系統鉤子時,你還是需要再三檢查你的代碼。
我發現了一項可以用來開發應用程序的有用的技術-它使用系統鉤子來在微軟的虛擬PC上安裝你的喜愛的開發操作系統的一個拷貝和Visual Studio.NET。然後,你就可以在此虛擬的環境中開發你的應用程序。用這種方式,當你的鉤子應用程序出現錯誤時,它們將僅退出你的操作系統的虛擬實例而不是你的真正的操作系統。我已經不得不重啟動我的真正的OS-在這個虛擬OS由於一個鉤子錯誤崩潰時,但是這並不經常。
『肆』 做游戲掛從哪學起
編程語言啊,,易語言 c++ vc 等等都可以,其實語言是相通的,,,
東西太多,容易放棄啊。。。我就是 - -
鬱金香老師的編程課程。。。。還好我學了點c。。。
1 入門篇.以《QQ連連看為例》
1.1、一個最簡單的外掛
1.1.1、游戲數據分析(SPY++)
1.1.1、游戲窗口數據分析(SPY++)
a、取得窗口相對坐標
b、讀出遊戲窗口信息GetWindowRect
c、移動滑鼠指針SetCursorPos
1.1.2 用VC++寫個最簡單的外掛(實現游戲開局)
a、鼠擬滑鼠單擊mouse_event
b、滑鼠指針移動還原
c、集成到startgame函數里
1.2、用CE查找棋盤數據
1.2.1、數據類型:Bit,Byte,Word,Dword
、用CE查找坐位號;
1.2.2、用CE查出4個棋盤基址;
1.3、用模擬技術編制外掛
1.3.1 模擬滑鼠點擊實現 交換棋子
1.3.2 把所有功能集成封裝到 函數里
1.3.3 利用棋盤數據 ,模擬實現下棋功能
1.3.4 編寫完整外掛,界面美化
1.4、游戲加速.去掉對動畫效果.非HOOK
1.4.1:用OD找出 動畫延時代碼
1.4.2:寫代碼去掉延時,實現游戲加速
2 中級篇 以熱血江湖為例
2.1、分析前的准備..CALL簡介:
2.1.1、CALL調用示例分析.遠程代碼注入器
2.1.2、調試工具OD簡介,血值,魔力值,坐標偏移;
2.1.3、游戲基址概念;
2.1.4、常用匯編指令詳解
2.1.5、內聯匯編編程實例
2.2、游戲分析利器OD(OllyDbg)
2.2.1、分析角色基址
2.2.2、找打坐CALL
2.2.3、讀出角色當前血值
2.2.4、遠程注入代碼,調用打坐CALL;
2.2.5、實例分析:找技能欄對象數組基址+偏移:
2.2.6: 攔截F1-F8功能CALL
2.3、外掛框架構建
2.3.1、DLL動態鏈接庫構建,與調用
2.3.2、API與回調函數
2.3.3、DLL中構建窗口
2.4、用OD分析游戲功能CALL.《熱血江湖》為例:主要是找CALL
2.4.1、選怪CALL
2.4.2、找游戲物品背包的基址+偏移
2.4.3、 吃紅葯(補血)CALL
2.4.4、 吃藍(補魔)CALL
2.4.5、 技能CALL1
2.4.6、技能CALL2
2.4.7、所有技能CALL
2.4.8、撿物CALL
2.4.9、所有動作CALL
3、進階篇
主要講功能CALL的參數分析
匯編浮點指令/浮點運行/浮點數整數轉換/匯編里的指針
3.1、喊話功能
3.2、走路
3.3、 怪物過濾
3.3.1、怪物屬性分析
3.3.2、怪物列表關鍵代碼分析
3.3.3、怪物列表基址+大小
3.3.4、怪物列表編寫代碼
3.3.5、怪物過濾
3.4、 物品過濾
3.4.1、物品屬性分析
3.4.2、物品列表關鍵代碼分析
3.4.3、找出物品列表基址+偏移
3.4.4、物品過濾(編程讀出物品列表數據)
3.5、 組隊相關
3.5.1、 玩家列表
3.5.2、 組隊功能
3.5.3、 離隊功能
3.6、購物/售物
3.6.1、與NPC對話框
3.6.2、打開購物/售物對話框
3.6.3、購物功能
3.6.4、售物功能
3.7、 擺攤.開店
a、開店CALL參數分析
b、寫代碼測試
4、高級篇
4.1、編寫完整的外掛
4.2、游戲更新後的外掛更新
4.3、腳本功能
4.4、游戲多開實現
4.5、盜號的實現
學技術
1.浮躁的人容易說:XX語言不行了,應該學YY;——是你自己不行了吧!?
2.浮躁的人容易問:我到底該學什麼;——別問,學就對了;
3.浮躁的人容易問:XX有錢途嗎;——建議你去搶銀行;
4.浮躁的人容易說:我要中文版!我英文不行!——不行?學呀!
5.浮躁的人容易問:XX和YY哪個好;——告訴你吧,都好——只要你學就行;
6.浮躁的人分兩種:a)只觀望而不學的人;b)只學而不堅持的人;
7.把時髦的技術掛在嘴邊,還不如把過時的技術記在心裡;
『伍』 C# 如何實現dx HOOK修改呢
尋找基址一般都用OD或者CE 至於你說的C#實現HOOK 這個網上資料很多的啊 網路文庫"C# HOOK "以這個為關鍵詞你搜下 取出戰爭迷霧 那你要找的就是一個函數的基址了 一個Call 具體的你網上找些教程吧 這個要你對匯編有基礎才可以的 或者去看鬱金香的教程
『陸』 聽說鬱金香灬游戲又出新教程了,不知道怎麼安排的·
鬱金香灬游戲 2015年課程
游戲一:精講
一、人物角色對象分析
編寫外掛框架
編寫DLL部分
編寫EXE部分
遍歷顯示人物信息
分析背包列表
分析背包對象常用屬性
分析怪物列表
分析怪物對象屬性
封裝怪物結構
編寫代碼讀取周圍所有怪物信息
分析打怪CALL
分析技能CALL
分析裝備列表
分析裝備對象
分析技能樹
選中技能對象
移動技能對象到F1-F10
分析技能使用CALL
分析技能使用CALL參數
封裝技能使用CALL
快速更新游戲基址
動態定位基址
編寫自己的基址定位函數
三、 分析氣功列表
分析氣功列表基址
分析氣功對象屬性
分析氣功已加點數
分析氣功可加點數
分析氣功加點CALL
分析氣功加點參數
封裝氣功加點CALL
武器強化屬性分析
武器強化條件分析
武器強化CALL分析
武器強化CALL參數分析
LUA介面封裝
LUA氣功加點
LUA修練武功
四、移動分析
當前坐標分析
目的地坐標分析
尋路CALL分析
尋路CALL參數分析
LUA移動到
五、自動接任務
分析當前任務列表
分析NPC對話數據
分析NPC對話CALL
分析接任務數據
分析接任務CALL
分析任務完成進度數據
分析任務完成狀態
分析交任務CALL
封裝做任務函數
LUA做任務
六、自動打怪掛機
分析怪物列表
獲取可攻擊怪物
分析選中怪物功能
分析攻擊技能
封裝自動打怪功能
打怪過濾
定點打怪功能封裝
范圍打怪功能封裝
保存掛機地點
載入掛機地點
LUA掛機
七、尋路系統分析
當前坐標分析
尋路CALL分析
尋路CALL參數分析
尋路CALL功能封裝
穿牆數據分析
穿牆功能實現
LUA開啟穿牆
LUA尋路
八、撿物及物品過濾
撿物功能一分析
撿物功能二分析
帶參數的撿物功能分析
地上物品列表分析
地上物品屬性分析
實現有選擇的撿物(物品過濾)
自動打開指定類型盒子
LUA撿物
九、喊話功能封裝
分析喊話CALL
分析喊話CALL參數
分析喊話類型參數
封裝喊話函數
實現自動喊話
LUA喊話
十、提示
被人密檢測提示
游戲掉線檢測提示
倉庫滿檢測提示
交易檢測提示
被怪物殺死檢測提示
被玩家殺死提示
十一、自動賣買物品(補給)
HP葯品數量檢測分析
MP葯品數量檢測分析
回城符數量檢測分析
指定物品低於某個數量 回城補給後再來
回城補給時 指定物品保持在某個數量
LUA出售(物品,數量)
LUA購買(物品,數量)
十二、倉庫
分析倉庫數據
分析存倉庫CALL
分析存倉庫CALL參數
分析取倉庫CALL
分析取倉庫CALL參數
封裝函數(回城補給是,倉庫取物,讓某個物品保持一定數量)
LUA存倉庫(物品,數量)
十三、自動使用物品
分析物品使用CALL
分析物品使用CALL參數
低HP檢測
低MP檢測
低HP保護
低MP保護
檢測速度分析
HP值低於XX時 優先使用物品列表排序設置
MP值低於XX時 優先使用物品列表排序設置
HP值低於XX百分比時 優先使用物品列表排序設置
MP值低於XX百分比時 優先使用物品列表排序設置
當HP值 低於XX百分比時,回城補給再來
十四、攻擊保護
PK時用 當被攻擊時 立刻使用XX數量 XX物品
十五、組隊
分析組隊狀態
分析隊伍列表
分析隊員屬性相關
定時給隊員加輔助
當隊員HP值低於XX百分比時 加指定輔助
自動組隊所有人
自動組XXX入隊
自動接受所有人組隊
自動接受XXX組隊
組隊黑名單設置
自動移交隊長給
跟隨隊長范圍
組隊搜索范圍
十六、死亡處理
1、死亡檢測
2、原地復活
4、復活延時
5、回城補給再來
6、使用百寶符
7、補給後返回方式選擇
十七、武功和氣功
疾風御氣術分析
梯雲縱分析
草上飛分析
疾龍雲中行一式
疾龍雲中行二式
輕功失效檢測
自動使用輕功
自動使用XX技能
定點加輔助武功
帖身加輔助武功
輔助時自動更換武器為XX
打怪時自動更換武器為XX
十八、自動收貨出貨
交易CALL分析
交易CALL參數分析
交易檢測
貨物屬性判斷
自動交易
自動逛店
自動去店內掃貨
十九 變態功能
1、修改攻擊距離,增強攻擊距離
2、CPU優化
3、黑屏處理
4、瞬移
5、穿牆
6、內存優化
7、隱藏游戲建築
8、隱藏人物怪物
二十、人工智慧演算法
LUA腳本支持
自動增強攻擊距離
自動尋路
自動打怪
自動高手怪處理
自動使用物品
自動使用技能
自動加點氣功
自動修練武功
自動修裝備
自動合成裝備
自動強化裝備
自動任務協作
自動回城補給
自動返回掛機點
自動等級選擇掛機點
自動存倉庫
自動出售物品
自動購買物品
自動開店出售
自動掃貨
自動喊話
自動腳本功能支持
二十一、多開游戲
多開限制分析
突破多開限制
封裝多開函數
二十二、自動登錄賬號
二十三、注冊控制
至此可以開卡出售了
游戲二:
在先前的基礎上,精講數據分析,及功能封裝部分
游戲三:
在先前的基礎上,精講數據分析,及功能封裝部分
其它內容略...
『柒』 怎麼做DNF輔助軟體
首先聲明:這個是在抄別人的,希望能幫到你。
一、先說一下寫一個外掛需要什麼條件
1、熟練的C語言知識
目前的外掛大部分都是用BC或者是Delphi或者是vc寫的,擁有熟練的C語言知識是寫外掛的基本條件!
2、具有很強的匯編基礎
一般游戲都不可能有原代碼的,必須靠反匯編或者跟蹤的辦法來探索其中的機理
,所以有強的匯編基礎也是必不可少的條件
3、熟練掌握跟蹤和調試的工具
有了上面2個條件後,掌握一些工具也是很有必要的
跟蹤的工具,softice當然是不二之選,至於反匯編的工具,我推薦用IDA PRO
這個工具反匯編出來的代碼結構清晰,非常好讀
如果你不具有上面的條件,還是先把基礎打好,再來寫外掛吧,一分耕耘,一分收獲,天下沒有白掉的餡餅的
二、寫外掛面臨的基本技術問題
1、修改進程的執行代碼
要修改進程的執行代碼,要先取得進程的ID,如果是由外掛程序啟動,返回值里就有進程ID,如果不是的話,
需要用findwindow找到窗口句柄,再用GetWindowProcessID取得進程ID,取得進程ID以後,就可以用
writeprocessmemory來修改進程的執行代碼了,使程序按照我們的意願來執行,石器外掛里的不遇敵、寸步遇敵
就是用這樣的方法來實現的
2、截獲外掛發送和接收的封包
除了通過修改代碼來實現的功能以外,很多的功能都是通過修改封包來實現的,要修改封包,首先要能截獲它。
第一步是要跟蹤出發和收的位置,至於怎麼跟蹤,我以後會提到,找到位置以後,有2個辦法,一是在那個位置加一
個jmp語句,跳到你的處理函數位置,處理完後,再跳回來,這種方法要求比較高,需要處理好很多事情,另一種辦法
是往那個位置寫條能造成例外的指令,比如int 3,然後用DebugActiveProcess調試游戲進程,這樣每當游戲執行到那個
位置的時候,就會停下來,到外掛程序裡面去,等外掛程序處理完以後,用ContinueDebugEvent 繼續運行程序。
今天先寫這么多,下回將討論外掛的具體功能該怎麼實現
今天來談談地址的調查問題,地址調查是寫外掛中最艱辛,最富有挑戰性的事情,很多朋友問我要外掛的原程序,其實有了外掛原程序,如果你不會調查地址,還是沒用的,
原程序和地址的關系就象武學中招式與內功的關系,沒有內功的招式,只是一個花架子。而內功精深以後,任何普通的招式,都有可能化腐朽為神奇,外掛中的地址分為兩類,一類是程序地址,一類是數據地址。象石器中的雙石器,真彩,不遇敵,寸步遇敵,發送接收封包等,都屬於第一類,而人物坐標,狀態等,都屬於第二類。對於第一類地址,主要依靠softice來
調查地址,對第二類地址,可以用一些游戲工具,比如fpe,game expert,game master等來調查,我一直用game expert,因為我找不到2000下能用的fpe,
各位以前用fpe改游戲的時候,沒想過他也能用來干這個吧
對於第二類數據的調查方法,大部分人都很熟習了,我就不多說了,現在主要來談談第一類數據的詳細調查過程,比如我們要調查發送封包的位置,如何著手呢,客戶端往伺服器要發很多封包,但最簡單的辦法莫過從說話的封包入手,先說一句很長的話,最好是英文,查起來方便,說完以後,用任意一種辦法進入游戲程序的進程空間(比如先用spy查出遊戲程序的窗口句柄,再切換到softice打入bmsg 窗口句柄 wm_lbuttondown,這樣在游戲程序中一點滑鼠就進入了他的進程空間)然後用s命令查出這句話所放的內存地址,記下這個地址,在softice中打入bpm 剛才調查到的地址,這個指令的意思是只要有訪問這個內存的動作,立刻中斷,然後再切換到游戲,說一句話,你會發現softice自動中斷到某一個位置了,從這個位置跟蹤下去,發送封包的位置也就不遠了。
上面所說的都是針對一個全新的游戲程序而言,如果是一個老的程序,有前輩做了大量的工作,還可以用些別的辦法,如反匯編等,來調查。以後游戲版本的更新也是如此,只要把老版本的地址位置附近的代碼記下來,去新版本的代碼裡面search一下,就ok了。
恩,休息一會兒,休息一會兒
我主要對外掛的技術進行分析,至於游戲裡面的內部結構每個都不一樣,這里就不做講解了,我也沒有那麼厲害,所有的都知道,呵呵!
1 首先游戲外掛的原理
外掛現在分為好多種,比如模擬鍵盤的,滑鼠的,修改數據包的,還有修改本地內存的,但好像沒有修改伺服器內存的哦,呵呵!其實修改伺服器也是有辦法的,只是技術太高一般人沒有辦法入手而已!(比如請GM去夜總會,送禮,收黑錢等等辦法都可以修改伺服器數據,哈哈)
修改游戲無非是修改一下本地內存的數據,或者截獲api函數等等,這里我把所能想到的方法都作一個介紹,希望大家能做出很好的外掛來使游戲廠商更好的完善自己的技術.
我見到一片文章是講魔力寶貝的理論分析,寫的不錯,大概是那個樣子.
下來我就講解一下技術方面的東西,以作引玉之用
2 技術分析部分
1 模擬鍵盤或滑鼠的響應
我們一般使用UINT SendInput(
UINT nInputs, // count of input events
LPINPUT pInputs, // array of input events
int cbSize // size of structure
);api函數
第一個參數是說明第二個參數的矩陣的維數的,第二個參數包含了響應事件,這個自己填充就可以,最後是這個結構的大小,非常簡單,這是最簡單的方法模擬鍵盤鼠
標了,呵呵
注意:這個函數還有個替代函數:
VOID keybd_event(
BYTE bVk, // 虛擬鍵碼
BYTE bScan, // 掃描碼
DWORD dwFlags,
ULONG_PTR dwExtraInfo // 附加鍵狀態
);和
VOID mouse_event(
DWORD dwFlags, // motion and click options
DWORD dx, // horizontal position or change
DWORD dy, // vertical position or change
DWORD dwData, // wheel movement
ULONG_PTR dwExtraInfo // application-defined information
);
這兩個函數非常簡單了,我想那些按鍵精靈就是用的這個吧,呵呵,上面的是模擬鍵盤,下面的是模擬滑鼠的.
這個僅僅是模擬部分,要和游戲聯系起來我們還需要找到游戲的窗口才行,或者包含快捷鍵,就象按鍵精靈的那個激活鍵一樣,我們可以用GetWindow函數來枚舉窗口,也可以用Findwindow函數來查找制定的窗口(注意還有一個FindWindowEx),FindwindowEx可以找到窗口的子窗口,比如按鈕,等什麼東西.當游戲切換場景的時候我們可以用FindWindowEx來確定一些當前窗口的特徵,從而判斷是否還在這個場景,方法很多了,比如可以GetWindowInfo來確定一些東西,比如當查找不到某個按鈕的時候就說明游戲場景已經切換了,等等辦法.有的游戲沒有控制項在裡面,這是對圖像做坐標變換的話,這種方法就要受到限制了.這就需要我們用別的辦法來輔助分析了.
至於快捷鍵我們要用動態連接庫實現了,裡面要用到hook技術了,這個也非常簡單,大家可能都會了,其實就是一個全局的hook對象然後SetWindowHook就可以了,回調函數都是現成的,而且現在網上的例子多如牛毛,這個實現在外掛中已經很普遍了.如果還有誰不明白,那就去看看msdn查找SetWindowHook就可以了.
這個動態連接庫的作用很大,不要低估了哦,它可以切入所有的進程空間,也就是可以載入到所有的游戲裡面哦,只要用對,你會發現很有用途的!
這個需要你復習一下win32編程的基礎知識了,呵呵,趕快去看書吧!
2截獲消息
有些游戲的響應機制比較簡單,是基於消息的,或者用什麼定時器的東西,這個時候你就可以用攔截消息來實現一些有趣的功能了.
我們攔截消息使用的也是hook技術,裡麵包括了鍵盤消息,滑鼠消息,系統消息,日誌等,別的對我們沒有什麼大的用處,我們只用攔截消息的回調函數就可以了,這個不會讓我寫例子吧,其實這個和上面的一樣,都是用SetWindowHook來寫的,看看就明白了很簡單的.
至於攔截了以後做什麼就是你的事情了,比如在每個定時器消息裡面處理一些我們的數據判斷,或者在定時器裡面在模擬一次定時器,那麼有些數據就會處理兩次,呵呵,後果嘛,不一定是好事情哦,呵呵,不過如果數據計算放在客戶端的游戲就可以真的改變數據了,呵呵,試試看吧!用途還有很多,自己想也可以想出來的,呵呵!
3攔截socket包
這個技術
難度要比原來的高很多哦,要有思想准備.
首先我們要替換winSock.dll或者winsock32.dll,我們寫的替換函數要和原來的函數一致才行,就是說它的函數輸出什麼樣的,我們也要輸出什麼樣子的函數,而且參數,參數順序都要一樣才行,然後在我們的函數裡面調用真正的winSock32.dll裡面的函數就可以了
首先:我們可以替換動態庫到系統路徑
其次:我們應用程序啟動的時候可以載入原有的動態庫,用這個函數LoadLibary
然後定位函數入口用GetProcAddress函數獲得每個真正socket函數的入口地址
當游戲進行的時候它會調用我們的動態庫,然後從我們的動態庫中處理完畢後才跳轉到真正動態庫的函數地址,這樣我們就可以在裡面處理自己的數據了,應該是一切數據.呵呵!
興奮吧,攔截了數據包我們還要分析之後才能進行正確的應答,不要以為這樣工作就完成了,呵呵!還早呢,等分析完畢以後我們還要模擬應答機制來和伺服器通信,一個不小心就會被封號,呵呵,嗚~~~~~~~~我就被封了好多啊!
分析數據才是工作量的來源呢,游戲每次升級有可能加密方式會有所改變,因此我們寫外掛的人都是亡命之徒啊,被人娛樂了還不知道,呵呵!(聲明我可沒有賺錢,我是免費的)
好了,給大家一個不錯的起點,這里有完整的替換socket源代碼,呵呵!
http://www.vchelp.net/vchelp/zsrc/wsock32_sub.zip
4截獲api
上面的技術如果可以靈活運用的話我們就不用截獲api函數了,其實這種技術是一種補充技術.比如我們需要截獲socket以外的函數作為我們的用途,我們就要用這個技術了,其實我們也可以用它直接攔截在socket中的函數,這樣更直接.
現在攔截api的教程到處都是,我就不列舉了,我用的比較習慣的方法是根據輸入節進行攔截的,這個方法可以用到任何一種操作系統上,比如98/2000等,有些方法不是跨平台的,我不建議使用.這個技術大家可以參考windows核心編程裡面的545頁開始的內容來學習,如果是98系統可以用window系統奧秘那個最後一章來學習.
好了方法就是這么多了,看大家怎麼運用了,其它的一些針對性的技巧這里我就不說了,要不然會有人殺了我的,呵呵!
記住每個游戲的修改方法都不一樣,如果某個游戲數據處理全部在伺服器端,那麼你還是別寫外掛了,呵呵,最多寫個自動走路的外掛,哈哈!
數據分析的時候大家一定要注意,不要輕易嘗試和伺服器的連接,因為那有很危險,切忌!等你掌握了大量的數據分析結果以後,比較有把握了在試試,看看你的運氣好不好,很有可能會成功的哦,呵呵!
其實像網金也瘋狂的那種模擬客戶端的程序也是不錯的,很適合office的人用,就看大家產品定位了.
好了不說了,大家努力吧!切忌不要被游戲廠商招安哦,那樣有損
『捌』 如何寫HOOK 技能
This HOWTO deals with pre-hooks. For details on post-hooks, see 如何安全的Post-Hook一個函數.
For more information on the actual hooking of functions, see 如何Hook一個函數.
你通常這樣使用么
Meet Joe Average Hook:
local orig_foo = foo
function foo(a1, a2)
-- some code that looks at a1
return orig_foo(a1, a2)
end
問題在於這個方法只能處理固定數目的參數, 如果方法的API改變了, 將導致無法使用. 幸運的是我們有辦法使他繼續工作.
Blizzard's APIs do change from time to time!
使用安全的方式
local orig_foo = foo
function foo(a1, )
--do something with a1
return orig_foo(a1, )
end
這樣確保了所有的參數會傳遞到原始方法中, 即便你不知道具體有多少個參數. 同樣確保了所有返回值都能正確返回. 另一個好處是, 我們使用了局部變數來保存原始方法並做了一個適當的尾調用可以帶來更好的性能, 從而為我們的hook做了最小化的付出.
會帶來巨大的性能影響么?
在WoW-2.0以前的設計中, 使用unpack(), 在每次hook被調用時創建一個垃圾回收表. 在新的設計中改進了, 使用''變數, 去掉了垃圾回收這部分源碼. 在Lua5.1中, 在每次hook調用時包括傳參和返回值都不會浪費表的內存.