MegaBastor
MegaBastor

Reputation: 39

Is it possible to modify a C program which is running?

i was wondering if it is possible to modify a piece of C program (or other binary) while it is running ?

I wrote this small C program :

#include <stdio.h>
#include <stdint.h>

static uint32_t gcui32_val_A = 0xAABBCCDD;

int main(int argc, char *argv[])  {

    uint32_t ui32_val_B = 0;
    uint32_t ui32_cpt = 0;

    printf("\n\n Program SHOW\n\n");

    while(1) {

        if(gcui32_val_A != ui32_val_B) {
            printf("Value[%d] of A : %x\n",ui32_cpt,gcui32_val_A);
            ui32_val_B = gcui32_val_A;
            ui32_cpt++;
        }
    }

    return 0;
}

With a Hex editor i'm able to find "0xAABBCCDD" and modify it when the program is stopped. The modification works when I relauch the program. Cool !

I would like to do this when the program s running is it possible ?

Here is a simple example to understand the phenomena and play a little with it but my true project is bigger.

I would like to do this dynamically when the game is running. Is it possible ?

PS : I work under Debian 64bit

regards

Upvotes: 3

Views: 1591

Answers (2)

I was wondering if it is possible to modify a piece of C program (or other binary) while it is running ?

Not in standard (and portable) C11. Read the n1570 specification to check. Notice that most of the time in practice, it is not the C source program (made of several translation units) which is running, but an executable result of some compiler & linker.


However, on Linux (e.g. Debian/Sid/x86-64) you could use some of the following tricks (often with function pointers):

I suggest to play a bit with /proc/ (see proc(5)) and try at least to run in some terminal the following commands

 cat /proc/self/maps
 cat /proc/$$/maps
 ls /proc/$$/fd/

(and read enough things to understand their outputs) to understand a bit more what a process "is".

So overwriting your text segment (if you really need to do that) is possible, but perhaps more tricky than what you believe !

(do you mind working for several weeks or months simply to improve some old gaming experience?)


Read also about homoiconic programming languages (try Common Lisp with SBCL), about dynamic software updating, about persistence, about application checkpointing, and about operating systems (I recommend: Operating Systems: Three Easy Pieces & OsDev wiki)


I work under Debian 64bit

I suppose you have programming skills and do know C. Then you should read ALP or some newer Linux programming book (and of course look into intro(2) & syscalls(2) & intro(3) and other man pages etc...)

BTW, in your particular case, perhaps the "OS" is DOSBOX (acting as some virtual machine). You might use strace(1) on DOSBOX (or on other commands or processes), or study its source code.


You mention games in your question. If you want to code some, consider libraries like SDL, SFML, Qt, GTK+, ....

Upvotes: 3

VladP
VladP

Reputation: 537

Yes you can modify piece of code while running in C. You got to have pointer to your program memory area, and compiled pieces of code that you want to change. Naturally this is considered to be a dangerous practice, with lot of restrictions, and with many possibilities for error. However, this was practice at olden times when the memory was precious.

Upvotes: 1

Related Questions