Взломщик игровых значений
Такая вот простенькая программка :) . Моей целью было воссоздать сам принцип редактирования значений в играх, а всякие навороты типа (заморозки значений, поиск разных типов данных, поиск по больше\меньше и пр.) - по сути дело наживное. Оно не представляет сложности, но однозначно раздует код... А потом кому будет нужен толстенный код для исследования? Также я не запаривался с интерфейсом, все сделал как можно проще.
Программа умеет редактировать только целые значения. Кто захочет протестировать на игре "Сапер", сразу скажу, что это вряд ли получится, потому что для времени там используются дробные числа.
Возможны ошибки, поскольку сильно не тестировал, так проверил на паре игр.
Платформа: Windows
Автор: Станислав Будинов
Ниже предлагаю коротенький ролик, как использовать программу.
#INCLUDE "window9.bi" Dim Shared As HWND hwnd, hwndD Dim Shared As HANDLE Snapshot,Snapshot2 Dim Shared As Integer PIDS(200), iCounter, PidsProg, baseaddr Dim Shared As Byte Ptr buf Redim Shared As Integer arrayAddress(0) Dim Shared Process As PROCESSENTRY32 Process.dwSize=SizeOf(PROCESSENTRY32) Dim Shared As MODULEENTRY32 MODULEENTRY MODULEENTRY.dwSize = Sizeof(MODULEENTRY32) Dim Shared MBI As MEMORY_BASIC_INFORMATION Function windowproc(hwnd As HWND,msg As UINT,wParam As WPARAM,lParam As LPARAM) As Integer Select Case msg Case WM_COMMAND If Hiword(wparam) = LBN_DBLCLK Then If lparam = GadgetID(6) Then PidsProg = PIDS(GetItemListBox(6)) HideWindow(hwndD,1) Endif Endif End Select Return 0 End Function Function FirstFind( value As Integer) As Integer Dim dwLength As UINT Dim Address As Byte Ptr Dim As Integer readbuf Dim As Integer TypeValue icounter = 0 TypeValue = Val(GetComboBoxText( 4, GetItemComboBox(4))) dwLength = Sizeof(MEMORY_BASIC_INFORMATION) Redim As Integer arrayAddress(10000) Dim As handle hproc = OpenProcess(PROCESS_QUERY_INFORMATION, 0, PidsProg) If hproc<>0 Then While VirtualQueryEx(hproc,Address, @MBI, dwLength) <> 0 If (MBI.Protect = PAGE_READWRITE) And ((MBI.State = MEM_COMMIT) Or (MBI.State = MEM_RESERVE)) Then Dim As handle hproc1 = OpenProcess(process_all_access, 0, PidsProg) If hproc1<>0 Then buf = Allocate(MBI.RegionSize+1) ReadProcessMemory(hproc1,Cast(Any Ptr,MBI.BaseAddress),buf,MBI.RegionSize,@readbuf) For i As Integer = 0 To Cint(MBI.RegionSize) Step TypeValue If buf[i] = value Then If icounter=UBound(arrayAddress)-1 Then Redim Preserve As Integer arrayAddress(icounter+1000) Endif arrayAddress(icounter) = Cint(MBI.BaseAddress + i) If icounter < 11 Then AddListBoxItem(5,Hex(MBI.BaseAddress + i,8)) Endif icounter+=1 Endif Next Deallocate(buf) CloseHandle(hproc1) Endif Endif Address+=MBI.RegionSize Wend CloseHandle(hproc) Endif Return icounter End Function Function NextFind(value As Integer) As Integer Dim As Integer buf,readbuf Dim As Integer TypeValue, iCounter2 = icounter icounter = 0 TypeValue = Val(GetComboBoxText( 4, GetItemComboBox(4))) Dim As handle hproc1 = OpenProcess(process_all_access, 0, PidsProg) If hproc1<>0 Then For i As Integer = 0 To icounter2-1 ReadProcessMemory(hproc1,Cast(Any Ptr,arrayAddress(i)),@buf,TypeValue,@readbuf) If buf = value Then arrayAddress(icounter) = arrayAddress(i) If icounter < 11 Then AddListBoxItem(5,Hex(arrayAddress(i),8)) Endif icounter+=1 Endif Next CloseHandle(hproc1) Endif Return icounter End Function Function Writevalue() As Integer baseaddr = Val("&h" &(GetListBoxText(5,GetItemListBox(5)))) If baseaddr<>0 Then Dim As Integer buf = Val(GetGadgetText(8)),readbuf Dim As Integer TypeValue = Val(GetComboBoxText( 4, GetItemComboBox(4))) Dim As handle hproc1 = OpenProcess(process_all_access, 0, PidsProg) If hproc1<>0 Then Function = WriteProcessMemory(hproc1,Cast(Any Ptr,baseaddr),@buf,TypeValue,@readbuf) CloseHandle(hproc1) Endif Else MessBox("Сообщение","Выделите нужный для изменения адрес!") Endif End Function hwnd=OpenWindow("Редактор",10,10,288,205) CenterWindow(hwnd) ButtonGadget(1,10,10,100,20,"Ат.программа") ButtonGadget(2,10,40,100,20,"1 поиск") ButtonGadget(3,10,70,100,20,"Сл. поиск") ComboBoxGadget(4,10,100,102,80) AddComboBoxItem(4,"1 байт",-1) AddComboBoxItem(4,"2 байта",-1) AddComboBoxItem(4,"4 байта",-1) SetItemComboBox(4,2) ListBoxGadget(5,170,10,93,149, ,WS_EX_CLIENTEDGE) ButtonGadget(7,10,135,30,20,"Изм") StringGadget(8,50,135,115,20,"",ES_RIGHT ) hwndD=OpenWindow("Выбрать процесс",10,10,355,400) CenterWindow(hwndD) ListBoxGadget(6,10,10,320,350,,WS_EX_CLIENTEDGE) SendMessage(GadgetID(6), LB_SETHORIZONTALEXTENT, 1000, 0) HideWindow(hwndD,1) SetWindowCallback(Cint(@windowproc())) Do Var event=WaitEvent Select Case event Case EventClose If EventHwnd = hwnd Then End Elseif EventHwnd = hwndD Then HideWindow(hwndD,1) Endif Case eventgadget Select Case EventNumber Case 1 HideWindow(hwndD,0) iCounter=0 Erase(PIDS) ResetAllListBox(6) Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) If Snapshot Then Dim As Integer ProcessFound = Process32First(Snapshot, @Process) While ProcessFound Snapshot2 = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,Process.th32ProcessID) If Snapshot2 Then If Module32First(Snapshot2, @MODULEENTRY) Then PIDS(iCounter) = MODULEENTRY.th32ProcessID iCounter+=1 AddListBoxItem(6,MODULEENTRY.szExePath) Endif CloseHandle(Snapshot2) Endif ProcessFound = Process32Next(Snapshot, @Process) Wend CloseHandle(Snapshot) Endif Case 2 ResetAllListBox(5) DisableWindow(hwnd,1) MessBox("Поиск закончен","Найдено адресов: " & Str(FirstFind(Val(GetGadgetText(8))))_ & Chr(13) &Chr(10)& "Отображаются только 10 первых найденных адресов!") DisableWindow(hwnd,0) SetForegroundWindow(hwnd) Case 3 ResetAllListBox(5) DisableWindow(hwnd,1) MessBox("Поиск закончен","Найдено адресов: " & Str(NextFind(Val(GetGadgetText(8))))_ & Chr(13) &Chr(10)& "Отображаются только 10 первых найденных адресов!") DisableWindow(hwnd,0) SetForegroundWindow(hwnd) Case 7 Writevalue() End Select End Select Loop