Unknown

DirectX 9.0 Hooking melalui Injection via C ++
Ok, jadi makhluk ini diminta, saya memutuskan untuk menulis ini up. Saya harap ini membantu seseorang dan jika tidak, maaf Pertama dan untuk sebagian besar, tutorial ini secara ketat untuk DirectX 9 dan saya jamin Anda tidak akan bekerja untuk versi lain tanpa editing besar di bungkusnya. Pada akhir ini saya juga akan mencakup beberapa petunjuk tentang cara untuk mengubah ini disuntikkan hook ke dalam pembungkus ke titik di mana Anda hanya dapat mengkompilasi sebagai d3d9.dll dan drop ke direktori permainan Anda dan menjalankannya melalui metode itu juga.
(Saya sarankan "wrapper" metode karena kebanyakan menipu deteksi tidak menemukannya sebagai hack karena beberapa mesin membutuhkan yang d3d9.dll dalam folder untuk bekerja.)

Saya menulis tutorial ini untuk digunakan dengan C ++ namun Anda dapat menerjemahkan ke bahasa apa yang pernah Anda ingin program di seperti itu cukup mendasar dan tidak terlalu besar. Wrapper adalah di mana pekerjaan yang paling datang untuk bermain sehingga Anda akan perlu untuk melakukan itu sendiri. Maaf, saya tidak tahu bahasa lain di luar C ++, MASM, dan VB6 sehingga Anda berada pada Anda sendiri ketika menerjemahkan.

Bagian 1. Pendahuluan dan seperti
Sebelum kita mulai, biarkan aku pergi lebih dari apa yang dilakukan dan bagaimana cara kerjanya. Pertama, metode tutorial utama ini adalah melalui suntikan. Apa yang dilakukan adalah membuat thread terpencil dalam proses sebagai yang memulai dan menyuntikkan mata kail dan panggilan yang DllMain (atau fungsi utama DLL) dan kait fungsi Direct3D9Create. Dari sana, saat pertandingan, atau aplikasi DX Anda menggunakan panggilan Direct3D9Create, ia akan memanggil fungsi doyan Anda, bukan yang asli. Ketika itu terjadi, alih-alih menggunakan fungsi standar DirectX, ia akan menggunakan wrapper "proxy" fungsi yang dimodifikasi untuk kebutuhan Anda dan semacamnya. Hal ini memungkinkan Anda untuk menambahkan ke permainan, atau aplikasi, seperti gambar rangka, primitif berwarna, dll Hal-hal seperti yang Anda lihat dalam hacks dan sebagainya.

Seiring dengan itu, membuka jendela untuk setiap fitur tambahan lainnya (s) Anda bisa datang dengan sendiri. Batas-batas kecil, hanya apa yang Anda mampu lakukan dan semacamnya.

Tutorial ini akan menjelaskan bagaimana melakukan dasar-dasar, membuat kail, menunjukkan contoh wrapper, dan menjelaskan hal-hal kecil bersama dengan hook. Aku akan mencakup contoh lengkap juga bahwa saya akan menemukan beberapa program bebas acak menampilkan cara kerjanya dan seperti dalam juga. Saya akan menambahkan modus gambar rangka ke tombol toggle untuk menunjukkan cara untuk menambahkan beberapa kode Anda sendiri ke hook juga

Bagian 2. Peralatan yang Dibutuhkan
Ini adalah daftar kecil dari hal-hal yang Anda akan perlu untuk dapat menggunakan tutorial ini.
Microsoft Visual Studio 2005
Anda tidak perlu versi lengkap untuk membuat hal-hal, Anda dapat menggunakan edisi mengungkapkan sejauh yang saya tahu untuk mengkompilasi hal selama mereka adalah non-komersial (dari apa yang saya diberitahu). Jika tidak, cari versi lengkap di situs warez atau bersikap baik dan membelinya
Download

Microsoft Detours Library 1.5
Unduh dari MS
Karena beberapa alasan yang tidak diketahui, pembuat perpustakaan Detours telah menghapus fungsi yang digunakan dalam tutorial ini dari versi baru. Jadi, Anda akan perlu untuk men-download versi dikompilasi di sini

Microsoft DirectX 9.0c SDK
Dan lagi, lagi download gratis dari Microsoft untuk pengembang. (Bukankah mereka begitu baik untuk programmer? ^ _ ^)
Download
Catatan: Anda harus memiliki versi nyata Windows untuk di-download ini jadi jika Anda tidak, hanya google sekitar untuk itu. Saya tidak berpikir hal-hal versi. Saya menggunakan update Oktober 2006 untuk sebagian besar proyek-proyek lama saya, tetapi telah menginstal versi Juni 2007 dan barang-barang saya masih mengkompilasi baik sehingga baik harus ok.

Misc Alat
Sebuah otak, kesabaran, bersedia untuk membaca dan belajar, kopi.

Bagian 3. Memasang Alat
Pertama, semua alat-alat yang di installer, jadi cukup menginstal mereka untuk lokasi mereka dihormati. TAPI !! Saya sarankan Anda menginstal Visual Studio pertama, karena beberapa alat lain mungkin menginstal variabel dan jalan bagi Anda untuk dengan mudah memasukkan sesuatu ke dalam proyek Anda tanpa banyak pekerjaan omong kosong dan semacamnya. Jadi, menginstal VS2005 pertama, kemudian yang lain.

VS2005 menginstal default C: Program FilesMicrosoft Visual Studio 8
DX SDK menginstal default C: Program FilesMicrosoft DirectX SDK (m / y)

Menambahkan Jalur Untuk VS2005
Selanjutnya kita perlu menambahkan path ke file tambahan yang digunakan dalam jalan memutar dan folder DirectX SDK. Hal ini agar Anda tidak perlu memiliki pantat yang panjang termasuk garis dalam proyek Anda, tetapi compiler akan melihat ke dalam folder dikatakan untuk berkas yang disertakan dalam proyek pertama. (Tapi berhati-hatilah, ini dapat menyebabkan konflik jika Anda menggunakan lebih dari 1 versi sesuatu yang memiliki nama file yang sama!)
Buka Visual Studio dan goto Tools -> Options kemudian klik + sebelah Direktori VC ++. Di sebelah kanan, klik drop down box di bawah "Tampilkan Direktori Untuk" dan pilih "Sertakan file '. Selanjutnya klik icon folder dan kemudian tombol yang muncul di kotak daftar yang mengatakan '. . . ' dan arahkan ke folder:
C: Program FilesMicrosoft DirectX SDK (Oktober 2006) Sertakan
(Mengubah jalan untuk salah satu dari ini jika mereka berbeda)

Selanjutnya, pilih 'file Library' dari kanan drop-down daftar dan kemudian klik icon folder lagi, maka '. . . ' tombol dan arahkan ke:
C: Program FilesMicrosoft DirectX SDK (Oktober 2006) Libx86
(Mengubah jalan jika mereka berbeda)

Instalasi Detours
Ini merupakan langkah diperbarui sekarang karena masalah dengan jalan memutar 2.1. Untuk menginstal Detours, Anda bisa memasukkan detours.h dan file lib di mana pun Anda inginkan di sistem anda, pastikan untuk menambahkan path mereka ke VS2005 IDE seperti yang Anda lakukan untuk DX SDK di atas. Atau, seperti yang saya akan gunakan dalam tutorial ini, membuat folder baru dalam direktori proyek Anda dengan file lain sumber (H dan Cpp file) dan beri nama 'Pengalihan' dan menempatkan file di sana. Ini mungkin akan menjadi cara termudah untuk menggunakannya.

Sekarang IDE Anda harus setup untuk menggunakan file DX SDK dengan mudah.
Jika Anda mengalami masalah di kemudian hari, hanya posting kesalahan dan saya akan mencoba untuk membantu Anda untuk yang terbaik dari kemampuan saya.
Aku tidak Yesus jadi jangan berharap saya untuk memperbaiki setiap kesalahan.

Bagian 4. Membuat Hook
Untuk memulai hook, membuat proyek DLL baru di VS2005. Untuk melakukan itu, buka VS2005. Kemudian goto File -> New -> Project. Pilih VC ++ dari kotak kiri kemudian di sebelah kanan pilih Win32 Project. Pilih nama untuk proyek Anda dan lokasi untuk itu.

Catatan: untuk tutorial ini saya akan menelepon dxhook tambang dan lokasi akan berada di desktop saya. Saya juga menyarankan meninggalkan Buat directory untuk solusi diperiksa.

Sekarang Win32 Application Wisaya harus datang. Klik pada Pengaturan Aplikasi di sebelah kiri, pilih DLL bawah Application Type, dan pilih Project Kosong bawah Opsi tambahan. Kemudian klik finish. Anda akan dibuang ke IDE dari VS2005 dalam larutan kosong baru.

Meskipun kami akan memiliki header dikompilasi dimatikan, kita akan membuat stdafx.cpp / H file pula karena mereka baik untuk memiliki untuk mencakup bahwa beberapa file akan menggunakan. Jadi mari kita pergi ke depan dan menambahkan file utama yang akan kita gunakan dalam hal ini.

Untuk menambahkan file baru ke proyek, klik kanan di explorer solusi dan pilih Tambah kemudian pilih New Item dari sub menu. Anda akan ingin menambahkan 2 file cpp dan 1 file header. Jadi:

Add> New Item-> header file, nama itu stdafx.h
Add> New Item-> C ++ File, beri nama stdafx.cpp
Add> New Item-> C ++ File, beri nama main.cpp

Jadi, Anda harus memiliki 3 file dalam larutan Anda sekarang.

stdafx.cpp
Mari mengurus file lebih mudah pertama. Terbuka stdafx.cpp dengan mengklik ganda dalam larutan explorer untuk membukanya di jendela kode di pusat IDE. File ini membutuhkan 1 baris kode.

#include "stdafx.h"

Simpan dan tutup file yang sekarang. Anda tidak perlu mengedit file itu lagi.

stdafx.h
Berikutnya, mari kita mengurus kebutuhan dasar dalam file stdafx.h yang akan digunakan untuk memulai proyek ini. Klik jadi dua kali pada stdafx.h dalam larutan explorer dan memungkinkan menambahkan beberapa kode.

Hal pertama yang kita ingin lakukan adalah untuk menyingkirkan beberapa peringatan agak mengganggu. Jika Anda seperti saya, saya memiliki set compiler untuk mengobati peringatan sebagai kesalahan. Saya suka hal yang harus sesempurna mungkin.

Baris pertama dari kode kita akan ingin menambah stdafx.h adalah:

# Pragma sekali

Ini memberitahu compiler hanya menambahkan file ini sekali untuk proyek bukannya menambahkan setiap kali yang bertanya. Ini akan ditambahkan pertama jadi tidak ada masalah harus muncul saat menggunakan pengaturan ini.

Selanjutnya, kita akan ingin memberitahu compiler apa versi DXinput digunakan untuk SDK serta versi windows untuk menghentikan omong kosong menjengkelkan yang terjadi ketika itu bukan auto-terdeteksi dalam compiler. Untuk melakukan add ini:

#define DIRECTINPUT_VERSION 0x0900
#define _WIN32_WINNT 0x0500

Sekarang kita tidak perlu lagi mendefinisikan dalam file ini, kami siap untuk menambahkan kami meliputi. Yang pertama mencakup adalah jendela standar include file yang digunakan untuk sebagian besar program yang membutuhkan header tertentu yang berasal dalam file windows.h. Seiring dengan itu, kita akan membutuhkan tchar.h untuk beberapa macro dan untuk menangani string unicode. (Ya, saya melakukan pekerjaan saya di unicode.)

Jadi kode yang kami ingin menambahkan adalah:

#include <windows.h>
#include <tchar.h>

Sekarang, Anda bisa menambahkan jalan memutar mencakup dan seperti dalam sini, tapi karena tidak digunakan di tempat lain tapi di 1 file, saya sarankan hanya menambahkannya ke file selanjutnya. Tidak ada gunanya memberikan segalanya akses ke sana ketika hanya 1 hal membutuhkannya.

Simpan dan tutup file stdafx.cpp.

main.cpp
Selanjutnya, buka file main.cpp. Di sinilah hooking terjadi. Kami akan menggunakan Pengalihan fungsi hooking kami karena gratis dan mudah digunakan. Aku tidak akan menjamin bahwa hal itu akan terdeteksi untuk permainan Anda jadi hati-hati ketika menguji.

Baris pertama dari kode yang kami ingin Anda tambahkan ke file ini adalah untuk menyertakan file stdafx.h karena memiliki termasuk yang akan dibutuhkan untuk file ini. Jadi menambahkan:

#include "stdafx.h"

Selanjutnya kita perlu menambahkan kami meliputi dan file library untuk Detours. Saya sendiri lebih suka menggunakan thats pragma param digunakan dengan Visual Studio ketimbang menambahkan file lib untuk proyek properti, tetapi jika Anda tidak menggunakan VS2005 hanya menghapus baris pragma saya akan menunjukkan dan menambahkan file lib ke jendela properti dalam kompiler untuk proyek untuk menyertakan ketika link dan mengkompilasi.

# Pragma comment (lib, "Pengalihan / detours.lib")
#include "Detours / detours.h"

Berikutnya Saya menyarankan untuk menambahkan variabel ini ke atas bawah termasuk untuk jalan memutar untuk melacak pegangan modul memetikan Anda membutuhkannya di tempat lain dalam kode. Saya tidak berpikir siapa pun harus pernah benar-benar membutuhkannya untuk hal mereka sendiri dan tidak bisa mendapatkan itu metode lain tapi ini hanya membungkus.

Jadi kita tambahkan:

MENANGANI HookHandle = NULL;

Sekarang kita akan ingin menambahkan trampolin untuk fungsi doyan kami, Direct3DCreate9. Jadi pertama, Anda mungkin mengatakan wtf adalah trampolin dalam coding? Its just seperti gua kode. Ketika Anda menghubungkan sesuatu menggunakan Detours, kode fungsi sasaran ditempatkan di trampolin dan alamat trampolin ditempatkan ke dalam target pointer. Seperti yang dikatakan dalam membaca saya, kita dapat mengganti fungsi target seluruhnya atau hanya menambahkan ke atasnya.

Kode untuk trampolin terlihat seperti ini:

DETOUR_TRAMPOLINE (IDirect3D9 * WINAPI Real_Direct3DCreate9 (UINT SDKVersion), Direct3DCreate9);

Tapi karena kita membutuhkan fungsi ini tetap dapat digunakan setelah dikompilasi kita perlu memberitahu compiler tidak "mangle" pengenal. Untuk melakukan itu kita perlu merangkul kode kita dengan extern "C" kode. Jadi kode seluruh blok kami untuk trampolin akan:

  ifdef __cplusplus 

 extern "C" 

 { 

 #endif 

    DETOUR_TRAMPOLINE (IDirect3D9 * WINAPI Real_Direct3DCreate9 (UINT SDKVersion), Direct3DCreate9); 

 ifdef __cplusplus 

 } 

 #endif 


Langkah selanjutnya setelah membuat trampolin akan membuat fungsi baru untuk Direct3DCreate9. Apa yang kita ingin fungsi untuk melakukan bukan menciptakan contoh normal Direct3D adalah untuk menciptakan sebuah contoh baru dari wrapper kami. (Kami tidak menulis bungkusnya belum tapi thats berikutnya.) Jadi apa yang akan kita perlu lakukan adalah memiliki fungsi berpikir itu membuat contoh normal Direct3D melainkan memilikinya membuat contoh baru dari wrapper kami.

  IDirect3D9 * WINAPI Mine_Direct3DCreate9 (UINT SDKVersion) 

 { 

    IDirect3D9 * Direct3D = Real_Direct3DCreate9 (SDKVersion); 

    IDirect3D9 * Mine_Direct3D = new Direct3D9Wrapper (Direct3D); 

    kembali Mine_Direct3D; 

 } 


Apa kode ini dilakukan adalah membuat turunan normal Direct3D karena kami hanya hanya ingin membungkusnya dan tidak recode segalanya. Ini akan melewati pegangan antarmuka Direct3D baru dibuat untuk wrapper kami yang kemudian akan "proxy" fungsi yang menggunakan Direct3D.

Sekarang ini bagian selanjutnya adalah opsional, tetapi saya sarankan melakukannya untuk menjaga fungsi DllMain bagus, bersih, dan mudah dibaca. Aku diciptakan untuk fungsi-fungsi yang dipanggil dari DllMain yaitu: HookAPI dan UnhookAPI. Keduanya batal fungsi sederhana karena mereka kembali apa-apa. Untuk HookAPI kami:

  membatalkan HookAPI () 

 { 

    DetourFunctionWithTrampoline ((PBYTE) Real_Direct3DCreate9, (PBYTE) Mine_Direct3DCreate9); 

 } 


Dan untuk UnhookAPI kita memiliki: Kode:
  membatalkan UnhookAPI () 

 { 

    DetourRemove ((PBYTE) Real_Direct3DCreate9, (PBYTE) Mine_Direct3DCreate9); 

 } 


Sekarang untuk bagian terakhir dari main.cpp kita, kita perlu fungsi DllMain. Bagi mereka yang baru untuk C ++, setiap DLL memiliki titik masuk yang adalah apa yang pertama kali disebut ketika modul tersebut dimuat. Entry point ini disebut fungsi DllMain. (Beberapa compiler akan membiarkan Anda mengubah nama itu tapi saya menggunakan standar.) Di dalam entri DllMain kami kami ingin modul, ketika dimuat pertama, untuk memanggil HookAPI, dan ketika yang diturunkan, untuk memanggil UnhookAPI. Ini sangat mendasar dan sangat mudah. Untuk melakukannya, kita gunakan:

  Bool APIENTRY DllMain (HMODULE hModule, ul_reason_for_call DWORD, LPVOID lpReserved) 

 { 

    if (ul_reason_for_call == DLL_PROCESS_ATTACH) 

    { 

       DisableThreadLibraryCalls (hModule); 

       HookHandle = hModule; 

       HookAPI (); 

    } 

    lain jika (ul_reason_for_call == DLL_PROCESS_DETACH) 

    { 

       UnhookAPI (); 

    } 

     mengembalikan TRUE; 

 } 


Perhatikan juga variabel HookHandle yang digunakan di dalam sana? Kami menyimpan pegangan modul yang akan digunakan di kemudian hari memetikan Anda membutuhkannya lain di mana. Seiring dengan bahwa kita memiliki DisableThreadLibraryCalls di sana juga. Hal ini menghilangkan panggilan dari DLL_THREAD_ATTACH dan DLL_THREAD_DETACH untuk meminimalkan kode kerja perpustakaan. (Membantu menjaga ukuran bawah.)

Sekarang main.cpp kami dilakukan. Tapi! Kita perlu kembali dan mengedit stdafx.h. Aku meninggalkan kode ini untuk menunjukkan kepada Anda bagaimana untuk bekerja dengan mencakup yang Anda butuhkan dan menambahkannya bila diperlukan.

Jadi mari kita membuka kembali stdafx.h bawah yang terakhir termasuk yang harus tchar.h kita ingin menambahkan termasuk untuk DirectX 9. Ini akan digunakan dalam pembungkus kami serta dalam main.cpp seperti yang Anda lihat dari kode di atas. Jadi kami ingin menambahkan:

# Pragma comment (lib, "d3d9.lib")
#include <d3d9.h>
#include <d3dx9.h>

Sekali lagi, saya menggunakan # Pragma menyebabkan mudah dan cepat untuk menambah perpustakaan untuk proyek tanpa harus meraba-raba dengan sifat proyek. Saya tidak berpikir compiler apapun tapi Microsoft mendukung ini sehingga Anda mungkin perlu melakukannya metode yang berbeda untuk menambahkan perpustakaan untuk proyek.

Sekarang kita selesai dengan itu, simpan dan tutup file tersebut.

Bagian 5. Wrapper

Pertama dan terpenting kita akan perlu menambahkan beberapa file baru untuk proyek tersebut. Sama seperti yang kita lakukan sebelum Anda akan ingin membuat file baru sebagai berikut:

ID3D9Wrapper.h
ID3D9Wrapper.cpp
ID3D9Wrapper_Device.h
ID3D9Wrapper_Device.cpp

Saya sarankan membuat filter baru dalam larutan explorer juga (folder baru) untuk menampung file wrapper. Nama itu D3DWrapper atau sesuatu yang mudah untuk menjaga solusi terorganisir dan mudah untuk menemukan apa yang Anda butuhkan untuk mengedit nanti. Menambahkan banyak file dapat mulai membuat sulit untuk menemukan apa yang Anda cari.

Kita akan mulai dengan ID3D9Wrapper.h dan .cpp ini adalah pembungkus Direct3D utama, di mana sebagai file _Device adalah untuk membungkus fungsi perangkat. (Baca di DirectX jika Anda tidak yakin bagaimana segala sesuatu dengan kerjanya. Saya tidak bisa benar-benar menjelaskan semuanya penyebab yang akan menjadi seluruh tutorial lainnya.)

ID3D9Wrapper.h
Pertama kita ingin membuka notepad dan membuka file yang terletak di:
C: Program FilesMicrosoft DirectX SDK (Oktober 2006) Included3d9.h
(Mungkin berbeda untuk versi SDK tetapi akan disebut d3d9.h)

Kami membuka ini karena file ini berisi fungsi-fungsi yang kita perlu menambah wrapper kami. Di sinilah kita mendapatkan informasi yang kita butuhkan untuk memahami apa setiap bagian dari DirectX melakukan fungsi bijaksana. Jadi gulir ke bawah dalam file tersebut dan Anda harus menemukan beberapa hal yang telah kita lakukan di atas. Seperti typedef baru kami, itu juga digunakan dalam file ini serta fungsi untuk membuat contoh Direct3D. Jauhkan bergulir sampai Anda menemukan:

DECLARE_INTERFACE_ (IDirect3D9, IUnknown)

Ini adalah awal dari antarmuka utama untuk Direct3D9. Kami ingin menggunakan dasarnya thats kode yang tepat infront dari kami. Pertama, mari kita membuat kelas di dalam file kode kita. Jadi dalam ID3D9Wrapper.h menambahkan:
  #include "stdafx.h" 



 kelas Direct3D9Wrapper: IDirect3D9 publik 

 { 

 publik: 



    Direct3D9Wrapper (LPDIRECT3D9 pDirect3D); 

    virual ~ Direct3D9Wrapper (); 



    IDirect3D9 * Direct3D9; 

 }; 

Ini adalah awal dari kelas kami. Kami menyertakan stdafx.h karena termasuk DirectX9 termasuk dan seperti yang kita butuhkan dalam file ini dan lain-lain segera datang. Berikutnya, kembali jendela notepad dari d3d9.h memungkinkan copy dan paste beberapa baris.
  / *** Metode IUnknown *** / 

    STDMETHOD (QueryInterface) (THIS_ REFIID riid, kekosongan ** ppvObj) PURE; 

    STDMETHOD_ (ULONG, AddRef) (INI) PURE; 

    STDMETHOD_ (ULONG, Pers) (INI) PURE; 



    / *** Metode IDirect3D9 *** / 

    STDMETHOD (RegisterSoftwareDevice) (void THIS_ * pInitializeFunction) PURE; 

    STDMETHOD_ (UINT, GetAdapterCount) (INI) PURE; 

    STDMETHOD (GetAdapterIdentifier) ​​(THIS_ UINT Adapter, Flags DWORD, D3DADAPTER_IDENTIFIER9 * pIdentifier) ​​PURE; 

    STDMETHOD_ (UINT, GetAdapterModeCount) (THIS_ UINT Adapter, D3DFORMAT Format) PURE; 

    STDMETHOD (EnumAdapterModes) (THIS_ UINT Adapter, D3DFORMAT Format, UINT Mode, D3DDISPLAYMODE * pMode) PURE; 

    STDMETHOD (GetAdapterDisplayMode) (THIS_ UINT Adapter, D3DDISPLAYMODE * pMode) PURE; 

    STDMETHOD (CheckDeviceType) (THIS_ UINT Adapter, D3DDEVTYPE DevType, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, Bool bWindowed) PURE; 

    STDMETHOD (CheckDeviceFormat) (THIS_ UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, DWORD Penggunaan, D3DRESOURCETYPE RType, D3DFORMAT CheckFormat) PURE; 

    STDMETHOD (CheckDeviceMultiSampleType) (THIS_ UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SurfaceFormat, Bool Windowed, D3DMULTISAMPLE_TYPE MultiSampleType, DWORD * pQualityLevels) PURE; 

    STDMETHOD (CheckDepthStencilMatch) (THIS_ UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat) PURE; 

    STDMETHOD (CheckDeviceFormatConversion) (THIS_ UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SourceFormat, D3DFORMAT TargetFormat) PURE; 

    STDMETHOD (GetDeviceCaps) (THIS_ UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9 * pCaps) PURE; 

    STDMETHOD_ (HMONITOR, GetAdapterMonitor) (THIS_ UINT Adapter) PURE; 

    STDMETHOD (CreateDevice) (THIS_ UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS * pPresentationParameters, IDirect3DDevice9 ** ppReturnedDeviceInterface) PURE; 

Dan paste ke ID3D9Wrapper.h antara fungsi virtual dan variabel IDirect3D9 *. Jika Anda disisipkan di tempat yang tepat hal terakhir di bungkusnya harus:

IDirect3D9 * Direct3D9; };

Langkah selanjutnya yang perlu kita lakukan adalah menghapus PURE mendefinisikan dari masing-masing fungsi. Hapus saja kata PURE sehingga hal terakhir di setiap baris adalah); Cara mudah untuk melakukan ini adalah menekan CTRL + H, di Cari Apa menempatkan: "MURNI;" (Tanpa tanda kutip tetapi dengan ruang di depan) dan di Ganti Dengan put: ";" (Tanpa tanda kutip) dan pastikan untuk memilih Document sekarang di bawah Look In. Kemudian tekan mengganti semua.

Semua selesai, simpan dan tutup file ini.

ID3D9Wrapper.cpp
Sekarang untuk file ini, saya tidak menulis semuanya yang akan di sini di forum karena yang satu ton kotoran kode. Anda harus menulis ulang semua fungsi yang kita hanya ditambahkan ke H file. Tapi jangan khawatir mudah sebenarnya. Anda hanya menciptakan fungsi untuk mengembalikan nilai normal seolah-olah itu adalah contoh nyata Direct3D.

Pertama, kita tambahkan kami meliputi dan menciptakan kelas konstruk / mendekonstruksi.

Jadi dalam ID3D9Wrapper.cpp termasuk Anda akan ingin adalah:

#include "ID3D9Wrapper.h"

Selanjutnya kita harus membangun kami kelas. Kami ingin menyimpan pointer Direct3D untuk digunakan di dalam kelas sehingga kita gunakan:
  Direct3D9Wrapper :: Direct3D9Wrapper (LPDIRECT3D9 pDirect3D) 

 { 

    Direct3D9 = pDirect3D; 

 } 


Dan di bawah, mendekonstruksi kami tidak perlu melakukan apa-apa jadi:

Direct3D9Wrapper :: ~ Direct3D9Wrapper () {}

Berikutnya adalah fungsi. Anda bisa hanya berjalan turun melalui setiap fungsi dan menambahkannya sendiri dengan mudah. Aku akan menunjukkan contoh bagaimana untuk melakukannya sendiri. (Anda juga dapat melihat pada contoh jika Anda tidak mengerti.)

Fungsi pertama kami dalam daftar adalah:

STDMETHOD (QueryInterface) (THIS_ REFIID riid, kekosongan ** ppvObj);

Untuk memahami hal ini, STDMETHOD adalah makro yang menyatakan apa-apa di dalam () akan mengembalikan HRESULT. Adapun STDMETHOD_ ini adalah seperti versi diperpanjang makro yang menyatakan nilai pertama dalam () adalah jenis kembali, dan yang kedua adalah nama fungsi.

Jadi melihat garis itu, kita tahu QueryInterface kembali HRESULT. Jadi fungsi kita di dalam file .cpp akan terlihat seperti:
  HRESULT Direct3D9Wrapper :: QueryInterface (const IID & riid, kekosongan ** ppvObj) 

 { 

    kembali Direct3D9-> QueryInterface (riid, ppvObj); 

 } 

Sederhana bukan?

Sebuah contoh dari fungsi menggunakan STDMETHOD_ akan:

STDMETHOD_ (ULONG, AddRef) (INI);

Jadi fungsi kita akan:
  ULONG Direct3D9Wrapper :: AddRef () 

 { 

    kembali Direct3D9-> AddRef (); 

 } 

Setelah Anda mendapatkan ke CreateDevice, berhenti. Ini adalah fungsi yang kita butuhkan untuk mengubah dari kode aslinya. Hal ini karena jika kita tidak itu hanya akan membuat antarmuka Direct3DDevice9 biasa. Sebaliknya, kita ingin membuat sebuah instance dari kelas Direct3DDevice9Wrapper kami.

Jadi fungsi CreateDevice kami akan terlihat seperti:
  HRESULT Direct3D9Wrapper :: CreateDevice (UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS * pPresentationParameters, IDirect3DDevice9 ** ppReturnedDeviceInterface) 

 { 

    IDirect3DDevice9 * pDirect3DDevice9; 

    HRESULT hres = Direct3D9-> CreateDevice (Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, & pDirect3DDevice9); 

    * PpReturnedDeviceInterface = Direct3DDevice9Wrapper baru (pDirect3DDevice9, ini, pPresentationParameters); 

    kembali hres; 

 } 

Seperti yang Anda lihat, bukannya kembali perangkat biasa digunakan dalam CreateDevice, kami mengatur perangkat pembungkus pointer kami dengan yang digunakan di ppReturnedDeviceInterface. Hal ini dimaksudkan agar menggunakan wrapper kami bukannya fungsi Direct3DDevice normal.

Dan Anda selesai dengan file ini sekarang. Jadi, Anda dapat menyimpan dan menutupnya.

ID3D9Wrapper_Device.h
Sama seperti file H lain untuk bungkusnya, Anda perlu menemukan fungsi-fungsi yang digunakan oleh antarmuka Direct3DDevice9 asli. Untuk melakukan itu, kembali ke notepad Anda yang memiliki d3d9.h membuka dan gulir ke bawah lebih jauh dari tempat terakhir kami menyalin kode dari. Tidak banyak lebih bawah dari tempat kami hanya berada di file tersebut, Anda harus menemukan:

DECLARE_INTERFACE_ (IDirect3DDevice9, IUnknown)

Ini adalah awal antarmuka Direct3DDevice9 yang kita akan memerlukan kode dari. Seperti yang saya katakan di atas, ini adalah file yang berisi kode yang paling dalam buku ini dan tutorial. Saya tidak akan menunjukkan kepada Anda semua untuk menyalin di sini karena itu akan menjadi jalan panjang, tapi, saya akan menunjukkan Anda di mana untuk memulai dan menghentikan:

Mulai menyalin di:
  / *** Metode IUnknown *** / 

     STDMETHOD (QueryInterface) (THIS_ REFIID riid, kekosongan ** ppvObj) PURE; 

     STDMETHOD_ (ULONG, AddRef) (INI) PURE; 

     STDMETHOD_ (ULONG, Pers) (INI) PURE; 

Menyalin semua, termasuk apa yang baru saja saya menunjukkan di atas, ke, dan termasuk:
  STDMETHOD (DrawTriPatch) (THIS_ UINT Menangani, CONST mengambang * pNumSegs, CONST D3DTRIPATCH_INFO * pTriPatchInfo) PURE; 

     STDMETHOD (DeletePatch) (THIS_ UINT Handle) PURE; 

     STDMETHOD (CreateQuery) (THIS_ D3DQUERYTYPE Type, IDirect3DQuery9 ** ppQuery) PURE; 

Ya, itu banyak hal, tapi, sangat mudah untuk menulis mereka. Mereka hanya pass-through fungsi sehingga Anda tidak perlu menambahkan kode apapun di dalamnya lain kemudian kembali kecuali Anda memodifikasi mereka untuk kebutuhan anda.

Ok itu dikatakan, copy dan paste kode ke ID3D9Wrapper_Device.h maka Anda akan perlu untuk merangkul ini, seperti header lain, di kelas. Pertama, kita perlu kami meliputi:

# Pragma sekali
#include "stdafx.h"

Selanjutnya, kelas mendefinisikan:

kelas Direct3DDevice9Wrapper: IDirect3DDevice9 publik
{
publik:

Berikutnya, konstruk / mendekonstruksi, yang akan ditambahkan setelah baris yang mengatakan publik:
  Direct3DDevice9Wrapper (IDirect3DDevice9 * pDirect3DDevice9, IDirect3D9 * pDirect3D9, D3DPRESENT_PARAMETERS * pPresentationParameters); 

    maya ~ Direct3DDevice9Wrapper (); 

Kemudian pada akhir file, Anda akan memerlukan menutup kelas. Tapi Anda juga akan membutuhkan 3 variabel yang akan digunakan di dalam kelas ini. Yang merupakan variabel yang memegang pointer ke perangkat dan variabel untuk melacak langkah.
  IDirect3DDevice9 * Direct3DDevice9; 

    IDirect3D9 * Direct3D9; 



    UINT m_Stride; 

 }; 

Selanjutnya, Anda perlu untuk menghapus garis PURE lagi. Sama seperti sebelumnya, tekan CTRL + H, di kotak atas masukkan 'PURE;' termasuk ruang tetapi tidak tanda kutip, dan di bagian bawah, ';' tidak termasuk tanda kutip. Kemudian tekan Ganti Semua yang harus mengganti seperti 115-120 hal. Sekarang Anda selesai dengan file ini untuk saat ini, jadi simpan dan tutup.


ID3D9Wrapper_Device.cpp
Ah, file ibu-beban. File ini berisi kode yang paling seperti yang saya katakan, tapi sekali lagi seperti yang saya katakan, itu hanya melewati fungsi pada awalnya sampai Anda menambahkan hal-hal sendiri. Jadi mari kita mulai ..

Pertama, kita perlu kami meliputi untuk file:

#include "ID3D9Wrapper_Device.h"

Kita hanya perlu ini karena H file sudah termasuk stdafx.h yang berisi lainnya termasuk yang akan dibutuhkan. Selanjutnya, kita perlu membangun kami / mendekonstruksi kelas ini:
  Direct3DDevice9Wrapper :: Direct3DDevice9Wrapper (IDI rect3DDevice9 * pDirect3DDevice9, IDirect3D9 * pDirect3D9, D3DPRESENT_PARAMETERS * pPresentationParameters) 

 { 

    Direct3DDevice9 = pDirect3DDevice9; 

    Direct3D9 = pDirect3D9; 

 } 



 Direct3DDevice9Wrapper :: ~ Direct3DDevice9Wrapper () {} 

Dalam membangun, kita meraih pointer ke perangkat dan menyimpannya untuk digunakan dalam kelas ini, dan kemudian mengubah perangkat penunjuk kembali dengan satu doyan kami sehingga sistem ini menggunakan fungsi kami dibungkus.

Selanjutnya, Anda perlu untuk pergi melalui daftar fungsi dan menulis mereka keluar seperti yang Anda lakukan dengan file lain. Ingat, STDMETHOD berarti jenis kembali adalah HRESULT dan STDMETHOD_ berarti jenis kembali adalah variabel pertama dalam kurung.

Lagi Heres beberapa contoh untuk membantu Anda dengan langkah ini:
  HRESULT Direct3DDevice9Wrapper :: QueryInterface (const IID & riid, kekosongan ** ppvObj) 

 { 

    kembali Direct3DDevice9-> QueryInterface (riid, ppvObj); 

 } 



 ULONG Direct3DDevice9Wrapper :: AddRef () 

 { 

    kembali Direct3DDevice9-> AddRef (); 

 } 



 ULONG Direct3DDevice9Wrapper :: Rilis () 

 { 

    kembali Direct3DDevice9-> Pers (); 

 } 

Sekarang kita perlu membuat beberapa suntingan ke kode yang baru saja dibuat. Bukan masalah besar, hanya beberapa hal-hal kecil. Pertama, untuk logger Stride, Anda ingin mengubah SetStreamSource untuk terlihat seperti ini:
  HRESULT Direct3DDevice9Wrapper :: SetStreamSource (UINT StreamNumber, IDirect3DVertexBuffer9 * pStreamData, UINT OffsetInBytes, UINT Stride) 

 { 

    if (StreamNumber == 0) 

       m_Stride = Stride; 



    kembali Direct3DDevice9-> SetStreamSource (StreamNumber, pStreamData, OffsetInBytes, Stride); 

 } 

Selanjutnya, Anda perlu untuk mengubah GetDirect3D, bukan membiarkannya pengaturan variabel ke pointer asli, kita ingin mengaturnya untuk pembungkus kami, jadi kami menggunakan:
  HRESULT Direct3DDevice9Wrapper :: GetDirect3D (IDirect3D9 ** ppD3D9) 

 { 

    * PpD3D9 = Direct3D9; 

    kembali D3D_OK; 

 } 

Dan penyesuaian lain untuk QueryInterface:
  HRESULT Direct3DDevice9Wrapper :: QueryInterface (const IID & riid, kekosongan ** ppvObj) 

 { 

    HRESULT hres = Direct3DDevice9-> QueryInterface (riid, ppvObj); 

    if (hres == S_OK) 

       * PpvObj = ini; 

    lain 

       * PpvObj = NULL; 



    kembali hres; 

 } 

Ok sekarang kita harus dilakukan dengan file ini juga. Jadi simpan dan tutup. Berikutnya, kita perlu kembali dan mengedit beberapa beberapa file pertama untuk menangani perubahan dengan pembungkus baru. Jadi, pertama memungkinkan stdafx.h terbuka

Di bagian bawah stdafx.h Anda perlu menambahkan mencakup lain:

#include "ID3D9Wrapper_Device.h"

Kemudian Anda dapat menyimpan dan menutup file tersebut.

Berikutnya, di main.cpp, Anda perlu menambahkan termasuk juga:

#include "ID3D9Wrapper.h"

Yang satu ini harus pergi di bawah termasuk untuk stdafx.h (Order tidak peduli dalam beberapa kasus.) Kemudian simpan dan main.cpp dekat.

Selanjutnya kita perlu menambahkan file definisi untuk proyek untuk membuatnya sehingga Direct3DCreate9 dapat diakses oleh program menyebutnya dan bahwa tidak semua giberish ketika compiler link itu. Ini adalah langkah lain yang mungkin membutuhkan pekerjaan yang berbeda jika Anda tidak menggunakan VS2005. Saya tidak tahu apakah file DEF standar untuk kompiler lain, tetapi harus. Anda mungkin harus bekerja berbeda untuk mengkompilasi satu ke proyek Anda sekalipun.

Bagi orang-orang yang menggunakan VS2005, cukup lakukan hal berikut:
  • - Dalam solusi explorer, klik kanan pada 'Sumber Files' dan goto:
    - Tambahkan -> New Item
    - Pilih file 'Modul-definition' dari popup dan nama itu nama yang sama sebagai proyek. Dalam kasus saya, itu akan disebut, 'dxhook.def'

Sekarang jika file tidak membuka diri sudah, cukup klik ganda itu. File ini adalah file ekspor yang akan mengandung ekspor kita perlu untuk memungkinkan program lain akses langsung ke. Dalam kasus kami, satu-satunya untuk saat ini adalah Direct3DCreate9. Tapi bukannya hanya mengatakan, ekspor, kami ingin mengatur Direct3DCreate9 fungsi doyan kami. Jadi file kode DEF kami akan:

  PERPUSTAKAAN "dxhook" 

 EKSPOR 

    Direct3DCreate9 = Mine_Direct3DCreate9 


Sekarang, VS2005 harus menambahkan file DEF untuk proyek properti secara otomatis selama Anda menambahkan dengan cara saya menunjukkan di atas. Simpan dan tutup file yang sekarang.

Selamat! Hook / wrapper selesai! Mengambil nafas selama beberapa sebelum kita menulis peluncur cepat untuk buku ini.

Bagian 6. Injector The

Ok pertama dan terutama, mari mulai dengan, ini adalah injektor sangat dasar. Ada banyak cara untuk menulis ulang ini dan seperti itu, dan saya sangat menyarankan bahwa Anda lakukan. Ada libs sangat bagus Anda harus menggunakan seperti ForceLib, dan rewriter CRC32 untuk menjaga mata kail terdeteksi dan semacamnya. Ini hanyalah sebuah contoh kecil untuk menunjukkan kepada Anda bagaimana untuk menyuntikkan menggunakan Detours.

Detours dilengkapi dengan fungsi yang membungkus CreateProcessEx dan menyuntikkan modul yang Anda berikan, untuk Anda. Anda dapat melakukan ini sendiri juga dengan menggunakan CreateProcess / Ex kemudian berhenti proses, membuat thread baru, dan menyuntikkan kode Anda ke benang, kemudian memanggil DllMain diri dan semacamnya. Sekali lagi, theres banyak cara untuk melakukannya, sehingga Anda dapat memilih mana yang ingin Anda gunakan.

Untuk ini saya akan menggunakan aplikasi konsol sederhana. Tidak ada yang besar, 1 file, tidak banyak kode.

Untuk memulai, mari kita membuat proyek baru sehingga membuka contoh lain dari VS2005 dan goto: File -> New -> Project, pilih Win32 Project dari kotak, nama itu dxlauncher atau apa pun yang Anda inginkan. Sekali lagi tetap "Buat direktori untuk solusi" diperiksa karena membuat hal-hal baik dan rapi. Kemudian klik ok.

Ketika Aplikasi Wisaya muncul, klik pada link Pengaturan Aplikasi di sebelah kiri, kemudian pilih pengaturan berikut:

Aplikasi Jenis: Console Application
Pilihan lain: Proyek Kosong

Kemudian klik finish untuk membuka proyek baru kosong. Berikutnya, klik kanan di explorer solusi, dan goto: Tambah -> New Item, Pilih C ++ File (.cpp) dari kotak, masukkan nama, 'main.cpp' dan klik add.

Sekarang folder baru untuk proyek ini harus telah dibuat. Anda harus copy dan paste Detours folder ke direktori proyek ini juga menyebabkan kita membutuhkan mereka untuk proyek ini juga. Alih-alih benar-benar menjelaskan hal-hal untuk ini aku hanya gunna posting kode:
  #include <windows.h> 

 #include <stdio.h> 

 #include <tchar.h> 

 #include <atlbase.h> 

 #include <atlstr.h> 



 # Pragma comment (lib, "Pengalihan / detours.lib") 

 #include "Detours / detours.h" 



 int main () 

 { 

   CString strHookPath; 

   CString strINIPath; 



//////////////////////////////////// 

// Get The Current Paths 

//////////////////////////////////// 

   _wfullpath(strHookPath.GetBuffer(MAX_PATH), L"dxhook.dll", MAX_PATH); 

   strHookPath.ReleaseBuffer(); 

   _wfullpath(strINIPath.GetBuffer(MAX_PATH), L"settings.ini", MAX_PATH); 

   strINIPath.ReleaseBuffer(); 



//////////////////////////////////// 

// Check For Files 

//////////////////////////////////// 



   if( GetFileAttributes( strHookPath ) == 0xFFFFFFFF ) 

    { 

      // Hook Was Not Found 

       return 0; 

    } 



   if( GetFileAttributes( strINIPath ) == 0xFFFFFFFF ) 

    { 

      // INI File Was Not Found 

       return 0; 

    } 



//////////////////////////////////// 

// Read INI For Game Path 

//////////////////////////////////// 

   CString strGamePath; 

   GetPrivateProfileString( _T("settings"), _T("Path"), _T(""), strGamePath.GetBuffer(MAX_PATH), MAX_PATH, strINIPath ); 

   strGamePath.ReleaseBuffer(); 



//////////////////////////////////// 

// Create Game Path Variables 

//////////////////////////////////// 

   CString strGameExe = strGamePath + "\GAME_EXE_NAME.exe"; 



//////////////////////////////////// 

// Launch The Process 

//////////////////////////////////// 

   STARTUPINFO si = {sizeof(STARTUPINFO)}; 

   PROCESS_INFORMATION pi = {0}; 



   BOOL bResult = DetourCreateProcessWithDll( strGameExe, NULL, 0, 0, TRUE, 

                                    CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_CONSOLE, NULL, 

                                    strGamePath, &si, &pi, strHookPath, 0 ); 



   if( !bResult ) 

    { 

      // Process Failed To Launch 

       return 0; 

    } 



//////////////////////////////////// 

// Done! 

//////////////////////////////////// 

    return 0; 



 } 

Again, I do not recommend using this as your launcher. It is not secure and will be detectable. Along with that it wont work for some games that to late launching meaning 1 window launches another. You will need to make a process monitor style injector for that.

Now, compile both the launcher and the DLL and put them in the same folder. If you are using my launcher, create a new text file and rename it to 'settings.ini' and put inside of it:

[settings]
Path=C:/Path/To/Your/Game


Then launch the game and play.

Compiling
With Visual Studio 2005, you might run into issues with others using your programs after they are compiled. This is due to the runtime library thats set to default when compiled. This is, however, a simple adjustment. Open your project up in VS2005, and open the project properties by going to:
Project -> <Project Name> Properties

Once the project properties are open, expand the Configuration Properties tree item, then expand the C/C++ item. Then click on the 'Code Generation' item. On the right side, you should find an option labeled, 'Runtime Library', change this value to 'Multi-Threaded (/MT)' for your release build that will be distributed to others.

Catatan
- Detours 2.1 has removed functions that are used for this hook so please use the link provided instead of the real Detours download.

Author: Wiccaan

Translate by : Google

-=|Semoga bisa membantu|=-

[Comment Area]
Jangan lupa comment bro !!!

Subscribe to Posts | Subscribe to Comments

BiTDeMaCyber. Diberdayakan oleh Blogger.