簡體   English   中英

我怎么知道這是做什么的?

[英]How can I know what this does?

我從一些軟件中提取了這段匯編代碼,但遺憾的是我對匯編程序一無所知,而且我觸及Assembler的位在68000的Commodore Amiga中又回來了。

任何人都可以指導我如何理解這些代碼而不需要從頭開始學習匯編程序,或者只是告訴我它的用途是什么?

有什么樣的“模擬器”,我可以運行它看看它做什么?

   -[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

這設置了一個堆棧幀,為局部變量分配0x48字節並保存ebx,esi和edi,這是一個非常標准的函數序言。

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)

這是將ebx設置為指向代碼的匯編技巧,完成此操作時ebx包含00000c8d。

00000c88    calll   0x00000c8d
00000c8d    popl    %ebx

這個位確保該函數只運行一次,如果你第二次調用它只是跳到最后(jel 0x00000d47)

00000c8e    cmpb    $-[ObjSample delegate],_bDoOnce.26952-0xc8d(%ebx)
00000c95    jel 0x00000d47
00000c9b    movb    $-[ObjSample delegate],_bDoOnce.26952-0xc8d(%ebx)

該位將相對於ebx的值復制到本地(堆棧)變量空間,請記住ebx指向當前函數,但是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

更多的contstant值被壓入堆棧並且另一個調用同一個函數,這次函數調用的返回值被保存到局部變量: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)

為函數調用在堆棧上推送更多值,這次一個值是相對於ebx的常量,另一個值是前一次調用的返回值。

00000ccf    movl    0x7db8-0xc8d(%ebx),%eax
00000cd5    movl    %eax,0x04(%esp)
00000cd9    movl    0xe4(%ebp),%eax
00000cdc    movl    %eax,(%esp)
00000cdf    calll   _objc_msgSend

從該調用中獲取返回值,將其加倍並將malloc大量內存。

00000ce4    leal    (%eax,%eax),%edi
00000ce7    movl    %edi,(%esp)
00000cea    calll   _malloc

使用[ObjSample委托]中找到的字節填充內存

00000cef    movl    %eax,%esi
00000cf1    movl    %edi,0x08(%esp)
00000cf5    movl    $-[ObjSample delegate],0x04(%esp)
00000cfd    movl    %eax,(%esp)
00000d00    calll   _memset

發送另一個消息,這個帶參數:0xe4(%ebp),來自ebx的常量,mallocd ptr,malloc大小,4。據推測,這會在malloc緩沖區中發送消息,(緩沖區后者被釋放而不是返回到呼叫者,召集者)

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

清除edx並將sendmessage調用的返回值保存到edi中。

00000d2a    xorl    %edx,%edx
00000d2c    movl    %edi,%eax

eax >> 3 ,然后while (edx < eax) ++edx; 這沒有多大意義。

00000d2e    shrl    $0x03,%eax
00000d31    jmp 0x00000d34
00000d33    incl    %edx
00000d34    cmpl    %edx,%eax
00000d36    ja  0x00000d33

釋放mallocd記憶

00000d38    movl    %esi,(%esp)
00000d3b    calll   _free

將_isAuthenticated設置為true,同時將返回值設置為true。 此變量似乎在代碼中,或者可能是全局變量。

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

艱苦的工作...你的匯編程序只是一個例程,但它指的是其他子程序和全局變量或靜態變量,所以我們所能做的最好就是用更易讀的語言來理解它的等價物。 但是......讓我們試試吧! (C語言)

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;
}

嗯...沒有足夠的信息來弄清楚究竟是什么(不是說我可能做錯了;))程序包含太多“some_data”,而循環的空白似乎只是為了消耗CPU。 嗯......它是由gnu objectiveC編譯的函數嗎?

對不起,我試過了,但我不能說更有用。 無論如何,我希望它可以幫助你。 問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM