如何获取 程序加载后的内存起始地址

Posted 余磊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取 程序加载后的内存起始地址相关的知识,希望对你有一定的参考价值。

Public Function GetProcessPath(ByVal dwProcessId As Long) As String 
    Dim ntStatus As Long 
    Dim objBasic As PROCESS_BASIC_INFORMATION 
    Dim objFlink As Long 
    Dim objPEB As Long, objLdr As Long 
    Dim objBaseAddress As Long 
    Dim bytName(260 * 2 - 1) As Byte 
    Dim strModuleName As String, objName As Long 
    Dim objCid As CLIENT_ID 
    Dim objOa As OBJECT_ATTRIBUTES 
    Dim i As Integer 
    Dim hProcess As Long 
    objOa.Length = Len(objOa) 
    objCid.UniqueProcess = dwProcessId 
    ntStatus = NtOpenProcess(hProcess, PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, objOa, objCid) 
    If hProcess = 0 Then 
        hProcess = GetHandleByProcessId(dwProcessId) 
        If hProcess = 0 Then 
            GetProcessPath = "" 
            Exit Function 
        End If 
    End If 
    Dim lngRet As Long, lngReturn As Long 
    ntStatus = NtQueryInformationProcess(hProcess, ProcessBasicInformation, VarPtr(objBasic), Len(objBasic), ByVal 0&) 
    If (NT_SUCCESS(ntStatus)) Then 
        objPEB = objBasic.PebBaseAddress 
        lngRet = ReadProcessMemory(hProcess, ByVal objPEB + &HC, objLdr, 4, ByVal 0&) 
        lngRet = ReadProcessMemory(hProcess, ByVal objLdr + &HC, objFlink, 4, ByVal 0&) 
        lngRet = ReadProcessMemory(hProcess, ByVal objFlink + &H18, objBaseAddress, 4, ByVal 0&) 
        If objBaseAddress > 0 Then 
            lngRet = ReadProcessMemory(hProcess, ByVal objFlink + &H28, objName, 4, ByVal 0&) 
            lngRet = ReadProcessMemory(hProcess, ByVal objName, bytName(0), 260 * 2, ByVal 0&) 
            If ERROR_PARTIAL_COPY = lngRet Then 
Start: 
                i = i + 1 
                If ERROR_PARTIAL_COPY = ReadProcessMemory(hProcess, ByVal objName, bytName(0), 260 * 2 - i, ByVal 0&) Then 
                    GoTo Start 
                End If 
            End If 
            strModuleName = bytName 
            strModuleName = Left(strModuleName & Chr(0), InStr(strModuleName & Chr(0), Chr(0)) - 1) 
            GetProcessPath = strModuleName 
        End If 
    End If 
    NtClose hProcess 
End Function 

看这里objBaseAddress 这个就是你要的东西

以上是关于如何获取 程序加载后的内存起始地址的主要内容,如果未能解决你的问题,请参考以下文章

汇编程序的运行方法

小程序如何获取下个月的起始时间与结束时间

如何“手动”符号化 [NSThread callStackSymbols](获取 atos 的起始地址)(iOS)

在delphi中如何获取字符串的内存地址

如何获取其他程序内存的地址,然后在我的程序中读取

用c语言如何获取内存地址?