You are not logged in.
Pages: 1
получился вот такой код
#include <iostream> #include <windows.h> #include <string> #include <conio.h> #include <fstream> #include <iomanip> #include <stdio.h> #include <io.h> #include <fcntl.h> #include <mmsystem.h> #include <tlhelp32.h> #include <d3d9.h> #include <d3dx9.h> #include <d3dx9core.h> #pragma comment(lib,"d3d9.lib") #pragma comment(lib, "winmm") #pragma comment(lib, "D3dx9.lib") LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow) { // Register the window class. const wchar_t CLASS_NAME[] = L"Sample Window Class"; WNDCLASS wc = { }; wc.lpfnWndProc = WindowProc; wc.hInstance = hInstance; wc.lpszClassName = CLASS_NAME; RegisterClass(&wc); // Create the window. HWND hwnd = CreateWindowEx( 0, // Optional window styles. CLASS_NAME, // Window class L"Learn to Program Windows", // Window text WS_OVERLAPPEDWINDOW, // Window style // Size and position CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, // Parent window NULL, // Menu hInstance, // Instance handle NULL // Additional application data ); if (hwnd == NULL) { return 0; } ShowWindow(hwnd, nCmdShow); // Run the message loop. MSG msg = { }; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1)); EndPaint(hwnd, &ps); } return 0; } return DefWindowProc(hwnd, uMsg, wParam, lParam); } typedef HRESULT(__stdcall* PRESENT9)(IDirect3DDevice9* pDevice, const RECT*, const RECT*, HWND, void*); PRESENT9 g_D3D9_Present = 0; BYTE g_codeFragment_p9[5] = { 0, 0, 0, 0, 0 }; BYTE g_jmp_p9[5] = { 0, 0, 0, 0, 0 }; DWORD present9 = 0; bool indicator = 0; D3DRECT rec = { 10, 10, 160, 240 }; //menu size ID3DXFont* m_font = 0; RECT fontRect = { 10, 15, 120, 120 }; D3DCOLOR fontColor = 0; D3DCOLOR bkgColor = 0; void DrawIndicator(void* pDevice) { IDirect3DDevice9* dev = (IDirect3DDevice9*)pDevice; //get the actual D3D-device dev->BeginScene(); if (indicator) { HDC hdc = GetDC(0); RECT rect = { 20, 20, 200, 200 }; SetTextColor(hdc, RGB(255, 0, 0)); SetBkMode(hdc, TRANSPARENT); SetBkColor(hdc, RGB(0, 255, 0, 0)); DrawText(hdc, L"Directx Hook", -1, &rect, DT_LEFT); //PlaySound(L"H:\\Program Files (x86)\\GTA SA Revision2\\GAMES\\CNN Intro.wav", NULL, SND_ASYNC); //Sleep(1000); //CreateProcess(L"H:\\Program Files(x86)\\GTA SA Revision2\\GAMES\\CNN Intro.mp4", NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL); } dev->EndScene(); } //get the VMT and the hooking functions offsets void GetDevice9Methods() { IDirect3D9* d3d9_ptr; IDirect3DDevice9* pDevice; DWORD* vtablePtr; D3DPRESENT_PARAMETERS d3dpp; static HMODULE d3d9_handle = 0; HWND hWnd = CreateWindowExA(0, "STATIC", "dummy", 0, 0, 0, 0, 0, 0, 0, 0, 0); d3d9_handle = LoadLibraryA("d3d9.dll"); d3d9_ptr = Direct3DCreate9(D3D_SDK_VERSION); ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = 1; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; IDirect3D9_CreateDevice(d3d9_ptr, 0, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice); vtablePtr = (DWORD*)(*((DWORD*)pDevice)); present9 = vtablePtr[17] - (DWORD)d3d9_handle; IDirect3DDevice9_Release(pDevice); IDirect3D9_Release(d3d9_ptr); FreeLibrary(d3d9_handle); CloseHandle(hWnd); } HRESULT HookedPresent9(IDirect3DDevice9* pDevice, const RECT* src, const RECT* dest, HWND hWnd, void* unused) { BYTE* codeDest = (BYTE*)g_D3D9_Present; //restore the original Present() bytes codeDest[0] = g_codeFragment_p9[0]; *((DWORD*)(codeDest + 1)) = *((DWORD*)(g_codeFragment_p9 + 1)); DrawIndicator(pDevice); //draw the menu DWORD res = g_D3D9_Present(pDevice, src, dest, hWnd, unused); //place the hook back codeDest[0] = g_jmp_p9[0]; *((DWORD*)(codeDest + 1)) = *((DWORD*)(g_jmp_p9 + 1)); return res; } void HookDevice9Methods() { DWORD g_savedProtection_p9 = 0; HMODULE hD3D9 = GetModuleHandleA("d3d9.dll"); //get the actual d3d9.dll address g_D3D9_Present = (PRESENT9)((DWORD)hD3D9 + present9); //calculate the actual Present() address g_jmp_p9[0] = 0xE9; //fill the codecave array ("jmp hooked_present") DWORD addr = (DWORD)HookedPresent9 - (DWORD)g_D3D9_Present - 5; //calculate the hooked Present() address memcpy(g_jmp_p9 + 1, &addr, sizeof(DWORD)); //write it into the cave memcpy(g_codeFragment_p9, g_D3D9_Present, 5); //save the first 5 (jmp + addr) bytes of the original Present() VirtualProtect(g_D3D9_Present, 8, PAGE_EXECUTE_READWRITE, &g_savedProtection_p9); //make the code writable\executable memcpy(g_D3D9_Present, g_jmp_p9, 5); //write the codecave in the beginning of the original Present() } //hooking thread main function DWORD WINAPI TF(LPVOID) { GetDevice9Methods(); //get the VMT and the offsets HookDevice9Methods(); //actually, hook the needed functions return 0; } //hotkeys thread main function DWORD WINAPI KeyboardHook(LPVOID) { while (1) { if (GetAsyncKeyState(VK_F4)) { indicator = !indicator; Beep(500, 200); } Sleep(100); } return 0; } int _stdcall DllMain(HINSTANCE hInst, DWORD ul_reason_for_call, void* lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: //if we are attached into the game's process CreateThread(0, 0, TF, 0, 0, 0); //start D3D-hooking thread CreateThread(0, 0, KeyboardHook, 0, 0, 0); //start hotkeys thread } return 1; }
только он текст выводит, а надо что бы окно другой программы, кто может подсказать
пока получилось вот что
#include <iostream> #include <windows.h> #include <string> #include <conio.h> #include <fstream> #include <iomanip> #include <stdio.h> #include <io.h> #include <fcntl.h> #include <mmsystem.h> #include <tlhelp32.h> #pragma comment(lib, "winmm") using namespace std; DWORD WINAPI GtaSA_thread (LPVOID); DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return true; } DWORD WINAPI GtaSA_thread(LPVOID) { for (;; Sleep(1000)) { if (GetAsyncKeyState(VK_NUMPAD0) & 0x8000) { ShellExecute(NULL, "open", "c:\\GSR_1.5\\GAMES\\MK4\\MK4.exe", NULL, NULL, SW_SHOWNORMAL); } } }
но работает хреново
https://www.youtube.com/watch?v=3MMbbno18i8
Мне нужно вместо scm-скрипта "врезать" exe поток другой игры, т.е. я через базу адресов найду адрес который запускает scm-скрипт мини-игры и его нужно подменить, чтобы запускалось окно с другой игрой. Должно выглядеть вот так:
https://yadi.sk/i/UBkABtTy3TTemx
https://yadi.sk/i/Y6eYfvAF3TTepi
Кто может помочь сделать такую вещь: в GTA SA нужно вместо стандартной мини-игры внедрить любую другую (например "сапер", шахматы или типа того), есть вот такой код GTA SA main menu Stalker Theme
#include <iostream> #include <windows.h> #include <string> #include <conio.h> #include <fstream> #include <iomanip> #include <stdio.h> #include <io.h> #include <fcntl.h> #include <mmsystem.h> #pragma comment(lib, "winmm") using namespace std; DWORD WINAPI GtaSA_thread (LPVOID); DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return true; } DWORD WINAPI GtaSA_thread (LPVOID) { DWORD*var = (DWORD*)0xBA68A5; for (;;Sleep (100)) { if (*var != 0x00000022) { PlaySound("C:\\Games\\GTA2\\sound.WAV", NULL, SND_ASYNC); } } }
проигрывает музыку из папки C:\\Games\\GTA2 - нужно что-то вроде этого
я заменил на 01DC, т.е. rustler, ни к чему не привело
#include <iostream> #include <windows.h> #include <string> #include <conio.h> #include <fstream> #include <iomanip> #include <stdio.h> #include <io.h> #include <fcntl.h> #include <mmsystem.h> #include <tlhelp32.h> #pragma comment(lib, "winmm") using namespace std; DWORD WINAPI GtaSA_thread (LPVOID); DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return true; } void CreateConsole () { int hConHandle = 0; HANDLE lStdHandle = 0; FILE *fp = 0; AllocConsole (); SetConsoleTitle ("ID "); lStdHandle = GetStdHandle (STD_OUTPUT_HANDLE); hConHandle = _open_osfhandle (PtrToUlong (lStdHandle), _O_TEXT); fp = _fdopen (hConHandle, "w"); *stdout = *fp; setvbuf (stdout, NULL, _IONBF, 0); } int* ReadPointer (DWORD base, int offsets [], int level) { int* pointer = (int*)base; for (int i = 0; i < level; i++) { pointer = (int*)(*pointer + offsets[i]); printf("pointer = 0x%X / *pointer = 0x%X\n", pointer, *pointer); } return pointer; } void MEMwrite(void *adr, void *ptr, int size) { DWORD OldProtection; VirtualProtect(adr,size,PAGE_EXECUTE_READWRITE, &OldProtection); memcpy(adr,ptr,size); VirtualProtect(adr,size,OldProtection, &OldProtection); } DWORD WINAPI GtaSA_thread (LPVOID) { int* pointer0 = 0; DWORD base = 0xBA18FC; int offsets[1] = { 0x00 }; pointer0 = ReadPointer (base, offsets, 0); DWORD*var = (DWORD*)(0x6CC3B2); DWORD*var2 = (DWORD*)(0x6C9103); DWORD*var3 = (DWORD*)(0x406AF3); DWORD*var4 = (DWORD*)(0x6c9690); DWORD*var5 = (DWORD*)(0x6C9F1C); DWORD*var6 = (DWORD*)(0x6C8F10); DWORD*var7 = (DWORD*)(0x6d9c06); DWORD*var8 = (DWORD*)(0x6cd78a); CreateConsole (); for (;;Sleep (100)) { if (*pointer0) { int offsets[2] = { 0x384, 0x00 }; int* pointer = 0; pointer = ReadPointer (base, offsets, 2); if (*pointer == 188) { *var = 0x01DCF981; *var2 = 0x01DC227E; *var3 = 0x01DC227E; *var4 = 0x01DC227E; *var5 = 0x01DC3D66; *var6 = 0x01DCFF81; *var7 = 0x01DC227E; *var8 = 0x01DCB800; // MEMwrite ((void*)(adr), (void*)"1", 1); // MEMwrite ((void*)(adr2), (void*)"1", 1); }else { *var = 0x0208F981; *var2 = 0x0208227E; *var3 = 0x0208227E; *var4 = 0x0208227E; *var5 = 0x02083D66; *var6 = 0x0208FF81; *var7 = 0x0208227E; *var8 = 0x0208B800; } } } }
результат: у rustlera появляются все функции hydra, в.ч. работающие (поворачивающиеся) сопла, вертикальный взлет/посадка, но шасси не работают
подскажите, пожалуйста, есть функция вызова шасси у hydra, как ее применить к другим самолетам
text:006CC3B1 loc_6CC3B1: ; CODE XREF: CPlane__m110+BBF j .text:006CC3B1 0A4 cmp cx, 208h .text:006CC3B6 0A4 jnz loc_6CC461 .text:006CC3BC 0A4 test byte ptr [esi+36h], 0F8h .text:006CC3C0 0A4 jnz loc_6CC461 .text:006CC3C6 0A4 movzx edx, word ptr [esi+86Ch] .text:006CC3CD 0A4 movsx eax, word_8D33C8 .text:006CC3D4 0A4 cmp edx, eax .text:006CC3D6 0A4 jl loc_6CC461 .text:006CC3DC 0A4 mov eax, _modelPtrs+6A4h .text:006CC3E1 0A4 mov edi, [esi+388h] .text:006CC3E7 0A4 xor ecx, ecx .text:006CC3E9 0A4 mov cl, [eax+4Ah] .text:006CC3EC 0A4 push ecx ; id .text:006CC3ED 0A8 mov ecx, offset handlingData .text:006CC3F2 0A8 call CHandlingData__getFlyingHandling .text:006CC3F7 0A4 fld dword ptr [esi+994h] .text:006CC3FD 0A4 fcomp ds:dbl_859EF8 .text:006CC403 0A4 mov [esi+388h], eax .text:006CC409 0A4 fnstsw ax .text:006CC40B 0A4 test ah, 41h .text:006CC40E 0A4 jz short loc_6CC422 .text:006CC410 0A4 cmp byte ptr [esi+960h], 4 .text:006CC417 0A4 jnb short loc_6CC451 .text:006CC419 0A4 test dword ptr [esi+40h], 8000000h .text:006CC420 0A4 jnz short loc_6CC451 .text:006CC422 .text:006CC422 loc_6CC422: ; CODE XREF: CPlane__m110+C4E j
рабочий код (может кому пригодится), очень помогла функция вычисления указателей
int* ReadPointer (DWORD base, int offsets [], int level) { int* pointer = (int*)base; for (int i = 0; i < level; i++) { pointer = (int*)(*pointer + offsets[i]); printf("pointer = 0x%X / *pointer = 0x%X\n", pointer, *pointer); } return pointer; }
осталось только рабочее шасси доделать
#include <iostream> #include <windows.h> #include <string> #include <conio.h> #include <fstream> #include <iomanip> #include <stdio.h> #include <io.h> #include <fcntl.h> #include <mmsystem.h> #include <tlhelp32.h> #pragma comment(lib, "winmm") using namespace std; DWORD WINAPI GtaSA_thread (LPVOID); DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return true; } void CreateConsole () { int hConHandle = 0; HANDLE lStdHandle = 0; FILE *fp = 0; AllocConsole (); SetConsoleTitle ("ID "); lStdHandle = GetStdHandle (STD_OUTPUT_HANDLE); hConHandle = _open_osfhandle (PtrToUlong (lStdHandle), _O_TEXT); fp = _fdopen (hConHandle, "w"); *stdout = *fp; setvbuf (stdout, NULL, _IONBF, 0); } int* ReadPointer (DWORD base, int offsets [], int level) { int* pointer = (int*)base; for (int i = 0; i < level; i++) { pointer = (int*)(*pointer + offsets[i]); printf("pointer = 0x%X / *pointer = 0x%X\n", pointer, *pointer); } return pointer; } void MEMwrite(void *adr, void *ptr, int size) { DWORD OldProtection; VirtualProtect(adr,size,PAGE_EXECUTE_READWRITE, &OldProtection); memcpy(adr,ptr,size); VirtualProtect(adr,size,OldProtection, &OldProtection); } DWORD WINAPI GtaSA_thread (LPVOID) { int* pointer0 = 0; DWORD base = 0xBA18FC; int offsets[1] = { 0x00 }; pointer0 = ReadPointer (base, offsets, 0); DWORD*var = (DWORD*)(0x6CC3B2); DWORD*var2 = (DWORD*)(0x6C9103); DWORD*var3 = (DWORD*)(0x406AF3); DWORD*var4 = (DWORD*)(0x6c9690); DWORD*var5 = (DWORD*)(0x6C9F1C); DWORD*var6 = (DWORD*)(0x6C8F10); CreateConsole (); for (;;Sleep (100)) { if (*pointer0) { int offsets[2] = { 0x384, 0x00 }; int* pointer = 0; pointer = ReadPointer (base, offsets, 2); if (*pointer == 188) { *var = 0x01DCF981; *var2 = 0x01DC227E; *var3 = 0x01DC227E; *var4 = 0x01DC227E; *var5 = 0x01DC3D66; *var6 = 0x01DCFF81; // MEMwrite ((void*)(adr), (void*)"1", 1); // MEMwrite ((void*)(adr2), (void*)"1", 1); }else { *var = 0x0208F981; *var2 = 0x0208227E; *var3 = 0x0208227E; *var4 = 0x0208227E; *var5 = 0x02083D66; *var6 = 0x0208FF81; } } } }
работает так: когда сел в rustler в нем появляются функции hydra (вертикальный взлет/посадка), когда сел в hydra ее функции возвращаются
есть адрес в процессе 0xBA18FC, значение в этом адресе = 0xAAA6480(динамический) - это опять же адрес, значение в котором, является адресом = 0x00C35E5C в этом адресе записана переменная, которую мне нужно сравнить, использую конструкцию:
DWORD p1; DWORD p2; DWORD p3; ReadProcessMemory(GtaSA_thread, (LPCVOID)(0xBA18FC), &p1, sizeof(4), NULL);//прочитали адрес 0xBA18FC, записали значение в p1 p1 = p1 + 0x384; // прибавили смещение ReadProcessMemory(GtaSA_thread, (LPCVOID)p1, &p2, sizeof(4), NULL);//прочитали адрес р1(со смещением), записали значение в р2 ReadProcessMemory(GtaSA_thread, (LPCVOID)p2, &p3, sizeof(4), NULL);//прочитали адрес р2, записали значение в р3 if (p3 == 188) { // если равно, то ... }
но не получается почему-то
получилось вот что
#include <iostream> #include <windows.h> #include <string> #include <conio.h> #include <fstream> #include <iomanip> #include <stdio.h> #include <io.h> #include <fcntl.h> #include <mmsystem.h> #pragma comment(lib, "winmm") using namespace std; DWORD WINAPI GtaSA_thread (LPVOID); DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return true; } DWORD WINAPI GtaSA_thread (LPVOID) { DWORD*var = (DWORD*)(0x6CC3B2); DWORD*var2 = (DWORD*)(0x6C9103); DWORD*var3 = (DWORD*)(0x406AF3); DWORD*var4 = (DWORD*)(0x6c9690); DWORD*var5 = (DWORD*)(0x6C9F1C); DWORD*var6 = (DWORD*)(0x6C8F10); *var -= 0x2c0000; *var2 -= 0x2c0000; *var3 -= 0x2c0000; *var4 -= 0x2c0000; *var5 -= 0x2c0000; *var6 -= 0x2c0000; WriteProcessMemory(GtaSA_thread, (void*)var, var, sizeof(4), NULL); WriteProcessMemory(GtaSA_thread, (void*)var2, var2, sizeof(4), NULL); WriteProcessMemory(GtaSA_thread, (void*)var3, var3, sizeof(4), NULL); WriteProcessMemory(GtaSA_thread, (void*)var4, var4, sizeof(4), NULL); WriteProcessMemory(GtaSA_thread, (void*)var5, var5, sizeof(4), NULL); WriteProcessMemory(GtaSA_thread, (void*)var6, var6, sizeof(4), NULL); { for (;;Sleep (1000)) return 0; } }
вопрос с шасси пока не решен
https://www.youtube.com/watch?v=NRbNcmd-e9s
у меня получилось поменять в HEX редакторе + asi плагин вот что
https://youtu.be/K-7xkpbY_t0
пришлось в exe менять вот этот участок
https://yadi.sk/i/NZ7bFTcgk2kE7
как мне в запущенном процессе найти этот участок памяти, адрес
установил чистую gta, там значение адресов такое же
006CB4F3 90 E9 F8 B5 D3 FF 0F 85 EB 00 00 00 57 E8 6B 46
а не
006CB4F3 66 81 7E 22 08 02 0F 85 EB 00 00 00 57 E8 6B 46
как в базе IDA
я их специально красным подсветил, чтобы указать что это одно и тоже, тогда такой вопрос, как найти адрес, который управляет шасси id520
пытаюсь написать плагин, который делает из другого самолета гидру,
#include <iostream> #include <windows.h> #include <string> #include <conio.h> #include <fstream> #include <iomanip> #include <stdio.h> #include <io.h> #include <fcntl.h> #include <mmsystem.h> #pragma comment(lib, "winmm") using namespace std; DWORD WINAPI GtaSA_thread (LPVOID); DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return true; } void CreateConsole () { int hConHandle = 0; HANDLE lStdHandle = 0; FILE *fp = 0; AllocConsole (); SetConsoleTitle ("ID "); lStdHandle = GetStdHandle (STD_OUTPUT_HANDLE); hConHandle = _open_osfhandle (PtrToUlong (lStdHandle), _O_TEXT); fp = _fdopen (hConHandle, "w"); *stdout = *fp; setvbuf (stdout, NULL, _IONBF, 0); } DWORD WINAPI GtaSA_thread (LPVOID) { DWORD*var = (DWORD*)(0x6CC3B2); DWORD*var2 = (DWORD*)(0x6C9103); // DWORD*var3 = (DWORD*)(0x6C9103); *var -= 0x2c0000; *var2 -= 0x2c0000; WriteProcessMemory(GtaSA_thread, (void*)var, var, sizeof(4), NULL); WriteProcessMemory(GtaSA_thread, (void*)var2, var2, sizeof(4), NULL); { for (;;Sleep (1000)) return 0; } }
пока получилось только это
https://www.youtube.com/watch?v=cMMd7vroo9A
в каком направлении дальше двигаться?
помогите пожалуйста, вопрос такой
в IDA базе есть такой участок
.text:006CB4F3 .text:006CB4F3 loc_6CB4F3: ; CODE XREF: CPlane__processControlInput+611j .text:006CB4F3 ; CPlane__processControlInput+636j .text:006CB4F3 ; CPlane__processControlInput+64Dj .text:006CB4F3 ; CPlane__processControlInput+688j ... .text:006CB4F3 024 cmp word ptr [esi+22h], 208h
во вкладке HEX он выглядит так
006CB4F3 66 81 7E 22 08 02 0F 85 EB 00 00 00 57 E8 6B 46
меня интересует конкретно строка
.text:006CB4F3 024 cmp word ptr [esi+22h], 208h //здесь происходит сравнение с id 520 (гидра)
так вот, в exe (если открыть в hex-редакторе) или открыть запущенный процесс этот участок выглядит совсем не так
F7 FF FF 90 E9 F8 B5 D3 FF 0F 85 EB 00 00 00 57
наглядно
https://yadi.sk/d/1UKc1vIpjybDr
мне нужно выполнить сравнение не с 208h, а с другим числом, как его вычислить?
в cull.ipl - места установки зеркал, видеоэкранов на стадионах и т.д.
можно вообще вставить свой видеоэкран хоть куда-нибудь?
кто-нибудь может подсказать как сделать видеоэкран в gta
еще один вопрос.
{$VERSION 3.1.0027}
{$CLEO .cs}
//-------------MAIN---------------
thread "Electricgate"
:PCAR_8
wait 0
if
Player.Defined($PLAYER_CHAR)
jf @PCAR_8
Model.Load(969)
038B: load_requested_models
:PCAR_40
wait 0
if and
Model.Available(969)
jf @PCAR_40
1@ = Object.Create(969, 2461.81, -1663.53, 12.5156)
Object.Angle(1@) = 90.0
Model.Destroy(969)
:PCAR_121
wait 0
0471: actor $PLAYER_ACTOR near_object 1@ radius 10.0 10.0 flag 0
jf @PCAR_121
034E: move_object 1@ to 2461.81 -1684.93 12.5156 speed 0.0 10.0 0.0 flag 0
:PCAR_199
wait 0
while true
034E: move_object 1@ to 2461.81 -1663.53 12.5156 speed 0.0 10.0 0.0 flag 0
jump @PCAR_121
0A93: end_custom_thread
ворота, если к ним подходишь, начинают скакать туда-сюда, а надо, что бы плавно перемещались, можно такое сделать?
спасибо за помощь
{$CLEO .cs}
//-------------MAIN---------------
thread "PCAR"
:PCAR_8
wait 0
if
Player.Defined($PLAYER_CHAR)
jf @PCAR_8
Model.Load(#RHINO)
Model.Load(#FBI)
038B: load_requested_models
:PCAR_40
wait 0
if and
Model.Available(#RHINO)
Model.Available(#FBI)
jf @PCAR_40
1@ = Car.Create(#RHINO, 2457.36, -1658.67, 13.3)
Car.Angle(1@) = 180.0
0129: 2@ = create_actor_pedtype 6 model #FBI in_car 1@ driverseat
Model.Destroy(#RHINO)
Model.Destroy(#FBI)
:PCAR_121
wait 0
00FE: actor $PLAYER_ACTOR sphere 0 in_sphere 2457.36 -1658.67 13.3 radius 35.0 35.0 35.0
jf @PCAR_121
Car.SetSpeedInstantly(1@, 5.0)
02C2: car 1@ drive_to 2457.36 -1678.67 13.3
:PCAR_199
wait 0
80FE: not actor $PLAYER_ACTOR sphere 0 in_sphere 2457.36 -1658.67 13.3 radius 35.0 35.0 35.0
jf @PCAR_199
Car.SetSpeedInstantly(1@, 5.0)
02C2: car 1@ drive_to 2457.36 -1658.67 13.3
jump @PCAR_121
0A93: end_custom_thread
все работает
искал скрипт который ставит автоматические ворота на гров стрит под мостом, потом решил сделать заграждение из транспорта
получилось:
{$VERSION 3.1.0027} {$CLEO .cs} //-------------MAIN--------------- thread "PCAR" :PCAR_8 wait 0 if Player.Defined($PLAYER_CHAR) jf @PCAR_8 Model.Load(#RHINO) Model.Load(#FBI) 038B: load_requested_models :PCAR_40 wait 0 if Model.Available(#RHINO) Model.Available(#FBI) jf @PCAR_40 1@ = Car.Create(#RHINO, 2457.36, -1658.67, 13.3) 0129: 2@ = create_actor_pedtype 6 model #FBI in_car 1@ driverseat :PCAR_101 wait 0 00FE: actor $PLAYER_ACTOR sphere 0 in_sphere 2457.36 -1658.67 13.3 radius 35.0 35.0 35.0 jf @PCAR_101 Car.SetSpeedInstantly(1@, 5.0) 02C2: car 1@ drive_to 2457.36 -1668.67 13.3 Model.Destroy(#RHINO) Model.Destroy(#FBI) end_thread
в общем работает, танк отъезжает, освобождая дорогу, но нужно, что бы он парковался обратно и еще: пытался его развернуть на 180
1@ = Car.Create(#RHINO, 2457.36, -1658.67, 13.3)
Car.Angle(1@) = 180.0 - не получается. помогите доделать это мой первый скрипт
Pages: 1