Username: Password: oppure
C/C++ - Salvare dati nel file dell'eseguibile
Forum - C/C++ - Salvare dati nel file dell'eseguibile - Pagina 3

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
AldoBaldo (Member)
Guru


Messaggi: 708
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 16:14
Mercoledì, 03/01/2024
Giusto, non ci avevo pensato! Questo apre la strada a tutta una serie di considerazioni.


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1371
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 21:30
Mercoledì, 03/01/2024
Ti so dare anche una mezza risposta sul perché la stringa è spezzata.
Io ho compilato a 32 bit e forse anche tu, l'uint64_t è inframezzato dal codice che lo sposterà a blocchi di word.
Se compili a 64bit la stringa è intera.
Se modifichi la stringa nell'eseguibile a 64bit, si riperquote in tutte e tre le visualizzazioni.

I tuoi programmi compilati a 64bit funzionano, vedi immagine allegata.


Carlo ha allegato un file: 64bit funziona.jpg (119180 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da Carlo il 03/01/2024 alle 22:35


in programmazione tutto è permesso
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 7:20
Giovedì, 04/01/2024
Il byte 0xCD (primo in ogni sequenza) è l'opcode MOV che serve a spostare il valore imm32 seguente (4 caratteri di parte della stringa) in un colpo in memoria (essendo coinvolto il registro esp questo avviene durante il passaggio dei parametri prima della chiamata di una funzione)

In particolare

C7 44 24 0C [50 72 6F 76]    mov dword ptr [esp+0x0C],0x766F7250 (vorP)
C7 44 24 10 [65 74 74 61]    mov dword ptr [esp+0x10],0x61757565 (atte)

passa Provetta nello stack per essere usato dalla funzione successiva e lo fa più volte come se fosse chiamata una funzione con

funz("Provetta", "Provetta" ... )

o qualcosa di simile.

Se posti l'eseguibile si può vedere meglio (ancora meglio con il sorgente e le relative corrispondenze)




Ultima modifica effettuata da il 04/01/2024 alle 7:41
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1371
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 12:16
Giovedì, 04/01/2024
Grazie nessuno, hai evidenziato anche la mia imprecisone, sposta le Dword, non le Word.

@AldoBaldo
Ti ho chiesto forse troppo velatamente: perché gli uint64_t?
Vuoi nascondere il nome delle password sul sorgente?
Perché come hai visto nell'eseguibile i nomi sono comunque visibili e comunque al primo cambio quello che era scritto sul sorgente è ininfluente.

Con questo codice per creare programma.exe tutti i problemi scompaiono:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdint.h>
  5.  
  6. #define kVar1 "Provetta"
  7. #define kVar2 "@perol\0\0"
  8.  
  9. int main() {
  10.  
  11.     printf ("%s\n%s", kVar1, kVar2);
  12.  
  13.     while( '\n'!=getchar() );
  14.     return 0;
  15. }


La ricerca del seek funzionerà anche a 32bit, e la modifica dell'eseguibile avverrà con successo.

Ultima modifica effettuata da Carlo il 04/01/2024 alle 22:12


in programmazione tutto è permesso
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 708
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 23:46
Giovedì, 04/01/2024
Grazie a entrambi, anche se non sono in grado di comprendere a fondo l'aspetto tecnico di quel che mi avete spiegato (credo di intuirne i fondamenti, ma non le ricadute concrete, operative), ho compreso di essere in un vicolo cieco dal quale mi conviene uscire retrocedendo verso la parte dalla quale sono entrato. :)

Volendo fare meno il raffinato: abbandono quest'idea e mi limito a inserire nel codice un file nel quale raccogliere tutte le impostazioni che potrei un domani voler cambiare. A quel punto, cambiate le impostazioni, posso ricompilare il programmino in una manciata di secondi. Per le mie finalità posso accontentarmi.

Ah, per il fatto che le password sarebbero comunque visibili ho già trovato una soluzione che, sempre per il campo di applicazione che ho in mente, può andar benissimo: maschero i caratteri con un banalissimo xor contro 0xff e chi si è visto, si è visto, tanto nessuno andrà mai a cercarli.

Mi è invece venuta in mente una caratteristica interessante che intendo inserire: il programma funzionerà solo dalle ore x alle ore y di certi giorni predeterminati della settimana: quelli nei quali ho lezione io e non qualche collega. Inoltre, il programma si chiuderà automaticamente all'ora prestabilita, anche se dovessi dimenticarlo aperto. Bon, direi che più di così si entra nel campo della paranoia! ;)

Grazie davvero, questo forum è ormai semideserto, ma i pochi superstiti sono persone apprezzabili assai, e spero che le cose non cambino.

EDIT: Appena avrò terminato il tutto, per correttezza verso di voi metterò il sorgente su questo thread, così avrete qualche motivo più che valido per farvi una risata. :heehee:

Ultima modifica effettuata da AldoBaldo il 04/01/2024 alle 23:51


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 708
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 23:49
Giovedì, 04/01/2024
Testo quotato

Postato originariamente da Carlo:

Ti ho chiesto forse troppo velatamente: perché gli uint64_t?
Vuoi nascondere il nome delle password sul sorgente?
Perché come hai visto nell'eseguibile i nomi sono comunque visibili e comunque al primo cambio quello che era scritto sul sorgente è ininfluente.



Sì, in origine avevo quello in mente. Mi auto-dedico un'icona animata: :pat:


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1371
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 17:16
Venerdì, 05/01/2024
Testo quotato

Postato originariamente da nessuno:

In particolare

C7 44 24 0C [50 72 6F 76]    mov dword ptr [esp+0x0C],0x766F7250 (vorP)
C7 44 24 10 [65 74 74 61]    mov dword ptr [esp+0x10],0x61757565 (atte)

passa Provetta nello stack per essere usato dalla funzione successiva e lo fa più volte come se fosse chiamata una funzione con

funz("Provetta", "Provetta" ... )

o qualcosa di simile.

Se posti l'eseguibile si può vedere meglio (ancora meglio con il sorgente e le relative corrispondenze)



Penso che sia il risultato compilato di:
printf( "0x%016llx   %19lld   %s\n", kVar1, kVar1, p );
kVar1 dichiarato come costante uint64_t, viene diviso in Dword perché non è spostabile in un colpo solo a 32bit mov dword.
const uint64_t kVar1 = 0x61747465766f7250; // "Provetta"
lo stesso succede per p

il sorgente completo era:
Codice sorgente - presumibilmente C++

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdint.h>
  4.  
  5. const uint64_t kVar1 = 0x61747465766f7250; // "Provetta"
  6. const uint64_t kVar2 = 0x00006c6f72657040; // "@perol"
  7.  
  8.  
  9. char *rovescia_8( uint64_t n ) {
  10.     static char buff[16] = {0};
  11.     memcpy( buff, (void*)&n, 8 );
  12.     return buff;
  13. }
  14.  
  15. int main() {
  16.    char *p;
  17.  
  18.    p = rovescia_8( kVar1 );
  19.    printf( "0x%016llx   %19lld   %s\n", kVar1, kVar1, p );
  20.  
  21.    p = rovescia_8( kVar2 );
  22.    printf( "0x%016llx   %19lld   %s\n", kVar2, kVar2, p );
  23.  
  24.     while( '\n'!=getchar() );
  25.     return 0;
  26. }



la porzione di eseguibile vista nell'HexEditor, il primo mov dword dovrebbe essere a 0x00001577:
Codice sorgente - presumibilmente Plain Text

  1. 0x00001550   40 00 90 90 FF 25 F4 70 40 00 90 90 66 90 66 90
  2. 0x00001560   55 89 E5 53 83 E4 F0 83 EC 20 E8 31 F8 FF FF C7
  3. 0x00001570   44 24 14 20 60 40 00 C7 44 24 0C 50 72 6F 76 C7
  4. 0x00001580   44 24 10 65 74 74 61 C7 44 24 04 50 72 6F 76 C7
  5. 0x00001590   44 24 08 65 74 74 61 C7 04 24 48 40 40 00 C7 05
  6. 0x000015A0   20 60 40 00 50 72 6F 76 C7 05 24 60 40 00 65 74
  7. 0x000015B0   74 61 E8 59 F2 FF FF C7 44 24 14 20 60 40 00 C7
  8. 0x000015C0   44 24 0C 40 70 65 72 C7 44 24 10 6F 6C 00 00 C7
  9. 0x000015D0   44 24 04 40 70 65 72 C7 44 24 08 6F 6C 00 00 C7
  10. 0x000015E0   04 24 48 40 40 00 C7 05 20 60 40 00 40 70 65 72
  11. 0x000015F0   C7 05 24 60 40 00 6F 6C 00 00 E8 11 F2 FF FF 8B
  12. 0x00001600   1D 64 71 40 00 EB 18 8D B4 26 00 00 00 00 66 90
  13. 0x00001610   8B 03 8D 50 01 89 13 0F B6 00 83 F8 0A 74 13 83
  14. 0x00001620   6B 04 01 79 EB 89 1C 24 E8 8F FE FF FF 83 F8 0A
  15. 0x00001630   75 ED 8B 5D FC 31 C0 C9 C3 90 90 90 90 90 90 90
  16. 0x00001640   E9 EB F0 FF FF 90 90 90 90 90 90 90 90 90 90 90


Lo stesso succede per: @perol a 0x000015BF
allegata l'immagine comprensiva dei caratteri.


Carlo ha allegato un file: provetta.jpg (72437 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da Carlo il 06/01/2024 alle 3:47


in programmazione tutto è permesso
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1371
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 18:19
Venerdì, 05/01/2024
Testo quotato

Postato originariamente da AldoBaldo:
Sì, in origine avevo quello in mente. Mi auto-dedico un'icona animata: :pat:



Credo che sia sufficiente inframezzare con dei caratteri monnezza le stringhe:

Codice sorgente - presumibilmente C/C++

  1. #define kVar1 "APBrCoDvEeFtGtHa"
  2. #define kVar2 "A@BpCeDrEoFlG\0H\0"



Quando leggi le stringhe per estrarre le password usi solo i caratteri in posizione pari.
Il programma di ricerca deve conoscere i caratteri monnezza in queso caso: A B C D E F G H e cercare solo quelli in modo che funzioni con tutte le password, altrimenti funzionerebbe solo se le password non sono state cambiate.

Ultima modifica effettuata da Carlo il 05/01/2024 alle 18:27


in programmazione tutto è permesso
PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo