メモリ書き換え関数(MemoryEdit) |
---|
MemoryEdit ソースプログラム1
Function MemoryEdit(ByVal ExeName As String, ByVal Code As String) As Long 01> Dim StartAddress As Long '書き換えを開始するアドレスを格納 02> Dim EndAddress As Long '書き換えを終了するアドレスを格納 03> Dim Data As String '書き込むデータを一時的に格納 04> Dim PutValue As Byte '書き込えるデータを格納 05> Dim i As Long, j As Long 'カウンタ 06> Dim ProcessHandle As Long '書き換えるプロセスのハンドルを格納 07> Dim Count As Long '書き換えに成功したかどうかの判断 08> Dim rc As Long 'ハンドルのクローズ関数の戻り値を格納 09> '改造コードの種類を判定&処理 10> If InStr(1, Code, ">") Then 11> StartAddress = CLng("&h" & Left(Code, InStr(1, Code, ">") - 1)) 12> EndAddress = CLng("&h" & Mid(Code, InStr(1, Code, ">") + 1, _ InStr(1, Code, "-") - InStr(1, Code, ">") - 1)) 13> Else 14> StartAddress = CLng("&h" & Left(Code, InStr(1, Code, "-") - 1)) 15> EndAddress = StartAddress 16> End If 17> Data = Mid(Code, InStr(1, Code, "-") + 1) 18> '改造コードの1文字目が「S,M,L,$」のいずれかであれば、対応する16進数の文字列に変換する 19> Select Case UCase(Left(Data, 1)) 20> Case "S", "M", "L", "$" 21> Data = DecOrAsciiToHex(Right(Data, Len(Data) - 1), Left(Data, 1)) 22> Case Else 23> End Select 24> If Len(Data) Mod 2 <> 0 Then 25> Data = "0" & Data 26> End If |
MemoryEdit ソースプログラム2
'プロセスのハンドルを取得 ProcessHandle = GetProcessHandle(ExeName) If ProcessHandle = 0 Then MemoryEdit = 1 Exit Function End If 'メモリ書き換え For i = 0 To EndAddress - StartAddress Step Len(Data) / 2 For j = 0 To Len(Data) / 2 - 1 PutValue = CLng("&h" & Mid(Data, j * 2 + 1, 2)) WriteProcessMemory ProcessHandle, StartAddress + i + j, PutValue, 1, Count '書き換えに失敗していないか判断 If Count <> 1 Then rc = CloseHandle(ProcessHandle) MemoryEdit = 2 Exit Function End If Next j Next i 'ハンドルのクローズ rc = CloseHandle(ProcessHandle) '書き換えに成功した時 MemoryEdit = 0 End Function |
プロセスのID・ハンドルを取得する |
---|
GetProcessHandle ソースプログラム
Private Function GetProcessHandle(ByVal ExeName As String) As Long Dim ProcessID As Long 'まずはプロセスIDを取得する ProcessID = GetProcessID(ExeName) If ProcessID = 0 Then Exit Function End If '読み取り、書き込み、操作権限 GetProcessHandle = OpenProcess(&H38, 0, ProcessID) End Function |
GetProcessID ソースプログラム
Private Function GetProcessID(ByVal ExeName As String) As Long Dim hSnap As Long Dim rc As Long Dim PE As tagPROCESSENTRY32 Dim PExeName As String hSnap = CreateToolhelp32Snapshot(2, 0) PE.dwSize = 296 rc = Process32First(hSnap, PE) Do While rc PExeName = StrConv(PE.szExeFile, vbUnicode) PExeName = CutNullChar(Mid(PExeName, InStrRev(PExeName, "\") + 1)) If UCase(PExeName) = UCase(ExeName) Then GetProcessID = PE.th32ProcessID rc = CloseHandle(hSnap) Exit Function End If rc = Process32Next(hSnap, PE) Loop rc = CloseHandle(hSnap) GetProcessID = 0 End Function |