恶意代码分析实战Lab9
恶意代码分析实战Lab9
Lab9-1
这个程序就是第三章lab03-04那个会删除自身的程序,之前我们没有分析完,现在继续
IDApro打开程序,程序要求参数要大于1,这就说明我们需要输入lab09-01.exe “一些参数"这样的方式才能启动程序,为什么呢,因为如果不跳转,那么下面不管是在jz处是否跳转结果都会跳转到下面这个地方直接结束程序.(未安装时候才是这种情况)
区别就是sub401000在找一个注册表项(实际上我在xp和win7下跟踪发现他永远都是找不到的,也就是返回值永远是0,那么他就会跳转到402B13,再执行402410删除自身)
还记得第三章的分析的话有下面截图,下面的几个参数/c del »null cmd.exe你们都会在402410函数里面找到,也就是说402410将会删除程序自身.
我们要找找到底需要什么参数才能让程序运行,最后一个参数(我们的目标就是知道这个参数是啥)被传给sub_402510函数作为参数,看来需要跟踪进这个函数才能解开秘密
开头这一段是在看参数的字节数是不是4,这个自己体会一下,或者再ollydbg里面跟踪运行一下就知道他在干嘛,经验丰富的话一般会比较快的意识到他在做什么,没经验也不能理解这段代码,好了现在我们知道参数是四个字符
接着往下走,看关键cmp再联系上下文知道比较的双方是什么,你就会很快明白在做什么(这里的a原本是'61h’,被我标记为a了这样比较明了),很明显edx是参数的第一个字节,他在和a比较,那就是说第一个字符是a
接着cmp是ecx和1比较,那么ecx是啥?联系上文你会发现,ecx是参数的第二个字符减去参数的第一个字符的值,也就是说第二个字符是b
做了一系列事还有乘法,其实你会发现她其实就是再看第三个字符c
最后一个字符,很可能就是d了
onlydbg打开
在sub_402510函数调用后f2断点,返回值为1
还没完,接下来下面代码是一样的不过一个是再ollydbg一个是IDApro打开的,你会发现他需要第三个参数-in(安装可能推测),那么没有呢他会怎么办?一路跟踪发现他会考虑是否有参数-in -re -c -cc这是个参数,如果都没有还是会删除自身(这波结论可以很容易得出,自己用ollydbg’或者idapro跟踪一下即明白)
那么有参数-in他会做什么?(很可能安装程序猜测)关键函数他的参数被标记为一个服务名,看看这个函数做什么,他实际上就调用两个函数,再结合实际代码会知道,他是要得到完整路径(getmodulefilename),然后得到文件名Lab09-01.exe(splitpatch)作为服务名返回.
好了,现在得到服务名了,接着做什么?(猜测可能是安装程序为一个服务),看来关键代码再函数402600了
前面一串先不管,没必要陷入细节,我们看到他打开服务控制管理器,然后打开一个服务(服务名就是程序名Lab09-01),成功也就是服务存在那就把他设置成自启动,否则就创建这个服务,并设置为自启动,然后结束,这一波结论的得出其实不难几个关键的函数已经说明问题(如果你熟悉这些函数的话)
注意这里的关键参数dwstarttype
从创建服务的参数我们可以知道,恶意程序被复制到system32目录下了.
还没完,在服务成功注册或者被设置为自启动后,他还会创建一个注册表项(SOFTWARE\Microsoft \XPS)在函数sub_401070里面
并且设置Configuration键值为图中数据区字符串.
补充:这里有个发现比较如果参数个数不是3的话,我们可以指定第四个参数作为服务名字
现在看看命令-re做什么,我们可以看到程序的结构和-in很像,他也可以指定第四个参数作为要删除的服务名称,代码的关键函数调用deleteservice告诉我们他是删除程序自身.
看-c命令,发现他一共需要七个参数,然后调用401070这个函数,这个函数我们之前分析过看看之前对这个函数的调用,我们不难知道-c是对键值configuration的修改操作.
再看看最后的-cc命令,看到这种格式我们很容易联想到输出,实际操作也证明这一点,-cc就是打印configuration这个键值
还没完,如果程序已经安装以服务方式运行,没有那些参数,那么他会运行sub_402360函数,然后依据函数sub_401E60返回的值做相应的操作:SLEEP UPLOAD DOWNLOAD CMD NOTHING这五种操作,所以先看看401E60函数,我们猜测这可能是接受远端发来命令的函数,那么一定有网络相关操作,在函数sub_401AF0里面有一系列网络函数操作,其中调用401640是一系列网络初始操作,再往下会发现send和recv操作,至于上面五种操作具体做什么就不一一具体分析,因为从名字上就可以知道分别是,睡眠,下载文件到本地,读取文件到远端主机,用cmd.exe运行shell命令,和什么都不做
分析一下各个命令参数形式sleep的参数得自strtok第二次分割得到的值也就是说格式为SLEEP time
看UPLOAD的关键函数调用有三个参数,name是主机名(ollydbg可以看到就是http://www.practicalmalwareanalysis.com),文件名和端口是命令指定,格式UPLOAD port filename
DOWNLOAD和UPLOAD很类似就不说了看看CMD,下图是在创建并运行子进程 等同于cmd.exe /c command形式运行cmd,其中arg_0是_popen的参数,所以
还没完,CMD还需要在函数401790里面读取标准输出内容然后从指定端口发送给远端主机
在loc_401B35显示恶意程序最初是构造HTTP/1.0 GET请求,则可以作为网络特征
代码分析到现在,其实已经差不多了,对于恶意代码我们已经基本掌握他的目的功能,实际上我们忽略了一些具体的细节比如对接收到的数据包的具体解析以得到具体命令我们就没有分析,还有一些内存操作也没有具体分析,但是我们发现这并不影响我们了解并掌握这个恶意代码的具体流程,所以这就是为什么我们常说不能迷失在代码中不能过分关注细节,我们的目的很明确就是了解恶意代码的目的和功能,我们要以最有效的手段来达到目的,当代码量很大的时候这点尤为重要,然后就是ollydbg和IDApro的使用,实际上在分析上述代码的时候我少使用ollydbg,基本使用IDApro来完成分析,但是我发现ollydbg必不可少,比如在分析参数name的时候我在IDApro里面找了半天也没有找到证据说这个name就是http://www.practicalmalwareanalysis.com尽管我坚信他就是这个,但是没有证据,然而我用ollydbg却可以轻松的看到name就是这个网址,所以在分析恶意代码时候两者缺一不可,IDApro很强大但是,他毕竟主要是静态分析,有时候很难的静态分析,我们只需要ollydbg就可以很轻松的完成分析,所以如何取舍才能更快的完成分析也很重要.
1.如何让这个恶意代码安装自身?
2.这个恶意代码的命令行选项是什么?它要求的密码是什么?
lab09-01.exe -cc abcd
3.如何利用OllyDbg永久修补这个恶意代码,使其不需要指定的命令行密码?
将sub_402510函数返回修改为1然后patch
4.这个恶意代码基于系统的特征是什么?
从创建服务的参数我们可以知道,恶意程序被复制到system32目录下了.
5.这个恶意代码通过网络命令执行了哪些不同操作?
6.这个恶意代码是否有网络特征?
Lab9-2
1.在二进制文件中,你看到的静态字符串是什么?
2.当你运行这个二进制文件时,会发生什么?
无
3.怎样让恶意代码的攻击负载(payload)获得运行?
ida 查看main函数地址401128
onlydgb ctrl+g跳到main ,f2下断点,f9运行
两段字符串
ida按r转字符查看
getmodulefilename获取当前程序的路径
数据窗口跟随,后f8查看路径
call 401550调用的2个参数在栈空间
ida可用查看到调用的是_strrchr函数(用来查找路径中最后一次出现\的位置,并且返回\位置后的字符,获取应用名称)
函数返回为程序名称
call 4014c0函数2个参数
ida查看这个是_strcmp
字符串不相等则非0
ida分析 je 40124c
不相等则走红色线(退出main)
相等则走绿色
退出main,这是程序退出的原因
要使程序运行将程序名称改为ocl.exe即可
od打开断点运行,判断返回0
程序名改为ocl.exe即可运行
4.在地址Ox00401133处发生了什么?
将值赋值到栈空间
5.传递给子例程(函数)Ox00401089的参数是什么?
onlydbg跳转到这个函数下断点
参数1为1qaz2wsx3edc
参数2暂时无法识别
6.恶意代码使用的域名是什么?
循环
f5可以看到两个参数亦或,应该是解密
动调查看解密后结果,www.practicalmalwareanalysis.com
7.恶意代码使用什么编码函数来混淆域名?
gethostname的参数正式解密出的网址
ida查看gethostname,执行失败则休眠30秒,然后循环
执行成功
htons将主机字节序转换为网络字节序,端口为9999
connect连接主机,参数是网址
使用这里的字符串对加密的域名解密
8.恶意代码在0x0040106E处调用createProcessA函数的意义是什么?
不管connect调用是否成功都会执行sleep
connect成功会调用401000
401000
showwindow修改为0则不弹出窗口
运行程序的是cmd
后面的标准输入和标准错误都绑定了套接字,则都会发送
Lab9-3
1.Lab09-03.exe导入了哪些DLL?
peid查看
ida LoadLibrary查看
dll3.dll
user32.dll
共导入了6个dll
2.DLL1.dll、DLL2.dll、DLL3.dll要求的基地址是多少?
DLL1.dll
DLL2.dll
DLL3.dll
3个基地址相同
3.当使用OllyDbg调试Lab09-03.exe时,为DLLl.dll、DLL2.dll、DLL3.dll分配的基地址是什么?
ollydbg打开后按m查看内存视图
ida找到loadlibrarya然后od跳转
在下面一行下断点
运行后即导入了DLL3.dll然后看m
可以看到DLLl.dll、DLL2.dll、DLL3.dll分配的基地址
4.当Lab09-03.exe调用DLLI.dll中的一个导入函数时,这个导入函数都做了些什么?
print在DLL1.dll里
DLL1.dll使用ida打开
两个参数
第一个参数是字符串
第二个参数在10008030,查看w
GetCurrentProcessId获取当前进程id
5.当Lab09-03.exe调用writeFile函数时,它写入的文件名是什么?
文件句柄
epb+hfile来源于eax
eax是DLL2ReturnJ
分析DLL2.dll
DLL2print
交叉引用
返回打开temp.exe文件的句柄
DLL2ReturnJ
返回temp.txt文件句柄
所以writeFile写入的是temp.txt
6.当Lab09-03.exe使用NetScheduleJobAdd创建一个job时,从哪里获取第二个参数的数据?
MSDN查看NetScheduleJobAdd
NetScheduleJobAdd函数提交一个作业,在指定的时间和日期运行。此函数要求在提交作业的计算机上启动调度服务
0llydbg查看知道第二个参数是local.7那么在上一个call local.4处被作为参数传递,那么很有可能这个参数的值来自这个函数的操作,跟随进函数查看,果然被赋值为DLL3.003FB0A0
分析DLL3.dll
7.在运行或调试Lab09-03.exe时,你会看到Lab09-03.exe打印出三块神秘数据。DLL 1的神秘数据,DLL2的神秘数据,DLL 3的神秘数据分别是什么?
DLL1神秘数据
第一个参数是字符串
第二个参数在10008030,查看w
GetCurrentProcessId获取当前进程id
当前进程id值
DLL2神秘数据
分析DLL2.dll
DLL2print
交叉引用
返回打开temp.exe文件的句柄
DLL3神秘数据
DLL3print
打印的是WideCharStr的数据
交叉引用WideCharStr
MultiByteToWideChar函数
多字节转宽字节形式,要转换的是第3个参数
要转换的是lpMultiByteStr即ping www.malwareanalysisbook.com
DLL3.dll打印的神秘数据是ping www.malwareanalysisbook.com在内存中的地址
8.如何将DLL2.dll加载到IDA Pro中,使得它与OllyDbg 使用的加载地址匹配?
选择手动加载
查看od的dll2.dll基地址
输入od里的dll2.dll基地址,一直ok