首页
社区
课程
招聘
[讨论]ASM2C on Mac OS
发表于: 2011-10-1 10:19 5002

[讨论]ASM2C on Mac OS

2011-10-1 10:19
5002
只是个介绍性的文章,没有涉及该病毒的具体分析。可以不必在乎的略过,作为一个基本积累。

首先还是说需要的工具,一个IDA,足矣。

例子:Mac Defender病毒

Mac Defender程序使用了Cocoa框架,因此,本文的内容也仅适用于Cocoa框架下的程序。Foundation框架下的程序在某些地方有区别。IDA载入病毒样本会停在main()函数中。Objective-C程序是基于对象的,所以入口点和常见的Windows程序还是有一些区别。

NSApplicationMain才是进入Cocoa框架,不过这里是一个指针引用,静态去查找这个指针其实是没有效果的,那么只能才去迂回的方式。好在Mac下面的程序,和加载PDB之后的Windows程序区别不大,这样实际分析起来难度也比较低。

找一些比较容易分析的相关入口就可以分析相关代码的实现了。除此之外,一些窗体,窗体事件也会有对应的Functions,这样分析起来其实难度很低。不过MacDefender病毒没有这些窗体,先找一个简单点的函数实现一下ASM2C。

如图所示,getDownloadedFilePath()函数的反汇编代码。

程序真正的功能是在call $+5之后实现的。getConfigParam是一个我rename过的一个自定义函数,主要用于读取配置文件中的相关信息。直接跟进去看发现程序的传入参数是int型值,返回参数还很长,暂时先不急。回过头来继续看。

继续向下,下面的一个call是_objec_msgSend。这个函数是一个非常重要的函数,一些功能的实现都是通过调用此函数实现的。一个详细的此函数分析可以参见(http://www.friday.com/bbum/2009/12/18/objc_msgsend-part-1-the-road-map/ )。
__text:00002CC3                 lea     edx, (cfstr_App_zip.isa - 2CB6h)[ebx] ; "app.zip"
__text:00002CC9                 mov     [esp+10h], edx
__text:00002CCD                 mov     [esp+0Ch], eax   ;eax是getConfigParam返回值
__text:00002CD1                 mov     eax, ds:(strDownloadedFilePathFormat - 2CB6h)[ebx] ;strDownloadedFilePathFormat是我rename过的,具体内容为@"/Application/%@.%@"
__text:00002CD7                 mov     [esp+8], eax
__text:00002CDB                 mov     eax, ds:(off_543C - 2CB6h)[ebx] ;此处指向stringWithFormat字符串
__text:00002CE1                 mov     [esp+4], eax
__text:00002CE5                 mov     eax, ds:(off_5458 - 2CB6h)[ebx] ;此处指向NSString字符串
__text:00002CEB                 mov     [esp], eax
__text:00002CEE                 call    _objc_msgSend


根据_objec_msgSend的分析,那么这一句应该是:

[NSString stringWithFormat:@"/Application/%@.%@",eax(暂时不清楚), "app.zip"];

再回过头去看一下getConfigParam,只关心返回值,那就从返回值回溯。

这样看上去,这里的内容似乎很难看懂,因为它不像之前getDownloadedFilePath()函数中可以直接看到调用的函数,因为它是对一个对象的操作。其实大致上看懂这个函数可以从两个关键方法上看出来类型:

__text:00002C77                 mov     eax, ds:(off_5444 - 2A80h)[ebx]  ; "componentsSeparatedByString:"

__text:00002C90                 mov     edx, ds:(off_5440 - 2A80h)[ebx]  ; "objectAtIndex:"


第一个参数是将字符串分割成数组的方法,第二个是根据序号从数组中取值。因此,该函数的返回值应该为(NSString *)。

回到getDownloadedFilePath()函数,其实已经没有什么内容了,因为返回了(实在是个简单函数),那么将所有的内容串起来就是:

NSString * getDownloadedFilePath()
{
    NSString* appname = getConfigParam(0);

    return [NSString stringwithFormat:@"/Appliaction/%@.%@",appname,@"app.zip"];
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//