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
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top