-
-
[讨论]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/ )。
根据_objec_msgSend的分析,那么这一句应该是:
[NSString stringWithFormat:@"/Application/%@.%@",eax(暂时不清楚), "app.zip"];
再回过头去看一下getConfigParam,只关心返回值,那就从返回值回溯。
这样看上去,这里的内容似乎很难看懂,因为它不像之前getDownloadedFilePath()函数中可以直接看到调用的函数,因为它是对一个对象的操作。其实大致上看懂这个函数可以从两个关键方法上看出来类型:
第一个参数是将字符串分割成数组的方法,第二个是根据序号从数组中取值。因此,该函数的返回值应该为(NSString *)。
回到getDownloadedFilePath()函数,其实已经没有什么内容了,因为返回了(实在是个简单函数),那么将所有的内容串起来就是:
首先还是说需要的工具,一个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"]; }
赞赏
他的文章
谁下载
FishSeeWater
winndy
y2k
xIkUg
龙岱客
Skyer
kivens
phoenixkiller
throb
pmma
Anskya
eunt
hldgaofeng
xiangding
笨奔
yijun8354
suddymail
psumtd
foxabu
zhujian
madaxia
newchess
小豆豆
baohongyu
Netangle
MengXP
plusv
小牛
loqich
dmyss
dahubaobao
坏坏abc
mszjllb
taotzu
三寸法师
frozenrain
刘觐肇
hardcode
xiep
ayarei
leisurely
mstwugui
sonnysu
longloo
elfchery
h旋风h
shewey
天行客
BMZYNX
IsBerry
tokiii
邓韬
cooolie
messen
U士回
逆转录酶
雨耕山
松下书童
wmesci
caolinkai
sanshuimen
iamyaoyao
MaYil
phoenixli
Nerin
pushebp
qipaiyouxi
hiwangliu
happyjane
谁下载
FishSeeWater
winndy
y2k
xIkUg
龙岱客
Skyer
kivens
phoenixkiller
throb
pmma
Anskya
eunt
hldgaofeng
xiangding
笨奔
yijun8354
suddymail
psumtd
foxabu
zhujian
madaxia
newchess
小豆豆
baohongyu
Netangle
MengXP
plusv
小牛
loqich
dmyss
dahubaobao
坏坏abc
mszjllb
taotzu
三寸法师
frozenrain
刘觐肇
hardcode
xiep
ayarei
leisurely
mstwugui
sonnysu
longloo
elfchery
h旋风h
shewey
天行客
BMZYNX
IsBerry
tokiii
邓韬
cooolie
messen
U士回
逆转录酶
雨耕山
松下书童
wmesci
caolinkai
sanshuimen
iamyaoyao
MaYil
phoenixli
Nerin
pushebp
qipaiyouxi
hiwangliu
happyjane
谁下载
FishSeeWater
winndy
y2k
xIkUg
龙岱客
Skyer
kivens
phoenixkiller
throb
pmma
Anskya
eunt
hldgaofeng
xiangding
笨奔
yijun8354
suddymail
psumtd
foxabu
zhujian
madaxia
newchess
小豆豆
baohongyu
Netangle
MengXP
plusv
小牛
loqich
dmyss
dahubaobao
坏坏abc
mszjllb
taotzu
三寸法师
frozenrain
刘觐肇
hardcode
xiep
ayarei
leisurely
mstwugui
sonnysu
longloo
elfchery
h旋风h
shewey
天行客
BMZYNX
IsBerry
tokiii
邓韬
cooolie
messen
U士回
逆转录酶
雨耕山
松下书童
wmesci
caolinkai
sanshuimen
iamyaoyao
MaYil
phoenixli
Nerin
pushebp
qipaiyouxi
hiwangliu
happyjane
谁下载
FishSeeWater
winndy
y2k
xIkUg
龙岱客
Skyer
kivens
phoenixkiller
throb
pmma
Anskya
eunt
hldgaofeng
xiangding
笨奔
yijun8354
suddymail
psumtd
foxabu
zhujian
madaxia
newchess
小豆豆
baohongyu
Netangle
MengXP
plusv
小牛
loqich
dmyss
dahubaobao
坏坏abc
mszjllb
taotzu
三寸法师
frozenrain
刘觐肇
hardcode
xiep
ayarei
leisurely
mstwugui
sonnysu
longloo
elfchery
h旋风h
shewey
天行客
BMZYNX
IsBerry
tokiii
邓韬
cooolie
messen
U士回
逆转录酶
雨耕山
松下书童
wmesci
caolinkai
sanshuimen
iamyaoyao
MaYil
phoenixli
Nerin
pushebp
qipaiyouxi
hiwangliu
happyjane
看原图
赞赏
雪币:
留言: