- 963
- 410
Разве аси лоадер не делает это за меня?Поставь в потоке проверку на загрузку игры
Не совсем понял, где использовать, ставить флаги на адреса памяти, в которые я записываю значения?VirtualProtect
Разве аси лоадер не делает это за меня?Поставь в потоке проверку на загрузку игры
Не совсем понял, где использовать, ставить флаги на адреса памяти, в которые я записываю значения?VirtualProtect
да, PAGE_READWRITE_EXECUTEРазве аси лоадер не делает это за меня?
Не совсем понял, где использовать, ставить флаги на адреса памяти, в которые я записываю значения?
произведение думаю сам выполнишь, ничего там сложного, а с сортировкой тебе поможетЗаданный одномерный массив А (10). Найти произведение a [1] * 2 * a [2] * ... * 10 * a [10]. Заданный массив отсортировать методом выбора по возрастанию.
А сможете написать ? :)произведение думаю сам выполнишь, ничего там сложного, а с сортировкой тебе поможет
Быстрая сортировка — Википедия(https://ru.wikipedia.org/wiki/%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0)
пример: qsort | Программирование на C и C++(http://www.c-cpp.ru/content/qsort)
int comp(const int *i, const int *j)
{
return *i - *j;
}
void foo()
{
int var[10]{ 0, 15, 23, 21, 32, 2, 3, 4, 5, 3};
qsort(var, _countof(var), sizeof(int), (int(*) (const void *, const void *)) comp);
for (byte i = NULL; i < _countof(var); i++)
{
printf("orig %d / result %d", var[i], var[i] * 2);
var[i] *= 2;
}
}
немогу добавить имгуи в соб, в сф всё норм
Вроде поставил VirtualProtect, но все равно при переименовании в .asi при входе в игру крашит.Почему при инжекте dll в уже запущенную игру, все работает, а при переименовании в asi, после запуска игры сразу краш.
Код:#include <windows.h> #include <process.h> #include "main.h" bool pStatus = false; unsigned int CurrentCharPointer = *(unsigned int*)0xB6F5F0; void __cdecl func(void *pArg) { *reinterpret_cast<DWORD*>(0x004B35A0) = 0x560CEC83; *reinterpret_cast<WORD*>(0x004B35A4) = 0xF18B; while (true) { Sleep(50); if (GetAsyncKeyState(0x47)) { pStatus = !pStatus; if (pStatus == true) { AddMessageJumpQ("~g~[ON]", 500, NULL, false); // 500 - ms } else { AddMessageJumpQ("~r~[OFF]", 500, NULL, false); // 500 - ms } } if (pStatus == true) { *reinterpret_cast<BYTE*>(0x96916D) = 1; // bullet *reinterpret_cast<BYTE*>(0xB7CEE6) = 1; // fire *(unsigned char*)(CurrentCharPointer + 66) = 0xCC; // all } else { *reinterpret_cast<BYTE*>(0x96916D) = 0; // bullet *reinterpret_cast<BYTE*>(0xB7CEE6) = 0; // fire *(unsigned char*)(CurrentCharPointer + 66) = 0; // all } } } BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ PVOID lpvReserved) { if (fdwReason == DLL_PROCESS_ATTACH) { _beginthread(func, NULL, nullptr); } return TRUE; }
Код:#define FUNC_CMessages__AddMessageJumpQ 0x69F1E0 void AddMessageJumpQ(PCHAR text, UINT time, USHORT flag, bool bPreviousBrief) // Функция показа сообщения на экране. { ((void(__cdecl *)(PCHAR, UINT, USHORT, bool))FUNC_CMessages__AddMessageJumpQ)(text, time, flag, bPreviousBrief); }
#include <windows.h>
#include <process.h>
#include "main.h"
bool pStatus = false;
unsigned int CurrentCharPointer = *(unsigned int*)0xB6F5F0;
void __cdecl func(void *pArg)
{
DWORD oldProtect;
VirtualProtect((void*)(0x004B35A0), 4, PAGE_EXECUTE_READWRITE, &oldProtect);
*reinterpret_cast<DWORD*>(0x004B35A0) = 0x560CEC83;
VirtualProtect((void*)(0x004B35A0), 4, oldProtect, &oldProtect);
VirtualProtect((void*)(0x004B35A4), 2, PAGE_EXECUTE_READWRITE, &oldProtect);
*reinterpret_cast<WORD*>(0x004B35A4) = 0xF18B;
VirtualProtect((void*)(0x004B35A4), 2, oldProtect, &oldProtect);
while (true)
{
Sleep(50);
if (GetAsyncKeyState(0x47))
{
pStatus = !pStatus;
if (pStatus == true)
{
AddMessageJumpQ("~g~[ON]", 500, NULL, false); // 500 - ms
}
else
{
AddMessageJumpQ("~r~[OFF]", 500, NULL, false); // 500 - ms
}
}
if (pStatus == true)
{
VirtualProtect((void*)(0x96916D), 1, PAGE_EXECUTE_READWRITE, &oldProtect);
*reinterpret_cast<BYTE*>(0x96916D) = 1; // bullet
VirtualProtect((void*)(0x96916D), 1, oldProtect, &oldProtect);
VirtualProtect((void*)(0xB7CEE6), 1, PAGE_EXECUTE_READWRITE, &oldProtect);
*reinterpret_cast<BYTE*>(0xB7CEE6) = 1; // fire
VirtualProtect((void*)(0xB7CEE6), 1, oldProtect, &oldProtect);
VirtualProtect((void*)(CurrentCharPointer + 66), 1, PAGE_EXECUTE_READWRITE, &oldProtect);
*(unsigned char*)(CurrentCharPointer + 66) = 0xCC; // all
VirtualProtect((void*)(CurrentCharPointer + 66), 1, oldProtect, &oldProtect);
} else
{
VirtualProtect((void*)(0x96916D), 1, PAGE_EXECUTE_READWRITE, &oldProtect);
*reinterpret_cast<BYTE*>(0x96916D) = 0; // bullet
VirtualProtect((void*)(0x96916D), 1, oldProtect, &oldProtect);
VirtualProtect((void*)(0xB7CEE6), 1, PAGE_EXECUTE_READWRITE, &oldProtect);
*reinterpret_cast<BYTE*>(0xB7CEE6) = 0; // fire
VirtualProtect((void*)(0xB7CEE6), 1, oldProtect, &oldProtect);
VirtualProtect((void*)(CurrentCharPointer + 66), 1, PAGE_EXECUTE_READWRITE, &oldProtect);
*(unsigned char*)(CurrentCharPointer + 66) = 0; // all
VirtualProtect((void*)(CurrentCharPointer + 66), 1, oldProtect, &oldProtect);
}
}
}
BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ PVOID lpvReserved)
{
if (fdwReason == DLL_PROCESS_ATTACH)
{
_beginthread(func, NULL, nullptr);
}
return TRUE;
}
Я тебе ответил уже, в начале потока дождись пока игра загрузится.Вроде поставил VirtualProtect, но все равно при переименовании в .asi при входе в игру крашит.
Код:#include <windows.h> #include <process.h> #include "main.h" bool pStatus = false; unsigned int CurrentCharPointer = *(unsigned int*)0xB6F5F0; void __cdecl func(void *pArg) { DWORD oldProtect; VirtualProtect((void*)(0x004B35A0), 4, PAGE_EXECUTE_READWRITE, &oldProtect); *reinterpret_cast<DWORD*>(0x004B35A0) = 0x560CEC83; VirtualProtect((void*)(0x004B35A0), 4, oldProtect, &oldProtect); VirtualProtect((void*)(0x004B35A4), 2, PAGE_EXECUTE_READWRITE, &oldProtect); *reinterpret_cast<WORD*>(0x004B35A4) = 0xF18B; VirtualProtect((void*)(0x004B35A4), 2, oldProtect, &oldProtect); while (true) { Sleep(50); if (GetAsyncKeyState(0x47)) { pStatus = !pStatus; if (pStatus == true) { AddMessageJumpQ("~g~[ON]", 500, NULL, false); // 500 - ms } else { AddMessageJumpQ("~r~[OFF]", 500, NULL, false); // 500 - ms } } if (pStatus == true) { VirtualProtect((void*)(0x96916D), 1, PAGE_EXECUTE_READWRITE, &oldProtect); *reinterpret_cast<BYTE*>(0x96916D) = 1; // bullet VirtualProtect((void*)(0x96916D), 1, oldProtect, &oldProtect); VirtualProtect((void*)(0xB7CEE6), 1, PAGE_EXECUTE_READWRITE, &oldProtect); *reinterpret_cast<BYTE*>(0xB7CEE6) = 1; // fire VirtualProtect((void*)(0xB7CEE6), 1, oldProtect, &oldProtect); VirtualProtect((void*)(CurrentCharPointer + 66), 1, PAGE_EXECUTE_READWRITE, &oldProtect); *(unsigned char*)(CurrentCharPointer + 66) = 0xCC; // all VirtualProtect((void*)(CurrentCharPointer + 66), 1, oldProtect, &oldProtect); } else { VirtualProtect((void*)(0x96916D), 1, PAGE_EXECUTE_READWRITE, &oldProtect); *reinterpret_cast<BYTE*>(0x96916D) = 0; // bullet VirtualProtect((void*)(0x96916D), 1, oldProtect, &oldProtect); VirtualProtect((void*)(0xB7CEE6), 1, PAGE_EXECUTE_READWRITE, &oldProtect); *reinterpret_cast<BYTE*>(0xB7CEE6) = 0; // fire VirtualProtect((void*)(0xB7CEE6), 1, oldProtect, &oldProtect); VirtualProtect((void*)(CurrentCharPointer + 66), 1, PAGE_EXECUTE_READWRITE, &oldProtect); *(unsigned char*)(CurrentCharPointer + 66) = 0; // all VirtualProtect((void*)(CurrentCharPointer + 66), 1, oldProtect, &oldProtect); } } } BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ PVOID lpvReserved) { if (fdwReason == DLL_PROCESS_ATTACH) { _beginthread(func, NULL, nullptr); } return TRUE; }
В собейте используются предкомпилированные заголовки, изучи их и сможешь правильно подключить imgui.немогу добавить имгуи в соб, в сф всё норм
Клео снимает защиту со всей гтаЯ тебе ответил уже, в начале потока дождись пока игра загрузится.
И протект тут не играет роли, у тебя бы тогда не работало при инжекте в запущенную игру
В собейте используются предкомпилированные заголовки, изучи их и сможешь правильно подключить imgui.
на скрине ошибка связана с этим
Screenshot(http://prntscr.com/ljg94e)заголовки я знаю как подключаются
а ты сам пробовал подключить имгуи к собейту?
я не совсем понимаю в чем дело
как в собейте показать диалог
void showSampDialog(int send, int dialogID, int typedialog, char *caption, char *text, char *button1, char *button2)
{
uint32_t func = g_dwSAMP_Addr + SAMP_FUNC_DIALOG_SHOW;
uint32_t data = g_dwSAMP_Addr + SAMP_DIALOG_INFO_OFFSET;
__asm mov eax, dword ptr[data]
__asm mov ecx, dword ptr[eax]
__asm push send
__asm push button2
__asm push button1
__asm push text
__asm push caption
__asm push typedialog
__asm push dialogID
__asm call func
return;
}
тогда вообще всё по пизде идёт, какая то проблема большая.