프로그래밍언어/VB.NET

ReadWritingMemory

부산딸랑이 2014. 5. 17. 21:22

Imports System.Windows.Forms



Module ReadWritingMemory

    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcessId As Integer) As Integer


    Private Declare Function WriteProcessMemory1 Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer

    Private Declare Function WriteProcessMemory2 Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Single, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Single

    Private Declare Function WriteProcessMemory3 Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Long, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Long


    Private Declare Function ReadProcessMemory1 Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer

    Private Declare Function ReadProcessMemory2 Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Single, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Single

    Private Declare Function ReadProcessMemory3 Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Long, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Long


    Const PROCESS_ALL_ACCESS = &H1F0FF


    Public Function WriteDMAInteger(ByVal Process As String, ByVal Address As Integer, ByVal Offsets As Integer(), ByVal Value As Integer, ByVal Level As Integer, Optional ByVal nsize As Integer = 4) As Boolean

        Try

            Dim lvl As Integer = Address

            For i As Integer = 1 To Level

                lvl = ReadInteger(Process, lvl, nsize) + Offsets(i - 1)

            Next

            WriteInteger(Process, lvl, Value, nsize)

            Return True

        Catch ex As Exception

            Return False

        End Try

    End Function


    Public Function ReadDMAInteger(ByVal Process As String, ByVal Address As Integer, ByVal Offsets As Integer(), ByVal Level As Integer, Optional ByVal nsize As Integer = 4) As Integer

        Try

            Dim lvl As Integer = Address

            For i As Integer = 1 To Level

                lvl = ReadInteger(Process, lvl, nsize) + Offsets(i - 1)

            Next

            Dim vBuffer As Integer

            vBuffer = ReadInteger(Process, lvl, nsize)

            Return vBuffer

        Catch ex As Exception


        End Try

    End Function


    Public Function WriteDMAFloat(ByVal Process As String, ByVal Address As Integer, ByVal Offsets As Integer(), ByVal Value As Single, ByVal Level As Integer, Optional ByVal nsize As Integer = 4) As Boolean

        Try

            Dim lvl As Integer = Address

            For i As Integer = 1 To Level

                lvl = ReadFloat(Process, lvl, nsize) + Offsets(i - 1)

            Next

            WriteFloat(Process, lvl, Value, nsize)

            Return True

        Catch ex As Exception

            Return False

        End Try

    End Function


    Public Function ReadDMAFloat(ByVal Process As String, ByVal Address As Integer, ByVal Offsets As Integer(), ByVal Level As Integer, Optional ByVal nsize As Integer = 4) As Single

        Try

            Dim lvl As Integer = Address

            For i As Integer = 1 To Level

                lvl = ReadFloat(Process, lvl, nsize) + Offsets(i - 1)

            Next

            Dim vBuffer As Single

            vBuffer = ReadFloat(Process, lvl, nsize)

            Return vBuffer

        Catch ex As Exception


        End Try

    End Function


    Public Function WriteDMALong(ByVal Process As String, ByVal Address As Integer, ByVal Offsets As Integer(), ByVal Value As Long, ByVal Level As Integer, Optional ByVal nsize As Integer = 4) As Boolean

        Try

            Dim lvl As Integer = Address

            For i As Integer = 1 To Level

                lvl = ReadLong(Process, lvl, nsize) + Offsets(i - 1)

            Next

            WriteLong(Process, lvl, Value, nsize)

            Return True

        Catch ex As Exception

            Return False

        End Try

    End Function


    Public Function ReadDMALong(ByVal Process As String, ByVal Address As Integer, ByVal Offsets As Integer(), ByVal Level As Integer, Optional ByVal nsize As Integer = 4) As Long

        Try

            Dim lvl As Integer = Address

            For i As Integer = 1 To Level

                lvl = ReadLong(Process, lvl, nsize) + Offsets(i - 1)

            Next

            Dim vBuffer As Long

            vBuffer = ReadLong(Process, lvl, nsize)

            Return vBuffer

        Catch ex As Exception


        End Try

    End Function


    Public Sub WriteNOPs(ByVal ProcessName As String, ByVal Address As Long, ByVal NOPNum As Integer)

        Dim C As Integer

        Dim B As Integer

        If ProcessName.EndsWith(".exe") Then

            ProcessName = ProcessName.Replace(".exe", "")

        End If

        Dim MyP As Process() = Process.GetProcessesByName(ProcessName)

        If MyP.Length = 0 Then

            MessageBox.Show(ProcessName & " isn't open!")

            Exit Sub

        End If

        Dim hProcess As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, MyP(0).Id)

        If hProcess = IntPtr.Zero Then

            MessageBox.Show("Failed to open " & ProcessName & "!")

            Exit Sub

        End If


        B = 0

        For C = 1 To NOPNum

            Call WriteProcessMemory1(hProcess, Address + B, &H90, 1, 0&)

            B = B + 1

        Next C

    End Sub


    Public Sub WriteXBytes(ByVal ProcessName As String, ByVal Address As Long, ByVal Value As String)

        If ProcessName.EndsWith(".exe") Then

            ProcessName = ProcessName.Replace(".exe", "")

        End If

        Dim MyP As Process() = Process.GetProcessesByName(ProcessName)

        If MyP.Length = 0 Then

            MessageBox.Show(ProcessName & " isn't open!")

            Exit Sub

        End If

        Dim hProcess As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, MyP(0).Id)

        If hProcess = IntPtr.Zero Then

            MessageBox.Show("Failed to open " & ProcessName & "!")

            Exit Sub

        End If


        Dim C As Integer

        Dim B As Integer

        Dim D As Integer

        Dim V As Byte


        B = 0

        D = 1

        For C = 1 To Math.Round((Len(Value) / 2))

            V = Val("&H" & Mid$(Value, D, 2))

            Call WriteProcessMemory1(hProcess, Address + B, V, 1, 0&)

            B = B + 1

            D = D + 2

        Next C


    End Sub


    Public Sub WriteInteger(ByVal ProcessName As String, ByVal Address As Integer, ByVal Value As Integer, Optional ByVal nsize As Integer = 4)

        If ProcessName.EndsWith(".exe") Then

            ProcessName = ProcessName.Replace(".exe", "")

        End If

        Dim MyP As Process() = Process.GetProcessesByName(ProcessName)

        If MyP.Length = 0 Then

            MessageBox.Show(ProcessName & " isn't open!")

            Exit Sub

        End If

        Dim hProcess As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, MyP(0).Id)

        If hProcess = IntPtr.Zero Then

            MessageBox.Show("Failed to open " & ProcessName & "!")

            Exit Sub

        End If


        Dim hAddress, vBuffer As Integer

        hAddress = Address

        vBuffer = Value

        WriteProcessMemory1(hProcess, hAddress, CInt(vBuffer), nsize, 0)

    End Sub


    Public Sub WriteFloat(ByVal ProcessName As String, ByVal Address As Integer, ByVal Value As Single, Optional ByVal nsize As Integer = 4)

        If ProcessName.EndsWith(".exe") Then

            ProcessName = ProcessName.Replace(".exe", "")

        End If

        Dim MyP As Process() = Process.GetProcessesByName(ProcessName)

        If MyP.Length = 0 Then

            MessageBox.Show(ProcessName & " isn't open!")

            Exit Sub

        End If

        Dim hProcess As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, MyP(0).Id)

        If hProcess = IntPtr.Zero Then

            MessageBox.Show("Failed to open " & ProcessName & "!")

            Exit Sub

        End If


        Dim hAddress As Integer

        Dim vBuffer As Single


        hAddress = Address

        vBuffer = Value

        WriteProcessMemory2(hProcess, hAddress, vBuffer, nsize, 0)

    End Sub


    Public Sub WriteLong(ByVal ProcessName As String, ByVal Address As Integer, ByVal Value As Long, Optional ByVal nsize As Integer = 4)

        If ProcessName.EndsWith(".exe") Then

            ProcessName = ProcessName.Replace(".exe", "")

        End If

        Dim MyP As Process() = Process.GetProcessesByName(ProcessName)

        If MyP.Length = 0 Then

            MessageBox.Show(ProcessName & " isn't open!")

            Exit Sub

        End If

        Dim hProcess As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, MyP(0).Id)

        If hProcess = IntPtr.Zero Then

            MessageBox.Show("Failed to open " & ProcessName & "!")

            Exit Sub

        End If


        Dim hAddress As Integer

        Dim vBuffer As Long


        hAddress = Address

        vBuffer = Value

        WriteProcessMemory3(hProcess, hAddress, vBuffer, nsize, 0)

    End Sub


    Public Function ReadInteger(ByVal ProcessName As String, ByVal Address As Integer, Optional ByVal nsize As Integer = 4) As Integer

        If ProcessName.EndsWith(".exe") Then

            ProcessName = ProcessName.Replace(".exe", "")

        End If

        Dim MyP As Process() = Process.GetProcessesByName(ProcessName)

        If MyP.Length = 0 Then

            MessageBox.Show(ProcessName & " isn't open!")

            Exit Function

        End If

        Dim hProcess As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, MyP(0).Id)

        If hProcess = IntPtr.Zero Then

            MessageBox.Show("Failed to open " & ProcessName & "!")

            Exit Function

        End If


        Dim hAddress, vBuffer As Integer

        hAddress = Address

        ReadProcessMemory1(hProcess, hAddress, vBuffer, nsize, 0)

        Return vBuffer

    End Function


    Public Function ReadFloat(ByVal ProcessName As String, ByVal Address As Integer, Optional ByVal nsize As Integer = 4) As Single

        If ProcessName.EndsWith(".exe") Then

            ProcessName = ProcessName.Replace(".exe", "")

        End If

        Dim MyP As Process() = Process.GetProcessesByName(ProcessName)

        If MyP.Length = 0 Then

            MessageBox.Show(ProcessName & " isn't open!")

            Exit Function

        End If

        Dim hProcess As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, MyP(0).Id)

        If hProcess = IntPtr.Zero Then

            MessageBox.Show("Failed to open " & ProcessName & "!")

            Exit Function

        End If


        Dim hAddress As Integer

        Dim vBuffer As Single


        hAddress = Address

        ReadProcessMemory2(hProcess, hAddress, vBuffer, nsize, 0)

        Return vBuffer

    End Function


    Public Function ReadLong(ByVal ProcessName As String, ByVal Address As Integer, Optional ByVal nsize As Integer = 4) As Long

        If ProcessName.EndsWith(".exe") Then

            ProcessName = ProcessName.Replace(".exe", "")

        End If

        Dim MyP As Process() = Process.GetProcessesByName(ProcessName)

        If MyP.Length = 0 Then

            MessageBox.Show(ProcessName & " isn't open!")

            Exit Function

        End If

        Dim hProcess As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, MyP(0).Id)

        If hProcess = IntPtr.Zero Then

            MessageBox.Show("Failed to open " & ProcessName & "!")

            Exit Function

        End If


        Dim hAddress As Integer

        Dim vBuffer As Long


        hAddress = Address

        ReadProcessMemory3(hProcess, hAddress, vBuffer, nsize, 0)

        Return vBuffer

    End Function


End Module



'프로그래밍언어 > VB.NET' 카테고리의 다른 글

어제날짜구하기  (0) 2014.05.23
네이버 웹툰 다운  (0) 2014.05.19
좌표값 픽셀가져오기  (0) 2014.03.28
마우스좌표 가져오기  (0) 2014.03.28
문자열로 Sub 호출하기   (0) 2014.03.23