|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jan 2008
Messaggi: 103
|
asm stringhe
Codice:
PUSH 0 PUSH EDX PUSH *indirizzo stringa 1* PUSH 0 CALL MessageBoxW se ho due stringhe invece di una come le mando tutte e due a messagebox ? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12810
|
Dipende dalla convenzione che stai usando.
Ad esempio mi pare che la convenzione C classica sia di passare i parametri sullo stack, quindi dovrai riempire lo stack per quanti sono i parametri della funzione che vai ad invocare. Un'altra convenzione potrebbe essere di passare i parametri sui registri general purpose finché possibile e poi usare lo stack. Dipende dal compilatore e da quale convenzione si sta adottando. http://en.wikipedia.org/wiki/Calling_convention |
![]() |
![]() |
![]() |
#3 | |
Member
Iscritto dal: Nov 2012
Messaggi: 126
|
Quote:
Qualcuno ti saprà dire meglio di sicuro. Ultima modifica di van9 : 28-06-2014 alle 13:37. |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Forse non ho capito ma il problema è che tu vuoi visualizzare due stringhe concatenate con la MessageBox ?
Perché in questo caso non è un problema di come passare i parametri alla funzione (o con quale metodo) ma di concatenare le due stringhe prima in modo da ottenerne una sola e dopo passare l'indirizzo della stringa ottenuta alla MesageBox |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Jan 2008
Messaggi: 103
|
Ho dimenticato di dire, sto usando ollydbg per provare la tecnica del codecave ma c'è poco spazio quindi devo mettere le stringhe sparse qua e là
![]() I parametri passano dall'ultimo al primo come dice van9 |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
I parametri della MessageBox sono
int WINAPI MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType); Quindi puoi visualizzare una stringa come testo e uno come titolo (sono il secondo e il terzo parametro) |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Jan 2008
Messaggi: 103
|
Si quello lo so
![]() Il problema è che nell'exe compilato c'è poco spazio libero quindi per formare una frase devo mettere più stringhe in indirizzi diversi |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Come ti ha detto lorenzo001 devi prima concatenare le stringhe e poi passarle a MessageBox.
Puoi chiamare HeapAlloc per ottenere spazio in memoria a runtime, quindi vi concateni le stringhe attraverso chiamate successive a CopyMemory e poi richiami MessageBox passando l'indirizzo ottenuto da HeapAlloc. |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Jan 2008
Messaggi: 103
|
C'è troppo poco spazio, ho risolto injectando una dll
![]() cmq ho cambiato exe con uno con più spazio per fare qualche prova: Codice:
<$mirc_34.195447> JMP $$2266D8 ; Bottone Timer, jmp al pushad NOP <$mirc_34.2266D8> NOP; Y HALO THAR CAVA DESU~ pushad CALL DWORD PTR DS:[$$227300] ; KERNEL32.GetProcessHeap test eax, eax ; test if eax=0 jz @No mov edx, eax ;MOV EBX,256 PUSH 256 PUSH 8 PUSH edx CALL DWORD PTR DS:[$$2272B4] ; KERNEL32.HeapAlloc test eax, eax ; test if eax=0 jz @No mov ebp, eax push 0xB push @Dest push 256 push ebp call memcpy_s test eax, eax ; test if eax=0 jnz @No ; Zero if successful; an error code on failure. push 0x2 push @Yes push 256 push ebp call memcpy_s test eax, eax ; test if eax=0 jz @Test ; Zero if successful; an error code on failure. jmp @No @Yes: PUSH 0 PUSH @Test1 PUSH @TestYes PUSH 0 CALL 75C2FD1E jmp @Fine @No: PUSH 0 PUSH @Test1 PUSH @TestNo PUSH 0 CALL 75C2FD1E jmp @Fine @Test: PUSH 0 PUSH @Test1 PUSH ebp PUSH 0 CALL 75C2FD1E jmp @Fine2 @Fine2: push edx push 1 push ebp call HeapFree test eax, eax ; test if eax=0 jz @Fine ; If the function succeeds, the return value is nonzero. jmp @No @Fine: popad jmp $$1955AA @Dest: "0123456789\0" @Test1: "Test 1\0" @TestYes: "Yes\0" @TestNo: "No\0" Se al posto di @Yes metto @Test1 mi copia giusto "Tes3456789", poi però crasha comunque ![]() Sto usando mIrc 7.34 per fare prove ![]() |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Forse volevi scrivere "push @TestYes", attualmente stai copiando il codice macchina della routine "Yes" invece della stringa.
Il motivo per cui mettendo @Test1 ti esce quella roba è che memcpy_s non serve per copiare le stringhe, per cui non inserisce automaticamente il terminatore zero binario, devi specificare la lunghezza esatta della stringa più uno (idem quando copi @TestYes). Il motivo per cui crasha sempre è che probabilmente la CALL 75C2FD1E legge la stringa, ma non trovando il terminatore sfora e fa una violazione di accesso alla memoria. Correggi il numero di byte da copiare in accordo con la lunghezza della stringa e vedrai che funziona. |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Jan 2008
Messaggi: 103
|
Oddio ci sono stato ore e non avevo fatto caso a quell'errore enorme con la label
![]() Continua a crashare comunque anche se ho aggiunto un memset e la stringa è così: ![]() |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Hai modificato "push 0x2" prima di "push @TestYes" in "push 0x4"?
|
![]() |
![]() |
![]() |
#13 |
Member
Iscritto dal: Jan 2008
Messaggi: 103
|
il \0 di @Dest c'è ed è quello che conta perchè la string deve finire lì.
lo \0 di @TestYes non lo devo mettere sennò poi MessageBoxA (75C2FD1E) mi tronca la frase li, l'ho seguita con il debugger fa un loop finchè non trova \0 quello che c'è dopo non lo guarda. cmq ho tolto i memcpy_s e fatto andare sia @Yes @No e non danno problemi, ho fatto andare anche @Test passando il puntatore creato con heapalloc senza toccarlo mettendoci qualcosa e va anche cosi, il messagebox è vuoto perchè prima o poi becca conumque un \0 aggiungendo anche solo un memset con \0 va in crash dopo aver chiamato @Test ![]() edit: ho provato a mettere un breakpoint per vedere dove punta ebp, sono andato li, ho modificato a mano aggiungendo del testo poi ho fatto ripartire, facendo così non crasha... crasha solo se uso memset, memcpy o_O Ultima modifica di Q_Q : 02-07-2014 alle 09:44. |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Non ho ben capito su quale istruzione crasha, 75C2FD1E o HeapFree?
|
![]() |
![]() |
![]() |
#15 |
Member
Iscritto dal: Jan 2008
Messaggi: 103
|
Questo non crasha.
http://pastebin.com/qRYtQXbF Se aggiungo memcpy e/o freeheap crasha sempre dopo 75C2FD1E (che sarebbe MessageBoxA) Ultima modifica di Q_Q : 02-07-2014 alle 13:10. |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Ok, ma dove crasha esattamente? Voglio dire, seguendolo con il debugger dov'è che si ferma?
|
![]() |
![]() |
![]() |
#17 |
Member
Iscritto dal: Jan 2008
Messaggi: 103
|
Con freeheap crasha qui:
http://www.japantrip.tk/imgboard/src/1404308633562.jpg senza freeheap fa popad poi torna alla funzione originale di mirc ma poi salta sul kernel dà stack buffer overrun Ultima modifica di Q_Q : 02-07-2014 alle 14:53. |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Credo che tu abbia dimenticato di invertire l'ordine dei parametri nella "call HeapFree", vedi un po'...
|
![]() |
![]() |
![]() |
#19 |
Member
Iscritto dal: Jan 2008
Messaggi: 103
|
![]() Ok ora non crasha più su freeheap, dà solo quel stack buffer overrun quando ritorna alla funzione orignale ![]() |
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Intendi quando passa da FreeHeap al tuo codice, o dal tuo codice al chiamante?
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:19.