Dab*_*ppe 4 assembly disassembly
我从一些软件中提取了这段汇编代码,但遗憾的是我对汇编程序一无所知,而且我触及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
Run Code Online (Sandbox Code Playgroud)
Joh*_*ler 18
这设置了一个堆栈帧,为局部变量分配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)
Run Code Online (Sandbox Code Playgroud)
这是将ebx设置为指向代码的汇编技巧,完成此操作时ebx包含00000c8d.
00000c88 calll 0x00000c8d
00000c8d popl %ebx
Run Code Online (Sandbox Code Playgroud)
这个位确保该函数只运行一次,如果你第二次调用它只是跳到最后(jel 0x00000d47)
00000c8e cmpb $-[ObjSample delegate],_bDoOnce.26952-0xc8d(%ebx)
00000c95 jel 0x00000d47
00000c9b movb $-[ObjSample delegate],_bDoOnce.26952-0xc8d(%ebx)
Run Code Online (Sandbox Code Playgroud)
该位将相对于ebx的值复制到本地(堆栈)变量空间,请记住ebx指向当前函数,但是ebx的偏移量非常大.很可能这是代码中嵌入的常量数据,它们被设置为调用函数的参数.
00000ca2 movl 0x7dc0-0xc8d(%ebx),%eax
00000ca8 movl %eax,0x04(%esp)
00000cac movl 0x7df4-0xc8d(%ebx),%eax
00000cb2 movl %eax,(%esp)
Run Code Online (Sandbox Code Playgroud)
调用该函数.
00000cb5 calll _objc_msgSend
Run Code Online (Sandbox Code Playgroud)
更多的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)
Run Code Online (Sandbox Code Playgroud)
为函数调用在堆栈上推送更多值,这次一个值是相对于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
Run Code Online (Sandbox Code Playgroud)
从该调用中获取返回值,将其加倍并将malloc大量内存.
00000ce4 leal (%eax,%eax),%edi
00000ce7 movl %edi,(%esp)
00000cea calll _malloc
Run Code Online (Sandbox Code Playgroud)
使用[ObjSample委托]中找到的字节填充内存
00000cef movl %eax,%esi
00000cf1 movl %edi,0x08(%esp)
00000cf5 movl $-[ObjSample delegate],0x04(%esp)
00000cfd movl %eax,(%esp)
00000d00 calll _memset
Run Code Online (Sandbox Code Playgroud)
发送另一个消息,这个带参数: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
Run Code Online (Sandbox Code Playgroud)
清除edx并将sendmessage调用的返回值保存到edi中.
00000d2a xorl %edx,%edx
00000d2c movl %edi,%eax
Run Code Online (Sandbox Code Playgroud)
eax >> 3那么while (edx < eax) ++edx; 这没有多大意义.
00000d2e shrl $0x03,%eax
00000d31 jmp 0x00000d34
00000d33 incl %edx
00000d34 cmpl %edx,%eax
00000d36 ja 0x00000d33
Run Code Online (Sandbox Code Playgroud)
释放mallocd记忆
00000d38 movl %esi,(%esp)
00000d3b calll _free
Run Code Online (Sandbox Code Playgroud)
将_isAuthenticated设置为true,同时将返回值设置为true.此变量似乎在代码中,或者可能是全局变量.
00000d40 movb $0x01,_isAuthenticated-0xc8d(%ebx)
00000d47 movzbl _isAuthenticated-0xc8d(%ebx),%eax
Run Code Online (Sandbox Code Playgroud)
恢复寄存器并返回.
00000d4e movl 0xf4(%ebp),%ebx
00000d51 movl 0xf8(%ebp),%esi
00000d54 movl 0xfc(%ebp),%edi
00000d57 leave
00000d58 ret
Run Code Online (Sandbox Code Playgroud)
Giu*_*ini 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;
}
Run Code Online (Sandbox Code Playgroud)
嗯...没有足够的信息来弄清楚究竟是什么(不是说我可能做错了;))程序包含太多"some_data",而循环的空白似乎只是为了消耗CPU.嗯......它是由gnu objectiveC编译的函数吗?
对不起,我试过了,但我不能说更有用.无论如何,我希望它可以帮助你.问候
| 归档时间: |
|
| 查看次数: |
3244 次 |
| 最近记录: |