Asm-Crackme#1 By Predator [Solved By Whivel]

Stato
Discussione chiusa ad ulteriori risposte.

Predator

Utente Storico
11 Giugno 2007
3,203
47
1,268
900
Vi propongo il mio primo crackme scritto interamente in assembler.

Regole:
-patchando il crackme apparira' la scritta "Good work reverser :)"
-verificare che l'exe sia funzionante

DOWNLOAD:
http://www.nexenteam.net/predator/reversing/crackme/Asm-Crackme1.rar

immagine se crackato correttamente:
Asm-Crackme1.jpg


Predator
 
RE: Asm-Crackme#1 By Predator

io conosco un po assembly e onestamente ultimamente mi andava di imparare un po (se c riesco) il reversing...ora vedo cs combino ma non prometto niente chiaramente!
 
RE: Asm-Crackme#1 By Predator

[ot] ma l'hai scritto interamente in assembly??? anche la parte grafica????[/ot]
 
RE: Asm-Crackme#1 By Predator

bel crackme.... peccato che non ho le conoscenze per farlo in maniera ragionata..... devo andare a tentativi uff
 
RE: Asm-Crackme#1 By Predator

e i tentativi funzionano^^.....
scherzi a parte, sono riuscito più o meno a capire come funzionava il bastardo :ssurdoh: e a capire come effettuare le modifiche che volevo :fattbe:

ah.... cmq per ottenere un risultato simile, ma secondo me sbagliato, basta modificare la stringa "Hey,...." con un hex editor sostituendola con quella da far visualizzare..... :slick1:
 
RE: Asm-Crackme#1 By Predator

Dark_Bunny91 ha detto:
[ot] ma l'hai scritto interamente in assembly??? anche la parte grafica????[/ot]

beh sono semplici risorse quella (file .res)

Cmq nn mi ci metto neppure pred...come hai capito ho troppe altre cose per la testa...ma me lo segno e nn leggo la soluzione in ogni caso complimenti ^^ penso sia bello HARD :ssurdoh:
 
RE: Asm-Crackme#1 By Predator

Dark_Bunny91: si è tutto codato in assembler.

Whievel: tutte le stringhe "Crackme!","Hey, crackme!","Good work reverser :)" sono ovviamente contenute nel crackme.
modificare la scritta "Hey, crackme" (come anche tu evidenzi) è come barare in un software e scrive "ok registrato" ma poi non lo è. Anche se non credo sia possibile perchè "hey, crackme!" è piu' corto di "Good work reverser :)"

come sicuramente sai in assembler le stringhe vengono richiamate con ADDR 'indirizzo della stringa'
pertanto prima della SetDlgItemTextA viene pushato l'indirizzo ma io l'ho fatto calcolato e non costante, per rendere leggermente piu' difficile la cosa,
infatti in primo luogo è "CrackMe", poi quando premi il tasto cambia in "Hey crackme".
trovare l'indirizzo a cui puntano le stringhe è estremamente facile, la difficoltà sta altrove ma te ne accorgerai solo dopo aver salvato il file modificato ed averlo provato :)
cmq il crackme ha una piccola sopresa, che non credo hai ancora scoperto :)

L'assembler è un linguaggio fantastico codice limpido e chiaro, fate conto che ho pure piazzato una icona, ha l'interfaccia grafica ed è solo 6.5 kb, un codice identico scritto in VB (apparte che non sarebbe possibile) sarebbe minimo 45 kb in VC++ 25Kb

Update:
Ctrl_alt_canc: grazie ma penso sia un livello 2 su 10 forse un 3.

con l'assembler puoi scrivere l'interfaccia senza res, in una trentinadi righe di codice.

Giusto per dare maggiore risposta a ctrl e bunny il codice seguente genera una semplice finestra
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
hInst,NULL
mov hwnd,eax
invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret
 
RE: Asm-Crackme#1 By Predator

Predator ha detto:
[...]Anche se non credo sia possibile perchè "hey, crackme!" è piu' corto di "Good work reverser :)"
a essere possibile lo è.... perchè le funzioni api considerano la fine della stringa con il valore ascii 00.....
in quel caso basta sovrascrivere anche la stringa successiva, che diventa inutile..... ma, siamo daccordo, che è barare..... (l'ho provato però lol)

Predator ha detto:
[...]
trovare l'indirizzo a cui puntano le stringhe è estremamente facile, la difficoltà sta altrove ma te ne accorgerai solo dopo aver salvato il file modificato ed averlo provato :)
cmq il crackme l'ho già risolto LOL, quindi già ho visto le problematiche (anche se non so bene come funziona, ma non sono andato a fondo della cosa) e ho capito come superarle..... ah, ho reso fisso il push dell'indirizzo della stringa (nel senso che il push ha il valore diretto, senza add, ecc)

Predator ha detto:
cmq il crackme ha una piccola sopresa, che non credo hai ancora scoperto :)
non so devo vedere

Predator ha detto:
L'assembler è un linguaggio fantastico codice limpido e chiaro, fate conto che ho pure piazzato una icona, ha l'interfaccia grafica ed è solo 6.5 kb, un codice identico scritto in VB (apparte che non sarebbe possibile) sarebbe minimo 45 kb in VC++ 25Kb

Update:
Ctrl_alt_canc: con l'assembler puoi scrivere l'interfaccia senza res, in una decina di righe di codice.
ma credo sia un livello 2 su 10 forse un 3.


sono completamente daccordo..... solo che non si possono programmare tutti i programmi in assemby :moluvid:....
 
RE: Asm-Crackme#1 By Predator

Wow Whievel, allora forse hai già capito piu' di quello che pensavo.
il push fisso va benissimo rientra pienamente nelle rulez :)
 
RE: Asm-Crackme#1 By Predator

^^ spero che sia così.... cmq la piccola sorpesa non credo di riuscire a trovarla, l'ho analizzato pure con un hexeditor...... vabbè.....

prometto che domani inzio il tutorial per questo crackme se riesco anche per quell'altro (dovrei finire anche quello vecchio, ma quello se ho tempo)

PS: Whivel è senza la 'e' (non è Whievel) lol
 
RE: Asm-Crackme#1 By Predator

con l'assembler puoi scrivere l'interfaccia senza res, in una trentinadi righe di codice.

Giusto per dare maggiore risposta a ctrl e bunny il codice seguente genera una semplice finestra
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
hInst,NULL
mov hwnd,eax
invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret

fico!!! mi mancava ^^ :ssurdoh:
 
RE: Asm-Crackme#1 By Predator

si tratta semplicemente di chiamare le API di windows singolarmente, invece di usare quelle predefinite che fanno tutto insieme
 
RE: Asm-Crackme#1 By Predator

Giusto Whivel, volendo programmare ancora piu' a basso livello si puo' fare a meno di chiamare nessuna api e riprodurle, ma la loro chiamata è talmente veloce che non ne vale la pena, sopratutto perchè è solo durante l'inizilizzazione del programma.

ctrl ovviamente se compili quel pezzo di codice non otterrai nulla, devi scrivere lo scheletro del programma
.cpu
.option
.data
.data?
.code
start:
end start:

Preddy
 
RE: Asm-Crackme#1 By Predator

si vabbè :cijeludic: vabbene che sono distratto ( e infatti ci ho provato e nn è andato :ipezziassurdi:) ma poi ho capito :fattbe:
 
RE: Asm-Crackme#1 By Predator

hehehe ctrl non è che sei distratto, di programmazione assembler non sai proprio nulla ammettilo :tongue1:
un niubbo assoluto di programmazione assembler, un programmatore che sa fare solo un processo vuoto (percio' la cosa piu' misera), non potrebbe mai e poi mai pensare che quel codice funziona da solo :grin1:
percio' non si puo' parlare di distrazione ma di assoluta oscurità del linguaggio.
 
RE: Asm-Crackme#1 By Predator

Predator ha detto:
hehehe ctrl non è che sei distratto, di programmazione assembler non sai proprio nulla ammettilo :tongue1:
un niubbo assoluto di programmazione assembler, un programmatore che sa fare solo un processo vuoto (percio' la cosa piu' misera), non potrebbe mai e poi mai pensare che quel codice funziona da solo :grin1:
percio' non si puo' parlare di distrazione ma di assoluta oscurità del linguaggio.

si,nn so nulla di programmazione assembler,ma nel tuo forum c'era un articolo sulle messagebox postato da evolution,ho collegato le 2 cose (cioè pkè diamine non funzionava il tuo codice) e ho aggiunto quel che mancava...

.486
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

e tt le sezioni che hai elencato te (mettendo il codice al posto giusto)


ecco come viene
 
RE: Asm-Crackme#1 By Predator

bene, come promesso http://whivel.altervista.org/tutorial/

dovrei inziare a fare quello per Dark Graveyard Crackme V 7.0, ma adesso non ce la faccio.....

ah, dovete modificare il titolo dei topi con [solved by whivel].....
lo so sono molto modesto ^^
 
RE: Asm-Crackme#1 By Predator

Complimenti Whivel l'hai risolto!ho seguito tutti i passi del suo tutorial e funziona e non c'è scritto nulla di errato in esso!Sei un grande!
 
RE: Asm-Crackme#1 By Predator

bohh l'ho guardato dopo pranzo (senza guardare il tutorial di whivel) ma a me sembra molto ma molto più facile degli altri in VB; come hai detto tu il codice è molto chiaro e limpido, e comprensibile :p
credo di essere piu o meno al 90% direi.. e gia sto preparando una contro sorpresina, non ho ancora provato a patchare e verificare ma c'è solo una funzione dove mettere brutte sorprese :) :p
 
RE: Asm-Crackme#1 By Predator

Ctrl: facile fare copia incolla eh? :p
Whivel: complimenti per la soluzione ^^
Chuzz: non è cosi' semplice come appare e spiego di seguito perchè :)

infatti questo crackme è interessante non tanto per la sua difficoltà ma per la tecnica che usa (che finalmente ho imparato bene come funziona) le TLS CallBack, cioè esegue del codice ancora prima che olly lo mostri.
in pratica nelle TLS c'è una parte di codice che decripta le righe del pulsante [CheckMe].
subio dopo esegue un controllo con OutputDebugStringA se è sotto debugger,
se lo è allora salta oltre, se invece non è sotto debug allora verifica se è stato alterato il codice del pulsante, se è stato alterato lo sputtana :)
poi un ciclo cancella il codice della TLS xorandolo fino quasi alla fine.
invece questo pezzo di codice

Codice:

ASSUME FS:NOTHING
MOV EAX,DWORD PTR FS:[30h]
MOV EAX,[EAX+0Ch]
MOV EAX,[EAX+0Ch]
ADD DWORD PTR[EAX+20h],3000h

anche se non centrava molto fa in modo che olly non possa attaccarsi al processo e che LordPe non possa fare il dump.
poi dopo InitCommonControls
c'è una call che decripta il codice della Dialog, che lo decripta eseguendo degli xor con la TLS cancellata
percio' se qualcuno alterava la TLS non avrebbe funzionato.
in questo caso ovviamente trattandosi di piccolo codice è facile ricostruirlo a mano, ma in un programma esteso diventerebbe molto piu' difficile.

se volete vedere la TLS ancora integre fate cosi
andate in olly ->plugins - > NtGlobalFlag -> SET LDR_SHOW_SNAPS
date ok al messaggio e riavviate olly
ora plugins ->NtGlobalFlag -> SetTempBreak on Tls callbacks

bene senza chiudere olly aprite il crackme, se vi da un messaggio che il processo è sospeso, premeteci sopra -> resume process
e vi troverete proprio in cima alle TLS :)
da li potrete vedere cosa fa la vera protezione, una volta raggiunto il primo RET sarete nell'Entry Point.
Percio' modificando il file le TLS Callbacks l'avrebbe identificato e rovinato, Prova Chuzz :)


Per capire bene il funzionamento di quento detto sopra, provate ad aprire con olly l'allegato che ho messo in questo post.
vedrete che il codice eseguira' un messagebox ancora prima che voi lo avviate. In assembler questo ed altro. Fatemi sapere :)
 
l'avevo detto che non avevo le conoscenze per farlo....avevo solo sentitop parlare delle tls, ma non sapevo niente LOL


ora che lo so, sono riuscito a togliere DEL TUTTO la protezione e a far funzionare il prog con solo 3 byte cambiati.
 
Stato
Discussione chiusa ad ulteriori risposte.