当我做:
int x[] = new int[2];
System.out.println("...> " + x);
Run Code Online (Sandbox Code Playgroud)
输出值如下: [I@1b67f74
以便十六进制数与已分配对象的内存地址有关?
并且[I这是什么意思?
假设我在C++中有一个函数,我在其中使用指向其内存地址的指针来调用它typedef.现在,我怎样才能在Delphi中做同样的事情?
例如:
typedef void (*function_t)(char *format, ...);
function_t Function;
Function = (function_t)0x00477123;
Run Code Online (Sandbox Code Playgroud)
然后,我可以用:Function("string", etc);.
在Delphi中,有没有办法在不使用汇编指令的情况下执行此操作?
请注意,它是一个可变参数函数.
我正在翻阅微控制器的一些C头文件,我一直看到寄存器地址初始化为vuint.我之前没有遇到过这种数据类型,所以我做了一些搜索,没有真正的结果.我得到的最接近的是/sf/answers/899919261/,它告诉我v代表"volatile".所以,我有挥发无符号的整数,持有硬件寄存器地址.就像在,我有一个数据类型明确指出"这个地址可能会发生变化",代表硬连线的寄存器,并且不能像以前那样改变.我对vuint的理解不正确吗?如果没有,为什么我们这样代表地址?
所以,我试图找出,如何确定我的变量是否正在增加它的价值,或者减少它.我知道我可以使用一个变量来存储旧值,但在这种情况下它不是一个选项.
int variable = 0;
variable = 1;
if(variable has increased) {
//Do Magic stuff
}
Run Code Online (Sandbox Code Playgroud)
基本上,我会怎么想这样做.我不知道是否有可能这样,没有旧值的容器,但我认为可能有一个C#函数,可以解决这个问题,可能是一个内存地址?
我还没有得到任何线索,这种方法或技术也被称之为,所以对此也很了解.
我有很多关于gdb和objdump的问题.
objdump中的地址
如果我这样做:objdump -d binary-file-name,那么我得到包含这部分的输出:
Disassembly of section .text:
080484a0 <_start>:
80484a0: 31 ed xor %ebp,%ebp
80484a2: 5e pop %esi
80484a3: 89 e1 mov %esp,%ecx
Run Code Online (Sandbox Code Playgroud)
我假设第一列中的这些数字是地址?但是我不明白这些地址是如何知道的,因为当一个进程被加载时它被放在内存中的一个随机位置,这意味着代码每次都有不同的地址?或者这些地址是相对于进程'地址空间?
<_start>下列出的值是什么?
GDB逐步执行代码
我有一个二进制文件,其中没有源代码.我想逐步完成该程序,但没有符号信息.我无法在功能名称或亚麻布上设置断点.我试图在地址上设置一个断点,这很有效,但我无法弄清楚如何逐步完成该程序.当我这样做:(gdb)s或(gdb)n它说它没有行信息,只运行整个函数.有没有办法逐步完成它,或逐步完成装配说明?
我有一些生成的C代码,如下所示:
char *example[] = {&" ",&"\n", &"\t"};
Run Code Online (Sandbox Code Playgroud)
如果我自己写这个,我会丢掉&符号(&),因为字符串文字已经是类型char *.对我来说,看起来example 应该已经生成声明为char**[].
我可以确定指针是否与&s 相同?这是否取得了C中定义好的地址?
编辑:我正在调查当前生命周期中某些不接受任何更改的软件的警告.是否printf("%p", &"hello world");总是一样的printf("%p", "hello world");,还是这依赖于编译器?
#include <iostream>
class A
{
public:
A() : m_i(0) { }
protected:
int m_i;
};
class B
{
public:
B() : m_d(0.0) { }
protected:
double m_d;
};
class C
: public A
, public B
{
public:
C() : m_c('a') { }
private:
char m_c;
};
int main()
{
C c;
A *pa = &c;
B *pb = &c;
const int x = (pa == &c) ? 1 : 2;
const int y = (pb == &c) ? 3 …Run Code Online (Sandbox Code Playgroud) 我有一个适用于Mac OS X的程序集hello world程序,如下所示:
global _main
section .text
_main:
mov rax, 0x2000004
mov rdi, 1
lea rsi, [rel msg]
mov rdx, msg.len
syscall
mov rax, 0x2000001
mov rdi, 0
syscall
section .data
msg: db "Hello, World!", 10
.len: equ $ - msg
Run Code Online (Sandbox Code Playgroud)
我想知道这条线lea rsi, [rel msg]。为什么NASM强迫我这样做?据我了解,它msg只是指向可执行文件中某些数据的指针,这样做mov rsi, msg会将地址放入rsi。但是,如果我将替换为lea rsi, [rel msg],则NASM会引发此错误(注意:我使用的是命令nasm -f macho64 hello.asm):
hello.asm:9: fatal: No section for index 2 offset 0 found
Run Code Online (Sandbox Code Playgroud)
为什么会这样?有什么特别之处lea是mov …
我正在修改一个旧的放弃软件游戏,以获得无限生命.
具有该指令的地址dec ecx与其在.exe调试中的位置不同.
我记得我的一位老朋友告诉我,有一个公式可以通过.exe中的指令获得"真实"地址.作弊引擎给了我内存地址.我记得在数学公式中,我需要得到模块,在OllyDbg我得到它.但我不记得这个公式.有人知道那个数学公式怎么样?这个公式非常简单!还有另一种方法可以让文件位置永久修改.exe吗?
assembly reverse-engineering memory-address portable-executable cheat-engine
我正在尝试使用对它来自的C库的预先绑定来调用SDL_LoadWAV。SDL_LoadWAV只是SDL_LoadWAV_RW的包装:
function SDL_LoadWAV
(file : C.char_array;
spec : access SDL_AudioSpec;
audio_buf : System.Address;
audio_len : access Uint32) return access SDL_AudioSpec
is
begin
return SDL_LoadWAV_RW
(SDL_RWFromFile (file, C.To_C ("rb")),
1,
spec,
audio_buf,
audio_len);
end SDL_LoadWAV;
Run Code Online (Sandbox Code Playgroud)
这是C函数的原型:
SDL_AudioSpec* SDL_LoadWAV_RW(SDL_RWops* src,
int freesrc,
SDL_AudioSpec* spec,
Uint8** audio_buf,
Uint32* audio_len)
Run Code Online (Sandbox Code Playgroud)
现在您可以看到,它以Uint8 **的形式通过引用传递了一个Uint8(无符号8位整数)数组。这使我非常烦恼。这是适当的绑定:
function SDL_LoadWAV_RW
(src : access SDL_RWops;
freesrc : C.int;
spec : access SDL_AudioSpec;
audio_buf : System.Address;
audio_len : access Uint32) return access SDL_AudioSpec;
pragma Import (C, SDL_LoadWAV_RW, "SDL_LoadWAV_RW");
Run Code Online (Sandbox Code Playgroud)
如您所见,绑定将Uint8 **映射到System.Address。我尝试了一些技巧来将数据获取到想要的位置,但是似乎没有任何效果。现在,我的代码看起来像这样(其中包含一些自定义类型和异常):
type …Run Code Online (Sandbox Code Playgroud)