让我们假设我是一个游戏,我有一个int*
包含我健康的全局.游戏训练师的工作是将此值修改为任何内容以实现上帝模式.我已经查阅了游戏培训师的教程,以了解它们是如何工作的,一般的想法是使用内存扫描程序来尝试找到某个值的地址.然后通过注入一个dll或其他来修改这个地址.
但是我创建了一个简单的全局程序,int*
每次运行应用程序时它的地址都会发生变化,所以我不知道游戏培训师如何对这些地址进行硬编码?或者我的例子错了吗?
我错过了什么?
我目前正面临运营商的新问题.使用以下代码,我想使输出与if ... else
在C#中使用pair 时的输出相同.
var method = new DynamicMethod("dummy", null, Type.EmptyTypes);
var g = method.GetILGenerator();
g.Emit(OpCodes.Ldstr, "string");
g.Emit(OpCodes.Ldstr, "string");
g.Emit(OpCodes.Call, typeof(String).GetMethod("op_Equality", new Type[]{typeof(string), typeof(string)}));
g.Emit(OpCodes.Ldc_I4, 0);
g.Emit(OpCodes.Ceq);
g.Emit(OpCodes.Brtrue_S, );
var action = (Action)method.CreateDelegate(typeof(Action));
action();
Console.Read();
Run Code Online (Sandbox Code Playgroud)
我的问题是:
BR
和BR_S
,Brtrue
和Brtrue_S
,Brfalse
和Brfalse_S
和类似的说明?谢谢.
c# reflection reflection.emit system.reflection memory-address
我试图破译如何使用/ proc/pid/pagemap来获取给定页面集的物理地址.假设从/ proc/pid/maps,我得到对应堆的虚拟地址afa2d000-afa42000.我的问题是如何使用此信息遍历页面映射文件,并找到对应于地址afa2d000-afa42000的物理页面框架.
/ proc/pid/pagemap条目采用二进制格式.有没有工具可以帮助解析这个文件?
有一些我不了解Swift如何管理内存地址 String(s)
这里foo
和boo
是2个指针指向相同的内存位置.
class Foo { }
let foo = Foo()
let boo = foo
unsafeAddressOf(foo) // "UnsafePointer(0x7FCD13719BE0)"
unsafeAddressOf(boo) // "UnsafePointer(0x7FCD13719BE0)"
Run Code Online (Sandbox Code Playgroud)
好.
let word0 = "hello"
let word1 = word0
Run Code Online (Sandbox Code Playgroud)
现在,word0
和word1
是value types
但这里的copy on write
机制是参与.
[...]但是,当绝对必要时,Swift仅在幕后执行实际复制.Swift管理所有值复制以确保最佳性能,您不应该避免分配以尝试抢占此优化.https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-XID_134
那他们为什么有2个不同的内存地址呢?
unsafeAddressOf(word0) // "UnsafePointer(0x7FCD1342ACE0)"
unsafeAddressOf(word1) // "UnsafePointer(0x7FCD13414260)"
Run Code Online (Sandbox Code Playgroud)
同时请注意,String
是struct
那个莫名其妙符合到AnyObject
.
使用Xcode 7 GM Playground和Swift 2.0进行测试.
第§6.5.3.2节"地址和间接操作符"3表示(仅限相关部分):
一元&运算符返回其操作数的地址....如果操作数是一元运算
*
符的结果,则不会对该运算符和&
运算符进行求值,结果就好像两者都被省略,除了对运算符的约束仍然适用且结果不是左值.类似地,如果操作数是[]
运算符的结果,&
则不会对运算符或*
由其暗示的一元[]
进行求值,结果就像&
删除了[]
运算符并将运算符更改为+
运算符一样....
这意味着:
#define NUM 10
int tmp[NUM];
int *i = tmp;
printf("%ti\n", (ptrdiff_t) (&*i - i) );
printf("%ti\n", (ptrdiff_t) (&i[NUM] - i) );
Run Code Online (Sandbox Code Playgroud)
应该完全合法,打印0和NUM
(10).标准似乎非常清楚,这两种情况都需要进行优化.
但是,它似乎不需要优化以下内容:
struct { int a; short b; } tmp, *s = tmp;
printf("%ti\n", (ptrdiff_t) (&s->b - s) );
Run Code Online (Sandbox Code Playgroud)
这似乎非常不一致.我没有理由认为上面的代码不应该打印sizeof(int)
加号(不太可能)填充(可能是4).
简化&->
表达式在概念上(IMHO)将是&[]
一个简单的地址加偏移量.它甚至是一个在编译时可以确定的偏移量,而不是[]
运算符可能的运行时间.
关于为什么这么看似不一致的理由是否存在?
在C++中,对解除引用指针的引用的地址是否保证与指针的地址相同?
或者,用代码编写,以下断言保证始终成立?
SomeType *ptr = someAddress;
SomeType &ref = *ptr;
assert(&ref == ptr);
Run Code Online (Sandbox Code Playgroud) 是否可以为constexpr变量分配唯一的地址,即对于变量可用的所有翻译单元(通常通过标题)都是相同的?请考虑以下示例:
// foo.hh
#include <iostream>
constexpr int foo = 42;
// a.cc
#include "foo.hh"
void a(void) { std::cout << "a: " << &foo << std::endl; }
// b.cc
#include "foo.hh"
extern void a(void);
int main(int argc, char** argv) {
a();
std::cout << "b: " << &foo << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
使用gcc 4.7 编译a.cc
和b.cc
分开并将它们链接在一起,我看到打印了两个不同的地址.如果我extern
在标题中添加关键字,我会收到链接器错误duplicate symbol _foo in: a.o and b.o
,我觉得有点令人惊讶,因为我认为添加extern
更有可能导致编译器从另一个对象导入该符号,而不是从当前对象导出它.但似乎我对这些事情的运作方式的理解是错误的.
是否有合理的方法在一个标题中声明constexpr,这样所有翻译单元都可以在其常量表达式中使用它,并且所有翻译单元都同意该符号的地址?我希望一些额外的代码来表示这个符号实际所属的单个翻译单元,就像没有的extern
非extern
变量一样constexpr
.
#include <iostream>
using namespace std;
int main()
{
int x=80;
int &y=x;
cout<<"x"<<x<<" "<<"y"<<y++;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码给了我以下输出:
81 80
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释一下x
变化的价值如何81
?y
is 的值80
然后会增加到81
,但它是如何反映的x
?
它是否反映因为y
是参考变量?然后该值应该在两个已被修改x
和y
?
我正在尝试使用打印变量的地址lldb
.但是,调用print &(myVar)
打印变量的内容而不是其地址.
(lldb) print &(myVar)
(const string *) $18 = "hello"
Run Code Online (Sandbox Code Playgroud)
同样的expression &(myVar)
.
(lldb) expression &(myVar)
(const string *) $19 = "hello"
Run Code Online (Sandbox Code Playgroud)
我也尝试过expression
的-L
选项:
(lldb) expression -L -- &(myVar)
0x00000000021aea80: (const string *) $20 = "hello"
(lldb) expression -L -- myVar
0x0000000002a15430: (std::string) $23 = "hello"
Run Code Online (Sandbox Code Playgroud)
但是每次调用时输出的地址都会改变expression -L
.因此我假设它不对应于内存中变量的地址.
如何在内存中获取变量的地址?
(我使用lldb 3.4)
例如,如果我在主应用程序中声明一个函数,并通过一个动态加载的库(通过dlopen
在Linux LoadLibrary
下或在Windows下)使用gotten符号参数(通过dlsym
或GetProcAddress
分别)传递指向它的指针,并尝试调用该函数它会正常工作吗?
如果将指针从一个动态加载的库传递到另 我认为如果指针至少相对于应用程序而不是相对于模块/库,它应该工作.
另一个例子.我在一个应用程序中声明一个函数并将指针传递给另一个完全独立的应用程序(包括C和C++)(参数字符串或文件i/o - idk如何,只是一个想法)并尝试调用此函数,是否会工作呢?如果指针是绝对的,我可以期待它工作.也许它只是不起作用,因为系统不会因为安全而不喜欢这种交叉呼叫?
memory-address ×10
c++ ×4
pointers ×4
c ×1
c# ×1
c++11 ×1
constexpr ×1
extern ×1
linux ×1
linux-kernel ×1
lldb ×1
reference ×1
reflection ×1
standards ×1
string ×1
swift ×1
value-type ×1