|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
anti-API monitor: si può?
non so se avete presente quei programmi tipo APIMon del PSDK di Microsoft, che servono a loggare tutte le chiamate API effettuate da un programma monitorato; quei programmi si basano sulla tecnica dei trampolines, che trovate egregiamente implementata nelle librerie Detours di Microsoft Research (una delle poche cose che zio Bill ci concede gratis), oppure su una tecnica simile ma più semplice che consiste nel piazzare/rimuovere dinamicamente il JMP incondizionato all'inizio del codice target secondo le necessità (ora scusate se non entro molto in dettaglio, ma l'ora...
![]() ora mi chiedevo se fosse possibile realizzare un sistema che impedisse il monitoraggio delle chiamate a una certa funzione, partendo dal presupposto che un ipotetico monitor abbia installato una istruzione JMP near assoluta ai primi 5 bytes del codice della funzione monitorata. l'idea che avevo avuto io si basa sul fatto che le API di Windows, che come convenzione di chiamata usano una macro definita come __stdcall, iniziano tutte con gli stessi primi 3 bytes: Codice:
PUSH EBP MOV EBP,ESP esiti di questo genere a me andrebbero benissimo, potrei dire di aver ideato il mio sistema "anti - API monitor", ma ho un banale problema di implementazione C: io avevo dichiarato lo stub come segue: Codice:
typedef DWORD (WINAPI *APIFUNC)(); __declspec(naked) DWORD WINAPI Stub(APIFUNC pfn) { __asm { pop eax add eax,3 push ebp mov ebp,esp jmp eax } } fin qui ok, ma il problema sorge proprio quando devo chiamare lo stub; come faccio banalmente in C a fare il push dei parametri della funzione API? in un primo momento mi era venuto spontaneo di scrivere erroneamente così: Codice:
Stub(GetMessage(&msg, NULL, 0, 0)); // esempio di chiamata a GetMessage - i push dei parametri della funzione API - il push dell'indirizzo finale della API (e questo mi crea un altro problema meno banale che espongo di seguito) - il call allo stub piuttosto che alla API il problema meno banale di cui sopra è che l'indirizzo che il compilatore usa per generare il CALL alla funzione API non sempre corrisponde all'indirizzo effettivo dell'inizio del codice della funzione, anzi, non ci corrisponde quasi mai: nella maggior parte dei casi i compilatori (non chiedetemi perché, perché non l'ho mai capito) generano un CALL ad una entry in una tabella di JMP che a loro volta rimandano alle rispettive "funzioni target"; quindi al problema della chiamata della funzione API aggiungiamoci anche il fatto che dovrei fare questa "indirezione" per così dire... anybody got some good idea? ![]() buona notte ![]() ![]() |
![]() |
![]() |
![]() |
#2 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
![]() |
![]() |
![]() |
#3 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
up!
non dovrò mica uppare per tutta la settimana...? ![]() |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Se stub fosse una funzione a parametri variabili (attenzione che dovresti descrivere anche i parametri)...potresti passare i parametri direttamente a Stub e fare il push dei parametri all'interno di Stub... Un po' come si fa con la printf...
|
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
ci avevo pensato, ma mi sa che se uso l'ellissi il compilatore mi costringe a usare __cdecl come convenzione di chiamata per Stub...
![]() a me serve necessariamente __stdcall, cioè mi serve la stessa della funzione da chiamare, altrimenti poi quando la funzione fa il suo RET mi ripulisce lo stack, dopodiché quando esco da Stub il caller tenta di fare un'altra pulizia... |
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
ultimi aggiornamenti: se uso l'ellissi posso anche specificare __stcall come convenzione, ma il compilatore ignora e usa __cdecl.
inoltre il codice dello stub era errato; questo sarebbe quello giusto: Codice:
__declspec(naked) DWORD WINAPI Stub(APIFUNC pfn) { __asm { pop ecx pop eax push ecx add eax,5 mov eax,eax push ebp mov ebp,esp jmp eax } } ![]() inoltre ho scoperto che per qualche oscuro motivo le funzioni API non iniziano con il push di ebp, ma con una inutilissima mov eax,eax... di conseguenza il codice che posso skippare viene portato a 5 bytes, e questa cosa mi cade a pennello perché così salto l'intero jmp ad una ipotetica routine di intercettazione ![]() il codice viene eseguito normalmente e il log non avviene ![]() sarebbe bello trovare una soluzione al mio problema: avrei progettato un anti-API monitor niente male ![]() ![]() dovrei solo avere l'accortezza di usare lo stub solo per le API che effettivamente iniziano con quei 5 bytes: penso che siano la maggior parte, ma se così non fosse posso sempre creare un altro stub, o altri 2. |
![]() |
![]() |
![]() |
#7 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
hmmm... forse ci sono: si tratterebbe di una soluzione che va bene solo nel mio caso, ma che risolverebbe contemporaneamente entrambi i miei problemi.
va bene solo nel mio caso perché la soluzione va applicata prima della rilocazione del modulo su cui sto lavorando, e non sono sicuro che possa funzionare, ma proverò e tra qualche gg farò sapere. nel frattempo se avete altre idee proponete plz thx ![]() |
![]() |
![]() |
![]() |
#8 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
niente da fare, quello che avevo pensato non si può fare.
il fatto è che una soluzione potrebbe essere quella di utilizzare lo Stub con un cast, ma vorrei evitare di fare un cast per ogni funzione API che uso ![]() mi serve una soluzione più comoda ![]() |
![]() |
![]() |
![]() |
#9 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
ehm, ma perché in questo thread parlo solo io?
![]() forse il primo post era troppo lungo da leggere? ![]() comunque stavolta penso di aver realmente trovato la soluzione; prima provo ad applicarla e poi la posto, per chi interessasse (pochini vedo... ![]() |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Io ti leggo con interesse, anche se personalmente non perderei tempo su queste cose...
![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#11 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
non andiamo affatto d'accordo allora!!! ![]() a me questa cosa piace un sacco ![]() |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Una protezione, per quanto ben congegnata, prima o poi verrà scardinata.
A meno di roba come Palladium, ma in questo caso non avresti comunque bisogno di proteggere il tuo software... ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
![]() ciao ![]() |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Non vedo cosa ci sia di male in questa "filosofia": io la apprezzo particolarmente, specialmente in certi contesti.
![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
ciao ![]() |
|
![]() |
![]() |
![]() |
#16 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#17 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() e non mi venire a dire che allora è la prima: sono fierissimo del software che sto scrivendo!!! ![]() mi affascinano molto le problematiche che sto affrontando e sono molto appassionato al lato tecnico del mio lavoro ![]() |
|
![]() |
![]() |
![]() |
#18 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
dicono che in questi casi il modo migliore di agire non sia quello di bloccare dopo N giorni, ma di togliere del tutto il codice per abilitare determinate funzionalità; non credere che questo rappresenti un problema per un vero cracker: non ci si mette nulla a creare un crack che, una volta avviato il tuo programma ed entratoci con la solita CreateRemoteThread, risponda al comando Save nel quale con una compilazione condizionale tu avevi disabilitato la finestrella "Save as...". ancora potresti rispondermi che l'autore potrebbe togliere non semplicemente la visualizzazione della finestra, ma l'intero codice per il salvataggio, o di qualche altra funzionalità: nei casi in cui la quantità di codice che il cracker deve "reinserire" diventi eccessiva, si può fare in due modi: 1) il cracker "reinventa" il codice (nel caso del comando Save inventa un suo formato; nel caso specifico questo implica che debba essere riprogrammato anche il comando Open e simili); oppure, soluzione spesso più semplice: 2) il cracker preleva il codice mancante da una versione completa del software. in poche parole quello che voglio dire è che un cracker si può trovare di fronte a problemi più difficili, come ad es. il non conoscere l'esistenza di un simpatico stub che impedisce il monitoraggio dele chiamate API ![]() esistono anche cose più perfide: tempo fa mi è stata insegnata una tecnica interessante che devo ancora capire bene a fondo: la perturbazione dello stack; ti dico solo che rende semplicemente impossibile il debugging del programma in ring 3... Ultima modifica di 71104 : 18-08-2005 alle 21:26. |
|
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
ciao ![]() |
|
![]() |
![]() |
![]() |
#20 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:01.