You are not logged in.
Pages: 1
Есть руководство по созданию плагинов в Delphi? А то я посмотрел исходники Mp3Player и не понял: как вызывать игровые функции типа create_panel_with_title и т.п.


Offline
Offline
А указатель как получить? Чем надо исследовать память?


Offline
А указатель как получить? Чем надо исследовать память?
Ну память исследовать надо IDA-й pro...
Offline
Или Olly Dbg, код анализирует почти так же, но + в том, что это отличнейший отладчик. Хотя ИДу тоже юзаю, иногда.
Offline
"Использование отладчика результат плохого проэктирования" Так сказал listener, даже Alien не пользовался отладчиком и посмотрите какие он CLEO пишет!
Last edited by VintProg_Pro (24-07-2011 10:12)
Offline
Заинтересовался написанием asi плагинов для gta. Промотрел форум и ещё другие форумы. Очень мало инфы про это. Нашёл вот статью DK22Pac, как создать простой плагин для GTASA.
Нашёл соответствующие адреса для VC. Сделал, как описано в статье. Но Microsoft Visual C++ на
CPatch::SetInt(0x94ADC8, CPatch::GetInt(0x94ADC8) + 50);
весело сообщает, что:
GetInt: не является членом "CPatch"
Ладно, переделал таким образом:
#include <Windows.h>
#include <CPatch.h>
void OurFunc();
// Игровой таймер
#define gTimer (*(unsigned int *)0x974B2C)
// Обьявляем глобальную переменную для записи времени
unsigned int gLastTimeKeyPressed;
DWORD * pMoney = (DWORD*)0x94ADC8;
BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved)
{
if(reason == DLL_PROCESS_ATTACH)
{
CPatch::RedirectCall(0x4A5D91, OurFunc);
// Обнуляем таймер
gLastTimeKeyPressed = 0;
}
return TRUE;
}
void OurFunc()
{
// Проверяем нажатие клавиши "M" и таймер (если прошлa 1 секундa после последнего нажатия клавиши)
if(HIBYTE(GetKeyState(0x4D)) == 0xFF && gTimer - gLastTimeKeyPressed > 1000)
{
//Добавляем денег игроку
*pMoney += 1000;
// Устанавливаем новое время последнего нажатия клавиши
gLastTimeKeyPressed = gTimer;
}
// Вызываем стандартную функцию игры (0x5522B0)
((void (__cdecl *)())0x5522B0)();
}Работает, как задумано.
Подскажите пожалуйста ответы на следующие вопросы:
1) Как проверить версию игры, чтобы для соответствующей версии использовать свои адреса?
2) Как в asi плагине организовать такую конструкцию из клео скрипта
if
05EE: key_pressed 50
then
repeat
wait 0
until 85EE: not key_pressed 50
end
Offline
1) Например вот так можно: https://github.com/ThirteenAG/Y-Axis_Se … llmain.cpp
2) do...while
Offline
Спасибо, но, что-то я не разберусь. Вот нашёл я адреса и для версии 1.1 для примера, описанного выше:
VC1.0 таймер 0x974B2C InitPerFrame 0x4A5D91 вызывается в 0x5522B0 pMoney 0x94ADC8 VC1.1 таймер 0x974B34 InitPerFrame 0x4A5DB1 вызывается в 0x5522D0 pMoney 0x94ADD0
Какой будет код с учётом этого, т.е. для двух версий игры?
Со вторым пунктом тоже непонятки.
Просьба показать пример кода и на второй пункт.
Offline
Ну лучше наверно завести переменную и заполнять её после проверки на версию exe. К примеру как тут - https://github.com/ThirteenAG/Widescree … in.cpp#L37
Пример do...while в принципе в гугле найти не сложно, но если очень хочется: https://github.com/ThirteenAG/Widescree … in.cpp#L12
Offline
мда... видно рано мне ещё за плагины браться,
С++ только начал изучать...
в общем не получается, сделал вот так:
#include <Windows.h>
#include <CPatch.h>
#define gGameVersion (*(unsigned int *)0x601048)
#define GTA_VC_1_0 0x53FF1B8B
#define GTA_VC_STEAM 0xF04F883
#define GTA_VC_1_1 0x783EE8
int gVersion;
unsigned int gLastTimeKeyPressed;
unsigned int gTimer;
int gInitPerFrame;
int gFunc;
DWORD pMoney;
void Thread()
{
switch(gGameVersion)
{
case GTA_VC_1_0:
gVersion = 0;
break;
case GTA_VC_1_1:
gVersion = 1;
break;
case GTA_VC_STEAM:
gVersion = 2;
break;
}
/*if (gVersion == 0)
{
unsigned int* gTimer = (unsigned int *)0x974B2C;
int* gInitPerFrame = (int *)0x4A5D91;
int* gFunc = (int *)0x5522B0;
DWORD* pMoney = (DWORD*)0x94ADC8;
}
else if (gVersion == 1)
{
unsigned int* gTimer = (unsigned int *)0x974B34;
int* gInitPerFrame = (int *)0x4A5DB1;
int* gFunc = (int *)0x5522D0;
DWORD* pMoney = (DWORD*)0x94ADD0;
}*/
}
void OurFunc();
BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved)
{
if(reason == DLL_PROCESS_ATTACH)
{
Thread();
CPatch::RedirectCall(gInitPerFrame, OurFunc);
// Обнуляем таймер
gLastTimeKeyPressed = 0;
}
return TRUE;
}
void OurFunc()
{
// Проверяем нажатие клавиши "M" и таймер (если прошлa 1 секундa после последнего нажатия клавиши)
if(HIBYTE(GetKeyState(0x4D)) == 0xFF && gTimer - gLastTimeKeyPressed > 1000)
{
if (gVersion == 0)
{
unsigned int* gTimer = (unsigned int *)0x974B2C;
int* gInitPerFrame = (int *)0x4A5D91;
int* gFunc = (int *)0x5522B0;
DWORD* pMoney = (DWORD*)0x94ADC8;
}
else if (gVersion == 1)
{
unsigned int* gTimer = (unsigned int *)0x974B34;
int* gInitPerFrame = (int *)0x4A5DB1;
int* gFunc = (int *)0x5522D0;
DWORD* pMoney = (DWORD*)0x94ADD0;
}
//Добавляем денег игроку
pMoney += 1000;
// Устанавливаем новое время последнего нажатия клавиши
gLastTimeKeyPressed = gTimer;
}
// Вызываем стандартную функцию игры (0x5522B0)
((void (__cdecl *)())gFunc)();
}ни один из вариантов не работает
Кому не сложно поправьте код до рабочего и правильного варианта.
Offline
#include <Windows.h>
#include <CPatch.h>
#define gGameVersion (*(unsigned int *)0x601048)
#define GTA_VC_1_0 0x53FF1B8B
#define GTA_VC_STEAM 0xF04F883
#define GTA_VC_1_1 0x783EE8
int gVersion;
unsigned int gLastTimeKeyPressed;
unsigned int *gTimer;
int gInitPerFrame;
int gFunc;
DWORD *pMoney;
void Thread()
{
switch(gGameVersion)
{
case GTA_VC_1_0:
gVersion = 0;
break;
case GTA_VC_1_1:
gVersion = 1;
break;
case GTA_VC_STEAM:
gVersion = 2;
break;
}
if (gVersion == 0)
{
gTimer = (unsigned int *)0x974B2C;
gInitPerFrame = (int)0x4A5D91;
gFunc = (int)0x5522B0;
pMoney = (DWORD*)0x94ADC8;
}
else if (gVersion == 1)
{
gTimer = (unsigned int *)0x974B34;
gInitPerFrame = (int)0x4A5DB1;
gFunc = (int)0x5522D0;
pMoney = (DWORD*)0x94ADD0;
}
}
void OurFunc();
BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved)
{
if(reason == DLL_PROCESS_ATTACH)
{
Thread();
CPatch::RedirectCall(gInitPerFrame, OurFunc);
// Обнуляем таймер
gLastTimeKeyPressed = 0;
}
return TRUE;
}
void OurFunc()
{
// Проверяем нажатие клавиши "M" и таймер (если прошлa 1 секундa после последнего нажатия клавиши)
if(HIBYTE(GetKeyState(0x4D)) == 0xFF && *gTimer - gLastTimeKeyPressed > 1000)
{
//Добавляем денег игроку
*pMoney += 1000;
// Устанавливаем новое время последнего нажатия клавиши
gLastTimeKeyPressed = *gTimer;
}
// Вызываем стандартную функцию игры (0x5522B0)
((void (__cdecl *)())gFunc)();
}
Offline
Ага так робит.
Спасибо!
Ещё вопрос: при компиляции asi плагинов в настройках, какие параметры лучше выставить, чтобы:
1) плагин работал у тех пользователей, где не установлен Microsoft Visual C++
2) размер плагина при этом был бы минимальным
а то у меня получился размер этого плагина 33 КВ
для сравнения посмотрел размер CLEO.asi = 16 КВ
VC_SCMLOG.asi = 11,5 КВ
Offline
1) Свойства конфигурации -> С/С++ -> Создание кода -> Библиотека времени выполнения: Многопоточная (/MT).
Теперь dll не будет требовать MSVCRXX.dll и MSVCPXX.dll
2)После #include добавь:
#pragma comment(linker, "/ENTRY:DllMain")
Свойства конфигурации -> Компоновщик -> Файл манифеста -> Создавать Манифест: Нет (/MANIFEST:NO).
Пара полезных ссылок:
http://www.wasm.ru/forum/viewtopic.php?id=22942
http://forum.antichat.ru/thread270620.html
Last edited by ZeroTen (16-12-2014 18:23)
Offline
Спасибо! Теперь получил размер плагина 4 КВ, совсем другое дело.
Offline
Pages: 1