我在之前的一份试卷中发现了这个问题,我不确定我是否得到了正确的答案。据我所知,2^15 是 32768,即 32 MB,所以答案可能是 15 位。但我想我在这里遗漏了一些东西?
我刚刚开始进行逆向工程。
我创建了一个小型 C++ ConsoleApplication,并尝试通过注入的 DLL 调用 NewFunction。
void NewFunction()
{
DWORD dwImageBase = (DWORD)GetModuleHandle(NULL);
std::cout << "ImageBase: " << ToHex(dwImageBase) << std::endl;
std::cout << "NewFunction: " << ToHex((DWORD)&NewFunction) << std::endl;
std::cout << "Offset: " << ToHex((DWORD)&NewFunction - dwImageBase) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
ImageBase: F90000
NewFunction: FA111D
Offset: 1111D
Run Code Online (Sandbox Code Playgroud)
现在,当我使用注入的 DLL 调用 0xFA111D 时,它会按预期工作并再次打印。(DLL调用ImageBase + Offset)
但我不知道如何使用 IDA Pro 获取 NewFunction 的地址...
至少偏移量不应该是相同的吗?我在这里错过了一些重要的东西吗?
我在 IDA Pro 中打开了一个可执行文件,并找到了我想要中断的位置,从文件开头的 0x3390 处。
如何在 lldb 中的内存地址、程序开始 + 0x3390 处设置断点。
我尝试过b s -a 0x3390,但它不起作用,我想是因为我需要实际地址,而不是偏移量。
我在裸板运行时上运行,从地址零读取数据是我软件中的一个有效用例。但是,运行时将地址 0x0 视为null,并在使用-O2. 代码在编译时按预期运行-O1:
declare
use System.Storage_Elements;
type Byte_Array is array (Natural range 0 .. 3) of Interfaces.Unsigned_8;
bytes : constant Byte_Array with Import, Convention => Ada, Address => To_Address(Integer_Address(16#00000000#));
begin
-- Copy bytes to some other byte array in memory:
other_bytes := bytes; -- Throws exception
end;
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个问题?
我的平台详情:
失败详情:
之前的代码在我的运行时在memcpy由s-memcop.adb. 代码复制在下面,并带有一条注释报告失败的行。我不确定抛出的实际异常。我所能看到的就是最后一次使用信息调用处理程序的机会s-memcop.adb:52,下面对此进行了评论。
40 function memcpy
41 (Dest …Run Code Online (Sandbox Code Playgroud) 我在我的 C 编程书中找到了这段代码:
int i = 42;
int *p;
p = &i; // & is address of sign
*p = i; // * is dereference sign
Run Code Online (Sandbox Code Playgroud)
"p = &i" 和 "*p = i" 之间有什么区别吗??使用这两个表达式时“p”会具有不同的特征吗???
编辑:因为这段代码只是试图解释指针的概念,它是不可运行的......所以这两个赋值的顺序在这种情况下是不相关的......抱歉让事情变得模糊......
在 8086 微处理器中,假设 CS 为 FFFFH,IP 为 FAB0H,那么物理内存地址将通过将 CS 乘以 16 并加上 IP 来计算。ie Add = FFFF0 + FAB0 这个总和会导致溢出,因为总和不能存储在 20 位中。会发生什么?
class Scratch {
public void meth1(){
}
public void meth2(){
}
public void meth3(){
}
public void meth4(){
}
public void meth5(){
}
public static void main(String[] args) {
int randomNumber=(int)Math.random()*5;
}
}
Run Code Online (Sandbox Code Playgroud)
这里我有5个方法,我想随机调用它们。我是 OOP 的新手,但对 C 有点了解,在这种情况下,我会将函数(方法)的地址存储在一个数组中,在 [0,4] 之间生成一个随机数并使用数组调用函数随机顺序。但是在Java中,我不知道如何获取方法的内存地址。我该怎么做?
我正在学习 C 语言并了解指针。据我了解,当您声明一个数组时,该数组的地址是该数组中第一个元素的地址。所有其他元素都连续存储在内存中。
当我使用onlinegdb.com 上的在线 C 编译器运行此代码时...
int main()
{
int num[5] = { 0, 1, 2, 3, 4 };
for (i = 0; i < 5; i++) {
printf("num[%d] has the value %d and is stored at address %p\n",
i, num[i], &num[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我观察到以下情况...
num[0] has the value 0 and is stored at address 0x7ffe9973e600
num[1] has the value 1 and is stored at address 0x7ffe9973e604
num[2] has the value 2 and is stored at …Run Code Online (Sandbox Code Playgroud) 在sparc架构中,有一个ASI(地址空间指示符)被传递给加载、存储指令,因此如果ASI为0x20,则像IO访问一样绕过缓存。即使内存范围在页表中设置为可缓存,缓存也会被绕过。这有时非常方便,例如使用变量在核心之间进行同步等
。aarch64 架构中有类似的东西吗?我查看了指令内容,但在加载/存储指令列表中找不到任何内容。
type person struct{
Name string
Age int
}
// parameters : (pointer to person struct), which is basically address of person object
func printPerson(p *person) {
// when we add '*' to a address, then it becomes dereferencing, Hence
// I read "*p.Name" as "person object dot Name" and i expect it to give value,
// I get this error:
// ./prog.go:20:15: invalid indirect of p.Name (type string)
// ./prog.go:20:24: invalid indirect of p.Age (type int)
fmt.Println(*p.Name, *p.Age) // does …Run Code Online (Sandbox Code Playgroud)