标签: memory-address

如何从其成员的地址获取struct的起始地址

在C语言中,如何从其成员的地址获取struct的起始地址?

struct type1 {
    //...
    int member1;
    //...
};
struct type1 obj1;
Run Code Online (Sandbox Code Playgroud)

并且ptr1是成员的地址member1obj1,如何定义
#define start_add(ptr1, type1, member1)获得OBJ1的
起始地址?

c struct memory-address

6
推荐指数
1
解决办法
2898
查看次数

C++,Cheat Engine/OllyDBG从多级指针中查找基本的"静态"地址

我又回来了,沮丧,拼命寻求帮助:D.

我试图为一个简单的程序创建一个作弊,它基本上是一个.dll文件,当它使用它的基地址注入它时,它将改变主程序的整数值.问题是,我找不到使用作弊引擎主要是因为有多个级别指针与NEGATIVE?偏移.例如:

//Starting pointer address
0x0033FCF0 -> 200

//Finding second level pointer using "Find out what's accessing this address" in Cheat Engine
**(mov eax,[ebp+08])** // **EAX=0x00000007** , **EPB=0x0033FCE8 => mov 00000007,[0033FCE8+08]**

2nd Level Pointer:
**(0033FCE8+18) -> 200**
Run Code Online (Sandbox Code Playgroud)

所以我继续使用"找出什么是......"来找到下一个指针,但是当使用T-SEARCH和第二级指针地址时,我会得到7到8个新的静态地址.

问题是,我不知道哪一个是正确的,因为作弊引擎REFUSES让我使用NEGATIVE添加指针?偏移.

例:

Base Pointer:
**mov eax,[epb-18] !!!** // Notice the **MINUS**
Run Code Online (Sandbox Code Playgroud)

并且除了一切之外,Cheat Engine拒绝接受具有负偏移的指针!

那么,是否有另一种从多个级别指针中查找基址的方法?欢迎OlyDBG/Idapro解决方案.非常感谢你们!

这是我试图破解的简单程序的源代码:

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>

int main(){
    int hp = 100;
    while(1){
        std::cout << hp << std::endl;
        Sleep(3000);
        hp += 10;
        system("cls");
    }
    return …
Run Code Online (Sandbox Code Playgroud)

c++ pointers offset memory-address

6
推荐指数
1
解决办法
1万
查看次数

std :: string的每个字符的地址

我试图打印每个角色的地址std::string.但是我不知道内部发生了什么,std::string这导致了这个输出,而对于数组,它给出了我预期的地址.有人可以解释一下发生了什么吗?

#include <iostream>
#include <string>

using namespace std;

int main(){

   string str = "Hello";
   int a[] = {1,2,3,4,5};

   for( int i=0; i<str.length(); ++i )
      cout << &str[i] << endl;

   cout << "**************" << endl;

   for( int i=0; i<5; ++i )
      cout << &a[i] << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Hello
ello
llo
lo
o
**************
0x7fff5fbff950
0x7fff5fbff954
0x7fff5fbff958
0x7fff5fbff95c
0x7fff5fbff960
Run Code Online (Sandbox Code Playgroud)

c++ arrays string memory-address

6
推荐指数
1
解决办法
5977
查看次数

类型转换的未定义行为?

请看以下示例:

typedef struct array_struct {
    unsigned char* pointer;
    size_t length;
} array;

typedef struct vector_struct {
    unsigned char* pointer;
    // Reserved is the amount of allocated memory not being used.
    // MemoryLength = length + reserved;
    size_t length, reserved;
} vector;


// Example Usage:
vector* vct = (vector*) calloc(sizeof(vector), 1);
vct->reserved = 0;
vct->length = 24;
vct->pointer = (unsigned char*) calloc(arr->length, 1);

array* arr = (array*) vct;
printf("%i", arr->length);
free(arr->pointer);
free(arr);
Run Code Online (Sandbox Code Playgroud)

C似乎按照它们在结构中定义的顺序为结构成员分配内存.这意味着如果你投射vector -> array你仍会得到相同的结果如果你执行操作array就像你做的那样,vector因为他们有相同的成员和成员的顺序. …

c struct memory-address type-punning

6
推荐指数
1
解决办法
402
查看次数

size_t ptrdiff_t和地址空间

在我的系统都ptrdiff_tsize_t64位.

我想澄清两件事:

  • 我相信没有阵列可以像size_t地址空间限制一样大.这是真的?

  • 如果是,那么,是否有保证ptrdiff_t能够保存最大尺寸数组中任何指针的减法结果?

c++ size pointers memory-address

6
推荐指数
1
解决办法
394
查看次数

引用指向哪里?

我不确定我是否正确理解了堆栈。对于复数 a 和 b(a=3+5i 和 b=2+i),我有以下运算符重载。

struct complex{
int x;
int y;
};

complex& operator+=(complex& a, const complex b){
a.x=a.x+b.x;
a.y=a.y+b.y;
return a; 
}
Run Code Online (Sandbox Code Playgroud)

现在我想知道返回值的引用指向哪里。

我认为在主堆栈帧中有一个用于 a = ax 和 64 位 ay 的内存区域,因为 ax/ay 是 int 类型。而operator+=stack-frame中的返回值a指向这个“a”-内存区域。

我想知道“a”-memory-area 是什么样子的,复杂类型的对象是如何存储在主堆栈框架中的?

它是像一个数组,引用指向“a[0]”还是 ax 和 ay 分开,你需要“两个”引用指针来指向复杂类型的对象。

c++ memory-address

5
推荐指数
1
解决办法
119
查看次数

fork()之后的地址,值和指针会发生什么

我正在研究一个问题,我fork()在C语言调用之前和之后检查值和地址.我的方法是显示变量值和地址,假设看到后面的地址有差异fork().令我惊讶的是,所说的变量仍然是相同的.

我的问题是他们为什么一样?如果我改变孩子的变量会怎么样?父母和孩子都会改变吗?如果没有,我如何能够更改该地址中的值,而父地址和子地址的地址相同.

代码(供参考):

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
  int status;
  pid_t pid;

  int a = 123456;
  float b = 123.456;
  char c = 'Z';
  int *e;
  e=&a;

  //Retriving address's
  void *ap=&a, *bp=&b, *cp=&c, *ep=&e;

    printf("Parent Before Fork:\n");
    printf("Integer a: \tvalue = %d, \taddress = %p\n", a, ap);
    printf("Float b: \tvalue = %f, \taddress = %p\n", b, bp);
    printf("Char c: \tvalue = %c, \t\taddress = %p\n", c, cp);
    printf("Pointer e: \tvalue …
Run Code Online (Sandbox Code Playgroud)

c fork parent-child virtual-memory memory-address

5
推荐指数
1
解决办法
697
查看次数

在 Swift 中通过引用传递变量

我开始学习 C++,现在我想知道我是否也可以在 Swift 中做一些事情。

我从来没有真正想过当我们将变量作为参数传递给 Swift 中的函数时会发生什么。

让我们使用类型变量string作为示例。

在 C++ 中,我可以通过制作函数的副本或传递引用/指针来将参数传递给函数。

void foo(string s)或者void foo (string& s); 在第一种情况下,将创建原始变量的副本,并且foo将收到一个副本。在第二种情况下,我基本上传递内存中变量的地址而不创建副本。

现在在 Swift 中我知道我可以将函数的参数声明为inout,这意味着我可以修改原始对象。

1) func foo(s:String)... 2) func testPassingByReference(s: inout String)...

我对 String 进行了扩展以打印对象的地址:

extension String {
    func address() -> String {
        return String(format: "%p", self);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果并不是我所期望看到的。

var str = "Hello world"
print(str.address()) 
Run Code Online (Sandbox Code Playgroud)

0x7fd6c9e04ef0

func testPassingByValue(s: String) {
    print("he address of s is: \(s.address())")
}
func testPassingByReference(s: inout String) …
Run Code Online (Sandbox Code Playgroud)

memory-address swift swift3

5
推荐指数
1
解决办法
9216
查看次数

是否应该在可用的情况下使用命名地址空间?

有些架构具有多个地址空间,著名的例子是真正的哈佛架构,但 OpenCL 也具有此属性。

C 编译器可能为此提供一些解决方案,其中之一是命名地址空间,支持特殊的指针限定符来指示指针的地址空间,但也可能存在其他解决方案。

我不知道它们,并且在我使用的架构(8 位 AVR)上,还有另一种解决方案来处理该问题,即专门的宏 ( )pgmspace.h来处理 ROM 中的数据。但是对这些没有类型检查,并且它们(在我看来)使代码变得丑陋,所以在我看来,使用命名地址空间是一种更好的,甚至可能更便携的方式来处理问题(可移植的通过为地址空间限定符提供空定义,可以轻松地将这样的软件移植到具有单个地址空间的目标。

然而,在我从其可用性中了解到的上一个问题中,建议使用命名地址空间的解决方案被严重否决,此处:如何使两个其他相同的指针类型不兼容

反对者没有提供任何解释,我自己也没有找到任何解释,对我来说,命名地址空间似乎是处理问题的一种很好且功能完善的方式。

有人能提供解释吗?为什么不应该使用命名地址空间?(倾向于具有多个不同地址空间的目标上可用的任何其他方法)

c pointers memory-address

5
推荐指数
1
解决办法
761
查看次数

内存:在图中高地址在顶部还是底部?

我正在学习C语言和记忆。为什么在某些图中高地址位于图的顶部,而在其他图中高地址位于图的底部?

高内存地址位于底部 高内存地址位于底部

高内存地址位于顶部 高内存地址位于顶部

c memory memory-address

5
推荐指数
1
解决办法
1985
查看次数