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.
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.
Ultima modifica effettuata da Carlo il 03/01/2024 alle 22:35
in programmazione tutto è permesso
()
Newbie
Messaggi: Iscritto:
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)
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++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#define kVar1 "Provetta"
#define kVar2 "@perol\0\0"
int main(){
printf("%s\n%s", kVar1, kVar2);
while('\n'!=getchar());
return0;
}
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
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.
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.
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:
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.
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
Postato originariamente da AldoBaldo: Sì, in origine avevo quello in mente. Mi auto-dedico un'icona animata:
Credo che sia sufficiente inframezzare con dei caratteri monnezza le stringhe:
Codice sorgente - presumibilmente C/C++
#define kVar1 "APBrCoDvEeFtGtHa"
#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