|
dxd9 - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок |
26.04.2012, 16:48
|
#1
|
|
|
|
Разведчик
|
Регистрация: 07.04.2010
Сообщений: 9
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
dxd9
Пытаюсь разобраться с dx хуками
Код:
#include "stdafx.h"
#include <windows.h>
#include <cstdio>
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
/*Color's*/
#define GREEN D3DCOLOR_ARGB(255, 000, 255, 000)//Trans(250=SOLID,0=INVISIBLE),Red,Green,Blue
#define BLUE D3DCOLOR_ARGB(255, 000, 000, 255)
LPD3DXFONT m_font = NULL;
boolean DrawMessage(LPD3DXFONT font, unsigned int x, unsigned int y, int alpha, unsigned char r, unsigned char g, unsigned char b, LPCSTR Message)
{ // Create a colour for the text
D3DCOLOR fontColor = D3DCOLOR_ARGB(alpha, r, g, b);
RECT rct; //Font
rct.left=x;
rct.right=150;
rct.top=y;
rct.bottom=rct.top+150;
font->DrawTextA(NULL, Message, -1, &rct, 0, fontColor);
return true;
}
//======ВОТ ТУТ
void stuff(LPDIRECT3DDEVICE9 pDevice, D3DCOLOR Color) //Crosshair function by: Hans211
{
// D3DCOLOR rectColor = D3DCOLOR_XRGB(255,0,255); //No point in using alpha because clear & alpha dont work!
// D3DRECT BarRect = { 10, 10, 40, 40 };
// pDevice->Clear(1,&BarRect, D3DCLEAR_TARGET | D3DCLEAR_TARGET ,rectColor,0,0);
DrawMessage(m_font,40,40,255,255,0,255, "Привет, Мир!");
}
//======ВОТ ТУТ
void *DetourFunc(BYTE *src, const BYTE *dst, const int len) // Old detour from GD Forums.
{
BYTE *jmp = (BYTE*)malloc(len+5);
DWORD dwback;
VirtualProtect(src, len, PAGE_READWRITE, &dwback);
memcpy(jmp, src, len); jmp += len;
jmp[0] = 0xE9;
*(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;
src[0] = 0xE9;
*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
VirtualProtect(src, len, dwback, &dwback);
return (jmp-len);
}
typedef HRESULT(__stdcall* EndScene_)(LPDIRECT3DDEVICE9);
EndScene_ pEndScene;//our define
typedef HRESULT (WINAPI* Reset_) (LPDIRECT3DDEVICE9 pDevice, D3DPRESENT_PARAMETERS* pPresentationParameters);
Reset_ pReset;
/*Hooked Endscene*/
HRESULT __stdcall EndScene(LPDIRECT3DDEVICE9 pDevice)
{//Calling our Hook.EndScene makes us able to draw.
D3DXCreateFont( pDevice, 17, 0, FW_BOLD, 0, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT("Arial"), &m_font );
stuff(pDevice,BLUE); //Drawing
return pEndScene(pDevice);
}
/*Tools for Hooking by Gordon`*/
bool bCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)//by Gordon`
{
for(;*szMask;++szMask,++pData,++bMask)
if(*szMask=='x' && *pData!=*bMask) return 0;
return (*szMask) == NULL;
}
DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)//by Gordon`
{
for(DWORD i=0; i<dwLen; i++)
if (bCompare((BYTE*)(dwAddress+i),bMask,szMask)) return (DWORD)(dwAddress+i);
return 0;
}
DWORD GetAddressPtr(int index) //by Gordon`
{
DWORD* VTableStart = 0;
DWORD dwDevicePointer = FindPattern((DWORD)GetModuleHandle(L"d3d9.dll"), 0x1280000, (PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx");
memcpy(&VTableStart, (void*)(dwDevicePointer+2), 4);
return VTableStart[index];
}
DWORD FindDevice(DWORD Len)//by Gordon`
{
DWORD dwObjBase = 0;
dwObjBase = (DWORD)LoadLibrary(L"D3D9.DLL");
while (dwObjBase++ < dwObjBase + Len)
{
if ( (*(WORD*)(dwObjBase + 0x00)) == 0x06C7
&& (*(WORD*)(dwObjBase + 0x06)) == 0x8689
&& (*(WORD*)(dwObjBase + 0x0C)) == 0x8689
) { dwObjBase += 2; break; }
}
return( dwObjBase );
}
/*The Hook*/
void Hook()
{
PDWORD VTable;
*(DWORD*)&VTable = *(DWORD*)FindDevice(0x128000);
pEndScene = ( EndScene_ )DetourFunc((PBYTE) VTable[42],(PBYTE)EndScene, 5);//Hooking our endscene
Sleep( 100 );
}
/*DLL Main*/
int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH:
CreateThread(0, 0, (LPTHREAD_START_ROUTINE) Hook, 0, 0, 0);//Starting our Hook
break;
}
return true;
}
Так вот, если эту дллку заинжектить в пв, через некоторое время пв начинает безбожно тормозить и в итоге вылетает. Если же вместо DrawMessage просто рисовать квадрат (закомментированный код), все происходит нормально. Подскажите, пожалуйста, в чем проблема.
|
|
|
29.04.2012, 00:03
|
#2
|
|
|
|
Разведчик
|
Регистрация: 07.10.2010
Сообщений: 21
Популярность: 90
Сказал(а) спасибо: 14
Поблагодарили 15 раз(а) в 14 сообщениях
|
Re: dxd9
попробуй создавать шрифт только один раз при вызове текста ...
не знаю как С, но смысл такой
...
if font=0 then begin [создать шрифт] [font:=1] end;
[вывод текста]
...
при сбросе устройств опять выставляй в 0
________________
если я не ошибаюсь, а могу и ошибаться ...
too many actual parameters
|
|
|
30.04.2012, 19:55
|
#3
|
|
|
|
Разведчик
|
Регистрация: 07.04.2010
Сообщений: 9
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: dxd9
Да, действительно, не освобождалась память. Спасибо, большое )
Последний раз редактировалось xoraxax; 01.05.2012 в 01:25.
Причина: Добавлено сообщение
|
|
|
01.05.2012, 03:07
|
#4
|
|
|
|
Пехотинец
|
Регистрация: 21.03.2012
Сообщений: 83
Популярность: 1178
Сказал(а) спасибо: 18
Поблагодарили 101 раз(а) в 53 сообщениях
|
Re: dxd9
xoraxax, Почитай вот это Рисуем поверх графики в окне Perfect World. Интересны отзывы о данном способе, судя по всему никто ещё не попробовал.
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
|
|
|
01.05.2012, 09:54
|
#5
|
|
|
|
Разведчик
|
Регистрация: 07.10.2010
Сообщений: 21
Популярность: 90
Сказал(а) спасибо: 14
Поблагодарили 15 раз(а) в 14 сообщениях
|
Re: dxd9
|
Цитата: |
|
|
|
|
|
|
через OpenGL-нет через DirectХ-да
________________
если я не ошибаюсь, а могу и ошибаться ...
too many actual parameters
|
|
|
01.05.2012, 22:22
|
#6
|
|
|
|
Разведчик
|
Регистрация: 07.04.2010
Сообщений: 9
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: dxd9
Пока меня вполне устраивает этот вариант. Кажется, он отлично работает. Хотя у вашего варианта, пожалуй, есть свои плюсы =)
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 01:55.
|
|