c - 定义一个C程序编译后要修改的地址

标签 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','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 的相关十六进制 View :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/

相关文章:

java - 不使用命令行编译的基本java程序

javascript 相当于 python 的编译和执行

Python 十六进制比较

java - 在javacard中将十六进制字符串转换为字节数组

通过将指针传递给交换函数来交换两个整数的 C 代码

c - 如何正确写入套接字

c++ - 我怎样才能从字符串中得到一个词

c - 制作并应用 apue.h

c - 为什么在构建这个 C 项目时出现所有这些错误?

powershell - Powershell-十六进制至IEEE754单精度浮点