2010-03-11 81 views
4

我從一些軟件中提取了這段彙編代碼,但不幸的是,我不知道彙編程序的任何內容,並且我彙編的那些代碼在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 
+0

什麼是實際問題 - 你丟失了源代碼什麼的? – 2010-03-12 10:52:11

回答

18

這設置一個堆棧幀,爲本地變量分配0x48字節並保存ebx,esi和edi,這是一個非常標準的函數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) 

對於獲取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。這個變量會出現在代碼中,或者可能是全局變量 。

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 
12

辛苦的工作......你的彙編只是例行公事,但它指的是其他子程序和全局或靜態變量,所以我們能做的最好的是具有同等的想法更可讀的語言。但是...讓我們試試! (類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編譯的函數嗎?

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

相關問題