Wie kann ich wissen, was das bedeutet?
-
19-09-2019 - |
Frage
Ich habe dieses Stück Code Assembly von einem Stück Software extrahiert, aber leider weiß ich nichts von Assembler und die Bits I von Assembler berührt war mit der 68000 in der Commodore Amiga zurück.
Führung kann mir jemand, wie ich diesen Code verstehen konnte, ohne mich um Assembler von Grund auf zu lernen, oder mich einfach sagen, was es tut?
Gibt es irgendeine Art von „Simulator“ da draußen, dass ich dies auf ausführen kann, um zu sehen, was es tut?
-[ObjSample Param1:andParam2:]:
00000c79 pushl %ebp
00000c7a movl %esp,%ebp
00000c7c subl $0x48,%esp
00000c7f movl %ebx,0xf4(%ebp)
00000c82 movl %esi,0xf8(%ebp)
00000c85 movl %edi,0xfc(%ebp)
00000c88 calll 0x00000c8d
00000c8d popl %ebx
00000c8e cmpb $-[ObjSample delegate],_bDoOnce.26952-0xc8d(%ebx)
00000c95 jel 0x00000d47
00000c9b movb $-[ObjSample delegate],_bDoOnce.26952-0xc8d(%ebx)
00000ca2 movl 0x7dc0-0xc8d(%ebx),%eax
00000ca8 movl %eax,0x04(%esp)
00000cac movl 0x7df4-0xc8d(%ebx),%eax
00000cb2 movl %eax,(%esp)
00000cb5 calll _objc_msgSend
00000cba movl 0x7dbc-0xc8d(%ebx),%edx
00000cc0 movl %edx,0x04(%esp)
00000cc4 movl %eax,(%esp)
00000cc7 calll _objc_msgSend
00000ccc movl %eax,0xe4(%ebp)
00000ccf movl 0x7db8-0xc8d(%ebx),%eax
00000cd5 movl %eax,0x04(%esp)
00000cd9 movl 0xe4(%ebp),%eax
00000cdc movl %eax,(%esp)
00000cdf calll _objc_msgSend
00000ce4 leal (%eax,%eax),%edi
00000ce7 movl %edi,(%esp)
00000cea calll _malloc
00000cef movl %eax,%esi
00000cf1 movl %edi,0x08(%esp)
00000cf5 movl $-[ObjSample delegate],0x04(%esp)
00000cfd movl %eax,(%esp)
00000d00 calll _memset
00000d05 movl $0x00000004,0x10(%esp)
00000d0d movl %edi,0x0c(%esp)
00000d11 movl %esi,0x08(%esp)
00000d15 movl 0x7db4-0xc8d(%ebx),%eax
00000d1b movl %eax,0x04(%esp)
00000d1f movl 0xe4(%ebp),%eax
00000d22 movl %eax,(%esp)
00000d25 calll _objc_msgSend
00000d2a xorl %edx,%edx
00000d2c movl %edi,%eax
00000d2e shrl $0x03,%eax
00000d31 jmp 0x00000d34
00000d33 incl %edx
00000d34 cmpl %edx,%eax
00000d36 ja 0x00000d33
00000d38 movl %esi,(%esp)
00000d3b calll _free
00000d40 movb $0x01,_isAuthenticated-0xc8d(%ebx)
00000d47 movzbl _isAuthenticated-0xc8d(%ebx),%eax
00000d4e movl 0xf4(%ebp),%ebx
00000d51 movl 0xf8(%ebp),%esi
00000d54 movl 0xfc(%ebp),%edi
00000d57 leave
00000d58 ret
Lösung
Dies stellt einen Stapelrahmen, ordnet 0x48 Bytes für lokale Variablen und speichert ab ebx, esi und edi, das ist ein ziemlich Standard-Funktion prolog.
00000c79 pushl %ebp
00000c7a movl %esp,%ebp
00000c7c subl $0x48,%esp
00000c7f movl %ebx,0xf4(%ebp)
00000c82 movl %esi,0xf8(%ebp)
00000c85 movl %edi,0xfc(%ebp)
Dies ist ein Assembler Trick für ebx Satz zu Punkt, um den Code bekommen, wenn dies geschehen ist ebx enthält 00000c8d.
00000c88 calll 0x00000c8d
00000c8d popl %ebx
Dieses Bit stellt sicher, dass die Funktion läuft nur einmal, wenn Sie es ein zweites Mal nennen es einfach springt zum Ende (jel 0x00000d47)
00000c8e cmpb $-[ObjSample delegate],_bDoOnce.26952-0xc8d(%ebx)
00000c95 jel 0x00000d47
00000c9b movb $-[ObjSample delegate],_bDoOnce.26952-0xc8d(%ebx)
Dieses Bit wird Werte in Bezug auf ebx in lokalen (Stack) variable Raum zu kopieren, denken Sie daran, dass EBX auf die aktuelle Funktion zeigt, aber die Versätze von ebx sind recht groß. am wahrscheinlichsten ist diese Konstante Daten im Code Imbeded und sie werden als Argumente sein Setup eine Funktion aufzurufen.
00000ca2 movl 0x7dc0-0xc8d(%ebx),%eax
00000ca8 movl %eax,0x04(%esp)
00000cac movl 0x7df4-0xc8d(%ebx),%eax
00000cb2 movl %eax,(%esp)
rufen Sie die Funktion.
00000cb5 calll _objc_msgSend
mehr contstant Werte auf den Stapel geschoben und einen anderen Anruf an die gleiche Funktion, diesmal der Rückgabewert des Funktionsaufrufs zu einer lokalen Variablen gespeichert: 0xe4 (% EBP)
00000cba movl 0x7dbc-0xc8d(%ebx),%edx
00000cc0 movl %edx,0x04(%esp)
00000cc4 movl %eax,(%esp)
00000cc7 calll _objc_msgSend
00000ccc movl %eax,0xe4(%ebp)
mehr Werte auf dem Stapel für einen Funktionsaufruf geschoben, diesmal ein Wert ist eine Konstante in bezug auf ebx, und der andere Wert ist der Rückgabewert von dem vorherigen Anruf.
00000ccf movl 0x7db8-0xc8d(%ebx),%eax
00000cd5 movl %eax,0x04(%esp)
00000cd9 movl 0xe4(%ebp),%eax
00000cdc movl %eax,(%esp)
00000cdf calll _objc_msgSend
nehmen Sie den Rückgabewert von diesem Anruf, verdoppeln und malloc so viel Speicher.
00000ce4 leal (%eax,%eax),%edi
00000ce7 movl %edi,(%esp)
00000cea calll _malloc
füllen Sie den Speicher mit dem Byte an gefunden [ObjSample Delegierten]
00000cef movl %eax,%esi
00000cf1 movl %edi,0x08(%esp)
00000cf5 movl $-[ObjSample delegate],0x04(%esp)
00000cfd movl %eax,(%esp)
00000d00 calll _memset
Noch eine Nachricht senden, diesmal unter Argumenten: 0xe4 (% EBP), konstant von EBX, mallocd ptr, malloc Größe, 4. Vermutlich sendet diese die Nachricht in unserem malloc'd Puffer, (Der Puffer letztere freigegeben wird, anstatt an den Aufrufer zurückgegeben wird)
00000d05 movl $0x00000004,0x10(%esp)
00000d0d movl %edi,0x0c(%esp)
00000d11 movl %esi,0x08(%esp)
00000d15 movl 0x7db4-0xc8d(%ebx),%eax
00000d1b movl %eax,0x04(%esp)
00000d1f movl 0xe4(%ebp),%eax
00000d22 movl %eax,(%esp)
00000d25 calll _objc_msgSend
klar edx und speichert den Rückgabewert aus dem Aufruf von Sendmessage in edi.
00000d2a xorl %edx,%edx
00000d2c movl %edi,%eax
eax >> 3
, dann while (edx < eax) ++edx;
bedeutet dies nicht viel Sinn machen.
00000d2e shrl $0x03,%eax
00000d31 jmp 0x00000d34
00000d33 incl %edx
00000d34 cmpl %edx,%eax
00000d36 ja 0x00000d33
frei den mallocd Speicher
00000d38 movl %esi,(%esp)
00000d3b calll _free
set _isAuthenticated auf true, auch setzen Rückgabewert auf true. diese Variable erscheint im Code oder möglicherweise eine ganze Welt umspannt.
00000d40 movb $0x01,_isAuthenticated-0xc8d(%ebx)
00000d47 movzbl _isAuthenticated-0xc8d(%ebx),%eax
Register und Rückkehr wiederherzustellen.
00000d4e movl 0xf4(%ebp),%ebx
00000d51 movl 0xf8(%ebp),%esi
00000d54 movl 0xfc(%ebp),%edi
00000d57 leave
00000d58 ret
Andere Tipps
Hard Job ... Ihr Assembler ist nur eine Routine, aber es bezieht sich auf andere Subroutinen und globale oder statische Variablen, so dass die besten können wir tun, ist eine Vorstellung davon haben ihr Äquivalent in einem besser lesbaren Sprache. Aber ... Lassen Sie uns versuchen! (C-ähnliche Sprache)
int unknown_function(/* Parameters? */)
{
static char bDoOnce;
static char isAuthenticated;
uint32 tmp1,tmp2,tmp3;
void *p;
int i;
if (bDoOnce == ObjSample_delegate) {
return isAuthenticated;
}
bDoOnce = ObjSample_delegate;
tmp1= objc_msgSend(some_data1, some_data2);
tmp2 = objc_msgSend(tmp1, some_data3);
tmp3 = objc_msgSend(tmp2, some_data4);
p = malloc(tmp3*2);
memset(p, ObjSample_delegate, tmp3*2);
objc_msgSend(tmp2,some_data5,p, tmp3*2,4);
for (i = 0; i < tmp3/4; ++i) {
}
free(p);
isAuthenticated = 1;
return isAuthenticated;
}
Ähm ... nicht genügend Informationen, um herauszufinden, was wirklich vor sich geht (nicht zu sagen, dass ich etwas falsch gemacht haben kann;)) Das Programm enthält zu viele „EINIGE-DATEN“, und die leeren für Zyklus scheint hier nur CPU zu konsumieren. Uhm ... Ist es eine Funktion, zusammengestellt von Gnu ObjectiveC?
Sorry, tryed ich, aber ich kann nicht‘sagen viel nützlicher. Auf jeden Fall hoffe ich, es kann Ihnen helfen. Grüße