如何在运行时获取标签相对于可执行文件的原始地址的偏移量?

时间:2019-05-17 20:07:50

标签: assembly x86 x86-64 nasm

我的test.asm文件包含_start函数,而test.c文件包含main函数

我需要在test.asm文件中获取标签main_start的偏移地址

例如,如果我程序的基址是0x400000

我可以在运行时获得main的有效地址0x401260 但是,如何计算主函数相对于基址的偏移量?

0x401260 - 0x400000 = 0x1260

如何获取值0x1260,它是nasm中main函数的偏移量? 与_start函数相同

我尝试过:

mov rdi, main
mov rsi, _start
sub rsi, main
call poly

如您所见,我可以通过这种方式获取完整地址,但是如何获得上述函数相对于基址的偏移量?

编辑:我实际上有一个用例

例如,我正在制作一种可自我复制的多态病毒,因此我需要对一部分可执行文件进行加密。

我的可复制病毒的工作方式如下: 1)运行virus.exe

2)virus.exe的基地址为0x400000,知道它是“主”地址,并开始解密“主” 0x401260,直到“ main.end” 0x402260为止,并且病毒执行了讨厌的操作< / p>

3)现在,virus.exe要复制并变形,因为virus.exe打开virus.exe文件以便解密加密区域,生成新的解密例程,并将新的加密区域和相应的解密方案都写入病毒。 exe文件。 在分配的内存中读取virus.exe文件,该内存从0x40b620开始。 Virus.exe首先需要在打开的virus.exe文件中将加密区域“ main”解密为“ main.end”,因为virus.exe需要知道“ main”功能所在的偏移量。问题!!因为打开的virus.exe文件分配的内存相对于当前正在运行的virus.exe的基址以不同的偏移量b620开始,这样才能访问virus.exe中的main函数起点需要计算'b620'+'1260'以获得main函数相对于我的基址的偏移量,或计算0x40b620 + 1260以获得内存中打开的virus.exe文件中'main'函数的完整地址

可以解决此问题的一种方法是,当我为test.c文件中要读取的文件分配内存时,如果我可以找到相对于程序开始发生的偏移量。然后,我可以使用该值0xb620并将其作为参数传递给我的test.asm文件。

更多编辑其他说明:

我正在创建一种多态病毒,可以对自己文件的某些部分进行加密/解密,因此需要打开自己的文件并对其进行操作。说我想解密文件中的A到B区域,我不知道文件中A的地址,但是我知道的是[current_running_virus_program_base_addr + A] = A的完整地址,因为A是我的可执行文件中的标签,所以我知道A的完整地址

所以说:

当前正在运行的病毒[base_addr + A] = 0x400000

文件malloc起始地址= 0x4068b0

如果我知道0x68b0的区别

然后我可以这样计算病毒文件中功能A的完整地址:

[current_running_virus_program_base_addr + A] + 0x68b0

我尝试过的:

为“ main”获取当前内存,该内存为0x401260,并删除第一个字符“ 4”,该内存为0x1260。

0 个答案:

没有答案