在C语言中,如何从其成员的地址获取struct的起始地址?
struct type1 {
//...
int member1;
//...
};
struct type1 obj1;
Run Code Online (Sandbox Code Playgroud)
并且ptr1是成员的地址member1中obj1,如何定义
宏#define start_add(ptr1, type1, member1)获得OBJ1的
起始地址?
我又回来了,沮丧,拼命寻求帮助: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) 我试图打印每个角色的地址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) 请看以下示例:
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因为他们有相同的成员和成员的顺序. …
在我的系统都ptrdiff_t和size_t是64位.
我想澄清两件事:
我相信没有阵列可以像size_t地址空间限制一样大.这是真的?
如果是,那么,是否有保证ptrdiff_t能够保存最大尺寸数组中任何指针的减法结果?
我不确定我是否正确理解了堆栈。对于复数 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 分开,你需要“两个”引用指针来指向复杂类型的对象。
我正在研究一个问题,我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++,现在我想知道我是否也可以在 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) 有些架构具有多个地址空间,著名的例子是真正的哈佛架构,但 OpenCL 也具有此属性。
C 编译器可能为此提供一些解决方案,其中之一是命名地址空间,支持特殊的指针限定符来指示指针的地址空间,但也可能存在其他解决方案。
我不知道它们,并且在我使用的架构(8 位 AVR)上,还有另一种解决方案来处理该问题,即专门的宏 ( )pgmspace.h来处理 ROM 中的数据。但是对这些没有类型检查,并且它们(在我看来)使代码变得丑陋,所以在我看来,使用命名地址空间是一种更好的,甚至可能更便携的方式来处理问题(可移植的通过为地址空间限定符提供空定义,可以轻松地将这样的软件移植到具有单个地址空间的目标。
然而,在我从其可用性中了解到的上一个问题中,建议使用命名地址空间的解决方案被严重否决,此处:如何使两个其他相同的指针类型不兼容
反对者没有提供任何解释,我自己也没有找到任何解释,对我来说,命名地址空间似乎是处理问题的一种很好且功能完善的方式。
有人能提供解释吗?为什么不应该使用命名地址空间?(倾向于具有多个不同地址空间的目标上可用的任何其他方法)
memory-address ×10
c ×5
c++ ×4
pointers ×3
struct ×2
arrays ×1
fork ×1
memory ×1
offset ×1
parent-child ×1
size ×1
string ×1
swift ×1
swift3 ×1
type-punning ×1