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