IzerodayI

[Counter Strike Source] и поддержка DirectX

53 сообщения в этой теме

Примерная реализация DirectX в dll такая :

Скрытый текст

void DrawIndicator(void* self) 
{
	IDirect3DDevice9* dev = (IDirect3DDevice9*)self;
	dev->BeginScene();
	GiveMeLineStandart(dev);
	D3DXMATRIX v_m;
	dev->GetTransform(D3DTS_VIEW, &v_m);
	D3DVIEWPORT9 viewport;
	dev->GetViewport(&viewport);
  	FindClientModule();
	float coordX, coordY, coordZ;
	float pOut[3];
	if (indicator)
	{
		for (int i = 1; i < 15; i++)//Да с 1, знаю кто я...(на то есть причина)
		{
			coordX = *reinterpret_cast<float*>(client_dll + player_onl_coordX*i);
			coordY = *reinterpret_cast<float*>(client_dll + player_onl_coordY*i);
			coordZ = *reinterpret_cast<float*>(client_dll + player_onl_coordZ*i);
			if ((coordX == 0) || (coordY == 0)) { continue; }
			World_To_Screen(coordX, coordY, coordZ, &v_m, viewport, pOut);
			m_font1->DrawTextA(0, "just do it", -1, &fontRect1, 0, D3DCOLOR_ARGB(255, 255, 255, 0));
			treangle[0] = D3DXVECTOR2(pOut[0], pOut[1]);
			treangle[1] = D3DXVECTOR2(pOut[0], pOut[1] + 50);
			line->Begin();
			line->Draw(treangle, 2, cool);
			line->End();
		}
     else
     {
        
     }

 

функция GiveMeLineStandart :

Скрытый текст

void GiveMeLineStandart(IDirect3DDevice9* device)
{
	D3DXCreateLine(device, &line);
	line->SetWidth(4.0f);
	line->SetPattern(0xffffffff);
	line->SetAntialias(FALSE);
}

 

функция FindClientModule :

Скрытый текст

void FindClientModule()
{
	MODULEINFO moduleinfo = { 0 };
	HMODULE hModule = GetModuleHandle("client.dll");
	GetModuleInformation(GetCurrentProcess(), hModule, &moduleinfo, sizeof(MODULEINFO));
	client_dll = (DWORD)moduleinfo.lpBaseOfDll;
}

 

функция World_To_Screen :

Скрытый текст

int World_To_Screen(float coordX, float coordY, float coordZ, D3DXMATRIX* vm, D3DVIEWPORT9 viewport, float* pOut)
{
	float w = 0.0f;
	pOut[0] = vm[0][0] * coordX + vm[0][1] * coordY + vm[0][2] * coordZ + vm[0][3];
	pOut[1] = vm[1][0] * coordX + vm[1][1] * coordY + vm[1][2] * coordZ + vm[1][3];
	w = vm[3][0] * coordX + vm[3][1] * coordY + vm[3][2] * coordZ + vm[3][3];
	if (w < 0.01f) { return 0; }
	float intw = 1.0f / w;
	pOut[0] *= intw;
	pOut[1] *= intw;
	int weight = (int)(viewport.Width);//(rect.right - rect.left);
	int height = (int)(viewport.Height);//(rect.bottom - rect.top);
	float x = weight / 2;
	float y = height / 2;
	x += 0.5*pOut[0] + weight + 0.5;
	y -= 0.5*pOut[1] + height + 0.5;
	pOut[0] = x;//+ rect.left
	pOut[1] = y;//+ rect.top
	return 1;
}

 

и глобальные переменные :

DWORD client_dll;
D3DXVECTOR2 treangle[2];//для рисования
D3DCOLOR cool = D3DCOLOR_ARGB(255, 255, 0, 0);
ID3DXLine *line;
const DWORD player_onl_coordX = 0x1a0;
const DWORD player_onl_coordY = 0x1a4;
const DWORD player_onl_coordZ = 0x1a8;

кто знает , примерно, почему ничего не рисует на экране ?

я предполагаю , что не так нашел видовую матрицу или vievport,  ещё возможно ошибка в функции World_To_Screen:

 

D3DXMATRIX v_m;
dev->GetTransform(D3DTS_VIEW, &v_m);//view_matrix - видовая матрица
D3DVIEWPORT9 viewport;
dev->GetViewport(&viewport);//для размеров окна игры 

// еще возможно  client_dll не так нашел (где-нибудь ошибка)

MODULEINFO moduleinfo = { 0 };
HMODULE hModule = GetModuleHandle("client.dll");
GetModuleInformation(GetCurrentProcess(), hModule, &moduleinfo, sizeof(MODULEINFO));
client_dll = (DWORD)moduleinfo.lpBaseOfDll;

dll находится в процессе игры(inject through СЕ)!

 

 

 

Благодарю за ответы 

// Заголовок поправил, на первый раз без предупреждений. Garik66 1. Нарушения правила оформления заголовка тем. Общие правила форума Пункт 1.3 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
40 минут назад, IzerodayI сказал:

dev->GetTransform(D3DTS_VIEW, &v_m);

По моему это так не работает. Лучше сам найди матрицу.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, uhx сказал:

По моему это так не работает. Лучше сам найди матрицу.

Если я начал , то попробую уже через DirectX доделать, самому интересно как сделать правильно через DirectX

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
15 минут назад, IzerodayI сказал:

Если я начал , то попробую уже через DirectX доделать, самому интересно как сделать правильно через DirectX

Флаг тебе в руки. Но ты хотя бы пробовал посмотреть, что тебе выдает GetTransform на выходе?

 

Я не знаю почему так, не знаток DX и все такое, но через GetTransform ты не достанешь видовую матрицу. Ты думаешь всем по приколу мучаться и искать оффсет на нее? Типа все так делают, потому что оффсеты - это круто?)

Через DX можно разве что при помощи GetVertexShaderConstantF достать ее, но там тоже придется танцы с бубном устраивать, поэтому какого-то уникального решения нет, потому что в каждой игре по своему хранится эта видовая матрица, и приходится постоянно ее выискивать.

Тут пару дней назад до тебя тоже человечек один писал по этому поводу, тык. Дело в том, что GetTransform возвращает единичные матрицы, а при помощи них ты никаких преобразований не получишь)

Сам только что проверил в CS:GO. Слева GetTransform, справа - через оффсет. 

Wg2OtEF.png

Изменено пользователем uhx
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, uhx сказал:

какого-то уникального решения нет,

А я думал , что этот способ универсален...

Что-то типа правил или этикета всех программистов пишущих игры делать матрицу в одном месте для удобства(другим людям):D 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, uhx сказал:

через оффсет

не подскажешь как получить (оптимально)оффсет матрицы через dll,

если через exe Кенг делал так :

Скрытый текст

 read_bytes((PCVOID)(client_dll_base+v_matrix_offset), 64, &view_matrix);

//и 

int read_bytes(PCVOID addr, int num, void* buf) 
{ 
     SIZE_T sz = 0; 
    int r = ReadProcessMemory(hProcess, addr, buf, num, &sz); 
     if (r == 0 || sz == 0) { 
        printf("RPM error, %08Xn", GetLastError()); 
          return 0; 
     } 
     return 1; 
} 

 

один из параметров это 64 байта , и это разумное решение , но в dll я не могу пользоваться ReadProcessMemory , 

и как это лучше провернуть. Должна же быть какая-нибудь функция вытаскивающая сразу все оффсеты (через dll)?

 

Просто я координаты тоже криво нахожу:

Скрытый текст

const DWORD player_onl_coordX = 0x1a0;
const DWORD player_onl_coordY = 0x1a4;
const DWORD player_onl_coordZ = 0x1a8;

	float coordX, coordY, coordZ;	

		coordX = *reinterpret_cast<float*>(client_dll + player_onl_coordX*i);
		coordY = *reinterpret_cast<float*>(client_dll + player_onl_coordY*i);
		coordZ = *reinterpret_cast<float*>(client_dll + player_onl_coordZ*i);

 

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, IzerodayI сказал:

но в dll я не могу пользоваться ReadProcessMemory

Структура из 16 значений

Изменено пользователем partoftheworlD
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, uhx сказал:

что тебе выдает GetTransform на выходе?

как ты её отобразил через DirectX?

мне интересно все проверить самому(насчет других параметров).

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, partoftheworlD сказал:

Структура из 16 или 64 значений.

из 16 значений по 4 байта каждое.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, elvis66666 сказал:

из 16 значений по 4 байта каждое.

А ну да, не понятно почему я по байту посчитал:D

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я тоже долго мучался с поиском матрицы через D3D, но uhx подсказал, что лучше ручками найти. Так и сделал, теперь всё нормально рисуется. Спасибо ему ;) Так что лучше не трать время на это, и найди сам матрицу.

Изменено пользователем Wanderer
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
15 часов назад, IzerodayI сказал:

но в dll я не могу пользоваться ReadProcessMemory

А зачем тебе ReadProcessMemory, если ты уже в процессе игры?

15 часов назад, IzerodayI сказал:

как ты её отобразил через DirectX?

 

Взял и нарисовал все значения на экране.

ID3DXFont->DrawTextA

 

16 часов назад, IzerodayI сказал:

типа правил или этикета всех программистов пишущих игры делать матрицу в одном месте для удобства(другим людям)

Нет, такого нет. У разработчиков и так все исходники перед лицом, они легко могут эту матрицу использовать, какая им разница в каком месте она лежит.

 

Вообще, тебе следовало бы взяться сначала за что-то одно: либо асм (реверс), либо цпп.

Судя по твоим вопросам ты ни там ни там не разбираешься, а учить тебя всем особенностям C++ вряд ли кто то захочет - информации и без того полно.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, uhx сказал:

Взял и нарисовал все значения на экране

как ты туда массив значений поместил ? там же второе значение у функции LPCTSTR

6 минут назад, uhx сказал:

либо асм (реверс), либо цпп.

можно по подробней?

 

PS

я примерно нашел видовую матрицу , но там только 15 значений изменяющихся от -0.99 до 0.99 (в ксс в34 максимум 89 градусов наклон)

почему 15 , потому что одно из них Double 

screen:

[img= https://cloud.mail.ru/public/GNMC/3jz33yKb5]

 

 

это и есть видовая матрица или я нашел не то?

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот как она примерно выглядит:

GCziOaK.png

Она должна при прямых углах отображать твои координаты камеры, поэтому X и Y позиции должны быть видны в ней.

Как у меня: -113 в матрице и 113 в позиции. 159.38 в матрице и -159.38 ну и тд...

+ у нее статический адрес, но она слетает обычно после апдейтов. Практически всегда.

То, что у тебя - это похоже не то. Я сейчас буквально за 15 минут нашел матрицу + сигнатуру под нее, а то надоело что после апдейтов слетает.

Могу какой-то гайдец запилить, хотя об этом уже столько сказано было... шо капец

Изменено пользователем uhx
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
19 минут назад, uhx сказал:

Могу какой-то гайдец запилить,

Я был бы не против =)

 

PS ты её просто отсеивал от -1 до 1 и получил матрицу сразу в таком виде? то есть не так (допустим пример)[img=https://cloud.mail.ru/public/HACe/x1EjsZNnd] в буквенных непонятных значений, а сразу в цифрах?

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, IzerodayI сказал:

то есть не так (допустим пример)

Хоспадее, да переключи ты режим отображения на Float. ПКМ -> Display Type -> Float. Ну или просто Ctrl + 9

4 минуты назад, IzerodayI сказал:

ты её просто отсеивал от -1 до 1 и получил матрицу сразу в таком виде

Да, просто экраном вверх-вниз. Я искал значение между 0.9 и 1.1. Потом поднимал экран вверх и искал между -1.1 и -0.9, потому что там угол ~89 максимальный, проще промежуток искать, все равно левак отпадет на 2-3 скане.

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
26 минут назад, uhx сказал:

Да, просто экраном вверх-вниз. Я искал значение между 0.9 и 1.1. Потом поднимал экран вверх и искал между -1.1 и -0.9, потому что там угол ~89 максимальный, проще промежуток искать, все равно левак отпадет на 2-3 скане.

это она? , тут 16 уже =)

[img= https://cloud.mail.ru/public/3SiE/Yso3dmHte]

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, IzerodayI сказал:

это она? , тут 16 уже =)

[img= https://cloud.mail.ru/public/3SiE/Yso3dmHte]

Просто посмотри какой-нибудь урок по нахождению видовой матрицы. Почему ты по столбцу только считаешь их? Как бы значения идут слева-направо.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах


setang 89 49


Ищешь 0.75 

 

Отсеиваешь

 

setang 0.0 5.0


Ищешь 0.08

 

Последний адрес в пространстве engine.dll будет видовой матрицей.

Чтобы каждое обновление не искать, делаешь сигнатуру и по ней получаешь адрес матрицы.

Изменено пользователем partoftheworlD
1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, partoftheworlD сказал:

пространстве engine.dll

Но ведь он в client.dll :o

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, uhx сказал:

Но ведь он в client.dll :o

Нет, это в csgo в client.dll, в css, l4d2, portal (на счет portal 2 не уверен) и прочих играх со старым движком в engine.dll

Изменено пользователем partoftheworlD
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, partoftheworlD сказал:

в css,

+

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

похоже ? [img= https://cloud.mail.ru/public/JnVD/a8BZyZdDw ]

 

её находил пока , без совета partoftheworlD

Изменено пользователем IzerodayI
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
21 минуту назад, uhx сказал:

Как бы значения идут слева-направо.

похоже ? [img= https://cloud.mail.ru/public/JnVD/a8BZyZdDw ]

 

её находил пока , без совета partoftheworlD

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 минуты назад, IzerodayI сказал:

скорее всего она и есть, но смысла спрашивать "похоже" нет, когда будешь использовать узнаешь то нашел или нет.
если сделал так, как я написал выше, то значит нашел именно её.

 

и статейка
http://www.codinglabs.net/article_world_view_projection_matrix.aspx

Изменено пользователем partoftheworlD
1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас