Подтвердить что ты не робот

Чтение случайных мест памяти с помощью Golang

Добрый вечер,

Я пытаюсь создать приложение golang, которое сканирует значения в памяти, но я пытаюсь понять, как обращаться с конкретными ячейками памяти. Я знаю, что при доступе к памяти в приложении вы можете использовать *variablename для подтверждения и получения адреса, но как я могу указать местоположение адреса и распечатать значение на экране или захватить следующий выделенный объект любого размера из ОЗУ и распечатать его значение?

Заранее благодарим за любую помощь, которую вы можете пожелать поделиться.

4b9b3361

Ответ 1

Я не знаю, насколько это будет полезно, но вот пример кода.

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    var i int = 1
    fmt.Println("Address : ", &i, " Value : ", i)

    var address *int
    address = &i // getting the starting address

    loc := (uintptr)(unsafe.Pointer(address))
    p := unsafe.Pointer(loc)

    // verification - it should print 1
    var val int = *((* int)(p))
    fmt.Println("Location : ", loc, " Val :",val) // it does print !!

    // lets print 1000 bytes starting from address of variable i
    // first memory location contains 1 as expected
    printValueAtMemoryLocation(loc, 1000)

    // now lets test for some arbitrary memory location
    // not so random ! wanted to reduce the diff value also any arbitrary memory location you can't read !!
    memoryToReach := 842350500000
    loc = changeToInputLocation(loc, memoryToReach)
    fmt.Println("Loc is now at : ", loc)
    // lets print 1000 bytes starting from the memory location "memoryToReach"
    printValueAtMemoryLocation(loc, 1000)

}

func changeToInputLocation(location uintptr, locationToreach int) uintptr {
    var diff,i int
    diff = locationToreach - int(location)

    fmt.Println("We need to travel ", diff, " memory locations !")

    if diff < 0 {
        i= diff * -1
        for i > 0 {
            location--
            i--
        }
    } else {
        i= diff
        for i > 0 {
            location++
            i--
        }
    }
    return location
}

func printValueAtMemoryLocation(location uintptr, next int) {
    var v byte
    p := unsafe.Pointer(location)
    fmt.Println("\n")
    for i:=1; i<next; i++ {
        p = unsafe.Pointer(location)
        v = *((*byte)(p))
        fmt.Print(v," ")
        //fmt.Println("Loc : ", loc, " --- Val : ", v)
        location++
    }
    fmt.Println("\n")
}

Использование "небезопасного" пакета не является хорошей идеей, также вы не можете прочитать какое-либо произвольное местоположение, которое я считаю.

Для меня, когда я пробовал некоторые другие случайные местоположения, где, скорее всего, у меня не было доступа к чтению, это заставило меня ошибиться так:

unexpected fault address 0xc41ff8f780
fatal error: fault
[signal SIGBUS: bus error code=0x2 addr=0xc41ff8f780 pc=0x1093ec0]

Но, надеюсь, это может быть для вас чем-то ценным.