本教學使用的是英文版Visual C++ 2010。
強烈建議有C++基礎再來看。
強烈建議有C++基礎再來看。
建立專案
首先啟動
選擇
Visual C++ 2010,點選File->New->Project。選擇
Visual C++的Win32 Project,Name輸入專案名稱。
出現
點選
Win32 Application Wizard點Next。點選
DLL後將Empty Project打勾,接著點Finish。
建立檔案
由於我們建立的是一個空白專案(Empty Project),現在要新增原始碼(Source),以讓我們可以放程式碼(Code)。
在左方的
點選
Solution Explorer的Source Files按下右鍵,選擇Add,點New Item。點選
C++ File (.cpp),下方Name輸入Main.cpp,接著按下Add。
現在我們要新增一個表單(Form,用來設計執行後要出現的視窗),
在左方的
點選
在左方的
Solution Explorer的Header Files按下右鍵,選擇Add,點New Item。點選
Windows Form,下方Name輸入FormMain.h,接著按下Add。
按下
Add後會出現一個提示,這裡請按Yes。
寫程式碼
接著我們就能夠打上程式碼了。
在左方的
新增第一行,打上:
在左方的
Solution Explorer的Header Files中找到剛才建立的FormMain.h,按右鍵,選擇View Code。新增第一行,打上:
#include <Windows.h>

點兩下
在第二行打上:
FormMain.cpp,即可瀏覽程式碼內容。在第二行打上:
using namespace 你的名稱;
其中
你的名稱請替換成FormMain.h中namespace後面的文字,請參考圖片。
再來加入下方程式碼至
FormMain.cpp:void Main(void)
{
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
Application::Run(gcnew FormMain);
Application::Exit();
}
點兩下
第一行:
Main.cpp,開啟程式碼編輯畫面。第一行:
#include <Windows.h>
第二行:
extern void Main(void);
往下繼續加入下方程式碼:
::BOOL WINAPI DllWork ( __in ::HMODULE hModule )
{
Main();
return TRUE;
}
::BOOL WINAPI DllMain ( __in ::HMODULE hModule, __in ::DWORD dwReason, __in __reserved::LPVOID lpvReserved )
{
::HANDLE hThread = NULL;
if ( dwReason == DLL_PROCESS_ATTACH )
{
if (( hThread = ::CreateThread(NULL, 0, (::LPTHREAD_START_ROUTINE)&DllWork, (::HMODULE)hModule, 0, NULL) ) == NULL )
{
return FALSE;
}
if ( ::CloseHandle(hThread) == FALSE )
{ }
}
return TRUE;
}
最後結果如圖。

接著把專案編譯模式設定為
Release。
然後按下
F7,沒有出現錯誤表示編譯成功,再來就能開始設計了。新增功能
點兩下
從右方的
當然還可以從
FormMain.h就能開始設計界面。從右方的
Tool Box中點兩下或者用滑鼠拖曳CheckBox,就會有打勾選項了。當然還可以從
Properties中的Text來修改CheckBox和Form顯示的標題名稱(Caption)。
點兩下剛才新增的
checkBox1,把跟在後面的{和}刪除,然後加上;,如圖所示。
現在打開
我們拿
FormMain.cpp,新增第一個功能!我們拿
v159.2 CRC 技能連跳來示範,數據如下:[Enable]
00AE6090:
DB EB 04 90 90 90 90
[Disable]
00AE6090:
DB 0F 8D 2D 01 00 00
你看得懂數據的話,就會知道
在
00AE6090是要寫入的位址。在
FormMain.cpp最後方打上:DWORD UnlimitedJump_Address = 0x00AE6090;
再來就是修改記憶體,要把要修改的內容轉換成bytes(以BYTE陣列來表達)。
如下:
如下:
BYTE UnlimitedJump_Enable[] = {0xEB, 0x04, 0x90, 0x90, 0x90, 0x90};
BYTE UnlimitedJump_Disable[] = {0x0F, 0x8D, 0x2D, 0x01, 0x00, 0x00};
不懂數據的只要忽略
現在
DB,後面的內容照抄並照上方修改就行了。現在
FormMain.cpp的程式碼應該像這樣:
現在要加上打勾、取消的程式碼。
在 FormMain.cpp 下面加上:
在 FormMain.cpp 下面加上:
void FormMain::checkBox1_CheckedChanged(System::Object^ sender, System::EventArgs^ e)
{
if (this->checkBox1->Checked)
{
memcpy((void *)UnlimitedJump_Address, UnlimitedJump_Enable, sizeof(UnlimitedJump_Enable));
}
else
{
memcpy((void *)UnlimitedJump_Address, UnlimitedJump_Disable, sizeof(UnlimitedJump_Disable));
}
}
然後按下
編譯完成的
F7進行編譯,大公告成!編譯完成的
DLL會在專案所在位置的Release資料夾內,注入遊戲中就能看見成品囉!
敬請期待下次的教學。
沒有留言:
張貼留言