定义一个C程序编译后要修改的地址
Define an address to be modified after the compilation of a C program
我有这个小示例 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','[=10=]' };
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,找到特定值 0x15151515
和 0x14141414
并将它们替换为另一个值。
我已经尝试使用其他较小的示例程序,我设法非常轻松地做到了这一点。使用这个代替我遇到了一些问题。 0x15151515
被写成 0x16151515
我搜索了 0x14141414
但我没有找到任何类似的东西。
这里是exe的相关十六进制视图:https://pastebin.com/dLi4tfU5
您是否知道为什么有时写入的值似乎会发生变化?
有什么办法可以避免这种情况,并确保每当我写 "CIAO" 然后在被视为十六进制的 exe 中我总是会找到 0x15151515
?
p.s。我知道这不是你通常应该做的事情,当然我知道编辑 exe 可能会导致程序出现意外行为。我只是为了好玩
优化编译器可能会更改代码中的常量。
您可以使用 volatile
关键字向编译器提示变量的值可能会被程序本身外部的某些内容修改或访问,从而避免过度优化它:
#include <stdint.h>
volatile const uint32_t CIAO = 0x15151515;
volatile const uint32_t PROVA = 0x14141414;
尝试用此代码替换您的 #define
语句,然后打开二进制文件并查找这些值。
我有这个小示例 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','[=10=]' };
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,找到特定值 0x15151515
和 0x14141414
并将它们替换为另一个值。
我已经尝试使用其他较小的示例程序,我设法非常轻松地做到了这一点。使用这个代替我遇到了一些问题。 0x15151515
被写成 0x16151515
我搜索了 0x14141414
但我没有找到任何类似的东西。
这里是exe的相关十六进制视图:https://pastebin.com/dLi4tfU5
您是否知道为什么有时写入的值似乎会发生变化?
有什么办法可以避免这种情况,并确保每当我写 "CIAO" 然后在被视为十六进制的 exe 中我总是会找到 0x15151515
?
p.s。我知道这不是你通常应该做的事情,当然我知道编辑 exe 可能会导致程序出现意外行为。我只是为了好玩
优化编译器可能会更改代码中的常量。
您可以使用 volatile
关键字向编译器提示变量的值可能会被程序本身外部的某些内容修改或访问,从而避免过度优化它:
#include <stdint.h>
volatile const uint32_t CIAO = 0x15151515;
volatile const uint32_t PROVA = 0x14141414;
尝试用此代码替换您的 #define
语句,然后打开二进制文件并查找这些值。