我的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。