定义编译C程序后要修改的地址

定义编译C程序后要修改的地址,c,compilation,hex,exe,patch,C,Compilation,Hex,Exe,Patch,我有一个小小的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

我有一个小小的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;
}
#包括
#定义CIAO 0x15151515;
#定义PROVA 0x141414;
int main(){
无符号字符*ptr=(无符号字符*)CIAO;
长整数nbytes=PROVA;
long int i;
int-cpt=0;
字符键[]={a'、'b'、'a'、'b'、'a'、'b'、'a'、'b'、'b'、'\0'};
int keyLength=8;
对于(i=0;i
我的目标是编译它,然后使用HexEditor,找到特定的值
0x15151515
0x14141414
,并用另一个值替换它们

我尝试过其他较小的示例程序,我很容易做到这一点。用这个代替我有一些问题
0x15151515
被写成
0x16151515
,我搜索了
0x14141414
,但没有找到任何类似的内容

以下是exe的相关十六进制视图:

您是否知道为什么有时写入的值会发生变化? 是否有任何方法可以避免这种情况,并确保每当我写入“CIAO”时,在以十六进制形式查看的exe中,我总能找到
0x15151515


p、 我知道这不是你通常应该做的事情,当然我知道编辑exe可能会导致程序的意外行为。我这样做只是为了好玩

优化编译器可能会更改代码中的常量

您可以使用
volatile
关键字向编译器提示变量的值可能会被程序本身外部的东西修改或访问,从而避免过度优化:

#include <stdint.h>

volatile const uint32_t CIAO = 0x15151515;
volatile const uint32_t PROVA = 0x14141414;
#包括
易失性常数uint32\u t CIAO=0x15151515;
易失性常数uint32\u t PROVA=0x141414;

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

为什么要包括这些值?删除它不会使exe更小吗?没有要求或保证编译器逐字包含常量。也许处理器有一条指令,它接受一个8位值(0x15),并将它复制三次到一个32位量中;如果它的编码空间小于完整的32位常量,一个好的编译器会使用它。@Yanis.F抱歉,在以前的尝试中需要它,无论如何它不应该影响我的问题,这显然是一个XY问题。你为什么不使用链接器那样的机制呢?你的程序没有副作用,所以编译器完全可以用一个完全不做任何事情的程序来替换它。这正是我一直在寻找的东西!使用此选项而不是#define alome可以让我在exe中查找并修改正确的值。我真的很感谢你的帮助,谢谢。