我有一个小的C程序示例:

#include <stdio.h>

#define CIAO 0x15151515;
#define PROVA 0x14141414;

int main(){
    unsigned char *ptr = (unsigned char *)CIAO;
    long int nbytes = PROVA;

    long int i;

    int cpt = 0;

    char key[] = { 'a','b','a','b','a','b','a','b','\0' };
    int keyLength = 8;

    for (i = 0; i < nbytes; i++){
        ptr[i] = ptr[i] ^ key[cpt];
        cpt = cpt + 1;
        if (cpt == keyLength)
            cpt = 0;
    }
    return 0;
}

我的目标是编译它,然后使用HexEditor,找到特定的值0x151515150x14141414并用另一个值替换它们。
我尝试过其他更小的示例程序,我很容易做到这一点。用这个代替我有问题。0x15151515被写成了0x16151515,我搜索了0x14141414,但没有找到类似的东西。
以下是exe的相关十六进制视图:https://pastebin.com/dLi4tfU5
你有什么线索可以解释为什么有时候写下的价值看起来会改变吗?
有没有什么方法可以避免这种情况,并确保每当我写“CIAO”时,在被视为十六进制的exe文件中,我总能找到0x15151515
另外,我知道这不是你通常应该做的事情,当然我知道编辑exe可能会导致程序的意外行为。我只是为了好玩

最佳答案

优化编译器可能会更改代码中的常量。
您可以使用volatile关键字作为对编译器的提示,说明变量的值可能被程序本身外部的某些东西修改或访问,从而避免对其进行过多优化:

#include <stdint.h>

volatile const uint32_t CIAO = 0x15151515;
volatile const uint32_t PROVA = 0x14141414;

尝试用此代码替换#define语句,然后打开二进制文件并查找这些值。

关于c - 定义在编译C程序后要修改的地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52093307/

10-14 18:36
查看更多