Взломщик игровых значений

hackgame.png

Такая вот простенькая программка :) . Моей целью было воссоздать сам принцип редактирования значений в играх, а всякие навороты типа (заморозки значений, поиск разных типов данных, поиск по больше\меньше и пр.) - по сути дело наживное. Оно не представляет сложности, но однозначно раздует код... А потом кому будет нужен толстенный код для исследования? Также я не запаривался с интерфейсом, все сделал как можно проще.

Программа умеет редактировать только целые значения. Кто захочет протестировать на игре "Сапер", сразу скажу, что это вряд ли получится, потому что для времени там используются дробные числа.

Возможны ошибки, поскольку сильно не тестировал, так проверил на паре игр.

Платформа: 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