• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Trwała zmiana wartości po skompilowaniu kodu C++

Object Storage Arubacloud
0 głosów
192 wizyt
pytanie zadane 25 lipca 2023 w C i C++ przez Pabllo26 Obywatel (1,280 p.)

Witam 
Chciałbym się dowiedzieć czy istnieje opcja zmiany wartości w kodzie który został już skompilowany. 
Np. mając fragment

int id = 156;

po odpaleniu gotowego skompilowanego programu, ta wartość została by zmieniona na inną nadaną przez użytkownika, tak aby już przy każdym następnym odpaleniu ta wartość była w kodzie samego programu. Byłbym bardzo wdzięczny za  wskazówkę. Z góry dzięki :)

2 odpowiedzi

+1 głos
odpowiedź 25 lipca 2023 przez Gynvael Coldwind Nałogowiec (27,530 p.)
wybrane 25 lipca 2023 przez Pabllo26
 
Najlepsza

+1 do tego co adrian17 napisał.

To powiedziawszy, tak, da się to technicznie zrobić, ale trzeba trochę zakombinować. Problemy są dwa:

  1. Trzeba tą wartość znaleźć w pliku. Najprościej jest ją zaszyć w tablicy między dwoma "magicznymi" wartościami, np. int64_t id[] = { 0xdeadc0d31337abcd, 156, 0xdeadc0d313370123 };. W takim przypadku można sobie łatwo napisać funkcje, która otworzy plik i znajdzie obie te magiczne wartości, sprawdzi czy jest między nimi sizeof(int64_t) bajtów odstępu (tudzież w ogóle będzie szukać tych magicznych wartości oddalonych od siebie o te 8 bajtów), i podmieni wartość. No i trzeba uważać, żeby funkcja szukająca nie znalazła sama siebie ;)
  2. Pod Windowsem uruchamiana aplikacja ma zblokowany dostęp do zapisu do własnego exeka. Co za tym idzie, żeby zmodyfikować exeka trzeba najpierw wyjść ze wszystkich instancji tego exeka jednocześnie odpalając inny program, który poczeka aż wszystkie te procesy się zakończą, a potem zmodyfikuje exeka. Pod Linuxem nie ma tego problemu. Nie wiem jak pod OSXem.

Oczywiście user może sobie po prostu zmienić uprawnienia do tego exeka, tak, żeby nic nie mogło po nim pisać, więc to w żadnym wypadku nie jest perfekcyjna metoda. Ale technicznie da się to zrobić.

 

1
komentarz 26 lipca 2023 przez Oscar Nałogowiec (29,320 p.)
Nie jestem pewny, czy pod linuxem nie ma blokady wykonywanego pliku.

Trzeba pamiętać, że dzisiejsze systemy to nie DOS. Co prawda zwykle korzysta z nich jedna osoba, ale są to systemu wieloużytkowe i trzeba rozważyć, czy zmiana wartości ma być dla wszystkich czy dla każdego osobno.

Pod Windows jest jeszcze rejestr - tak też można trzymać takie zmiany.
komentarz 27 lipca 2023 przez Gynvael Coldwind Nałogowiec (27,530 p.)

Yup, masz rację – pod linuxem open zwróci ETXTBSY w przypadku exeków. Mój błąd wynikał z tego, że pamiętałem, że można usunąć plik wykonywalny pod linuxem – założyłem więc, że można go też otworzyć do pisania (a, jak się okazuje, tak nie jest).

To jednak oznacza, że pod Linuxem przejdzie coś takiego:

  1. Wczytaj "siebie" do jakiegoś bufora.
  2. Usuń "siebie" z fs.
  3. Podmień wartość w buforze.
  4. Stwórz nowego "siebie" i zapisz bufor.

W praktyce z tego co na szybko naklepałem trzeba jeszcze chmod sobie poprawić.

Poniżej dwa kawałki kodu - niedziałający (bo to co Oscar napisał) + działający (ta nowa metoda). Oba napisane jako ad-hoc PoC (czyli z jest jakoś a nie jakość) :D

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

volatile unsigned int asdf = 0x12345678;

int main(int argc, char **argv) {
  (void)argc;
  printf("asdf -> %x\n", asdf);

  FILE *f = fopen(argv[0], "r+");
  static unsigned char buf[1024 * 1024];
  size_t sz = fread(buf, 1, sizeof(buf), f);
  for (size_t i = 0; i < sz - 3; i++) {
    if (memcmp(buf + i, (void*)&asdf, 4) == 0) {
      fseek(f, SEEK_SET, i);
      unsigned int n = asdf + 1;
      fwrite(&n, 1, 4, f);
      puts("found and updated");
      break;
    }
  }
  fclose(f);

  return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>

volatile unsigned int asdf = 0x12345678;

int main(int argc, char **argv) {
  (void)argc;
  printf("asdf -> %x\n", asdf);

  FILE *f = fopen(argv[0], "r");
  static unsigned char buf[1024 * 1024];
  size_t sz = fread(buf, 1, sizeof(buf), f);
  fclose(f);

  struct stat file_stat;
  stat(argv[0], &file_stat);

  unlink(argv[0]);

  for (size_t i = 0; i < sz - 3; i++) {
    if (memcmp(buf + i, (void*)&asdf, 4) == 0) {
      unsigned int n = asdf + 1;
      memcpy(buf + i, &n, 4);
      puts("found and updated");
      break;
    }
  }

  f = fopen(argv[0], "w");
  fwrite(buf, 1, sz, f);
  fclose(f);
  chmod(argv[0], file_stat.st_mode);

  return 0;
}

 

+2 głosów
odpowiedź 25 lipca 2023 przez adrian17 Ekspert (344,860 p.)

Nie, normalnie do czegoś takiego się zapisuje wartości w plikach.

Coś w stylu (ofc to pseudokod, tylko ideowo pokazuje kroki)

int id;
if (configExists()) {
    id = readIdFromConfig();
} else {
    id = readIdFromUser();
    createConfigFile();
    saveIdToConfig(id);
}

 

Podobne pytania

0 głosów
1 odpowiedź 647 wizyt
–1 głos
2 odpowiedzi 501 wizyt
pytanie zadane 11 czerwca 2017 w C i C++ przez Tomek Kozioł Obywatel (1,740 p.)
0 głosów
0 odpowiedzi 62 wizyt

92,579 zapytań

141,432 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...