Perl extension for reading and writing to arbitrary memory locations
# function interface
use PeekPoke::FFI qw( peek poke );
my $value = peek( 0xdeadbeaf );
poke( 0xdeadbeaf, $value + 1 );
# OO-interface
use PeekPoke::FFI;
my $pp = PeekPoke::FFI->new( type => 'sint32', base => 0xdeadbeaf );
my $value = $pp->peek( 0xdeadbeaf );
$pp->poke( 0xdeadbeaf, 0 - $value );
Very occasionally I need to get/set bytes from arbitrary bits of memory from a Perl script or module. If you know what you are doing it isn't too tricky to get an arbitrary byte from Perl. Setting one is a little harder, but can be done with tricks. This module implements these tricks so that I don't have to remind myself of how to do it the next time I need to reach for this particular tool.
my $pp = PeekPoke::FFI->new(%opts);
Create a PeekPoke::FFI instance. If you need to get/set values other than bytes, or if you want to set a base address, then you will want to create
-
type
The FFI::Platypus type to use for peeking and poking. Defaults to
uint8
. Only integer and floating point types are supported. -
base
The base address to use. The offset will be added to this value.
my $value = $pp->peek($offset);
my $value = peek($offset);
Get the value at the given offset.
$pp->poke($offset, $value);
poke($offset, $value);
Set the value at the given offset.
Most of the time you shouldn't be peeking and poking at random bits of memory. Sometimes during development it can be useful for various reasons. Use with extreme caution in production.
-
This is an XS module that has been around for donkey's years. It only works with the native Perl integer values (IV) which is not usually what I want.
-
BASIC style Peek/Poke via Alien::libvas.
Graham Ollis [email protected]
This software is copyright (c) 2020 by Graham Ollis.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.