1学到现在都学了一半了,后面都不会分析的很细致,不会关注细节,只会大致把握恶意代码的主要流程,主要做了什么,把握这些就已经是成功分析恶意代码了,不需要每个一个函数都分析到点上,没必要,我们会加快速度
看一下字符串,我觉得最主要的线索就是explorer.exe,想来是要对他进行dll注入,毕竟还有一个lab12-01.dll文件存在
看一下.exe程序
alloca_probe是堆栈保护检查的函数不要管他
动态加载psapi.dll然后得到他的三个函数,跟遍历进程相关函数,想来等下是要查找explorer.exe程序
得到Lab12-01.dll的绝对路径备用
等下就是遍历比较dwProcessId数组,来查找explorer.exe enumprocesses检索每个进程标识符
将取出来的进程标识符穿给sub_401000函数
这一段是得到进程标识符的所以模块句柄,然后检索模块的基本名称,判断是否和explorer.exe相同,是返回1
sub_401000返回1时候会调用openprocess,打开explorer进程,然后结束循环,跳转到loc_40128c,申请内存,然后把lab12-01.dll的绝对路径写进去,接着就是典型的用createremotethread实现dll注入代码,不再赘述
说.exe作用就是恶意代码加载器,把dll加载到explorer进程
现在看看dll文件做了什么
额,dll代码很是简单,一句话,dllmain里面创建一个线程,然后这个线程输出一句话后又创建一个线程,然后这个新线程弹出一个对话框结束,然后原来的线程就睡觉了,睡醒了又重复上面的动作
lab12-02
1看一下字符串,想来是对svchost做手脚了,两个黄色是资源相关字符串,程序存在一个资源节,不过,看起来像乱码,关键两个地方一个svchost一个资源
看代码,注意到程序需要一个我们输入的参数
想得到当前模块的句柄
然后调用sub_40149d函数很简单就是得到svchost的绝对路径C:\Windows\System32\svchost.exe
接着调用sub_40132c函数,函数也很简单就是把资源节数据加载进一个系统分配的内存空间,然后判断头两个字节是不是4dh 5Ah
不是就用sub_401000函数进行解码,然后返回内存地址,看下sub_401000代码不难理解是将数据和参数41h进行异或
接着调用sub_4010EA,参数是上面的内存地址和svchost绝对地址
前面两个memset是对StartupInfo ProcessInformation的初始化,不用管,接着是以挂起状态打开svchost(这是用到进程替换技术了,看到这里应该想到,如果认真看书的话,替换代码肯定是之前解码的资源数据了)
接着是申请内存空间,然后得到线程上下文
得到NtUnmapViewOfSection函数地址
这里读取的是34进程的imagebaseaddress,因为ebx指向进程环境块PEB(新创建就被挂起的情况下),偏移8的地方是imagebaseaddress
注意NtUnmapViewOfSection参数 01000000就是上面read得到的可执行文件起始地址,现在被卸载
申请内存空间,在进程34里面申请,400000开始的地址空间,原来的已经被卸载了 这里的ipaddress由pe的imagebase(E0H+34H偏移处)决定,这个pe就是3b0000开始的原来资源节解密出来的pe文件,大小是(E0h+50h处的imagesize决定)
然后第一个写pe头,从3B0000开始地址数据写到34进程的400000地址,注意这里的400000我们是看不到的,因为,当前ollydbg看的是lab12-02.exe的400000,大小由pe头大小决定sizeofHeaders决定他在偏移E0h+54h处
第二次写.text节区
第三次写.rdata节区
第四次写.data
最后把peb偏移8处的imagebaseaddress的值改为现在的pe文件的imagebase的值也就是偏移E0h+34h处的数据
然后修改context的eax处数据,这里是程序的入口地址,被修改为现在pe的入口地址偏移也就是E0H+28H地方
唤醒程序,这个时候进程已经被替换了
现在看一下这个被写入的代码到底是什么
我们将资源数据保存位二进制文件,然后用winhex打开在用edit modify data xor功能,让数据和41h异或得到正确pe文件,接着用PEView打开查看,程序中读取的就是下面四个数据,还有 就是每个节区头里面的节区大小
至于这个程序做什么,也不难分析,我们之前也分析过类似的了,先设置一个底层钩子,然后钩子函数记录击键数据到practicalmalwareanalysis.log文件,我们看一下实验结果
lab12-03
1本来上句话就结束分析了,没想到lab12-03.exe就是上面的那个提取出来的恶意代码,只能再详细点分析一下呢
看一下字符串,一个.log文件名,好几个[]键盘名称,猜测是击键记录器了(其实早就知道了),都懒得看下导入函数
看一下代码,前面的操作就是隐藏控制台的
然后设置底层钩子,钩子函数是fn,前面还初始化了405350处的数据为 1(memset)
然后就一直循环获取所以窗口的消息,得到WM_QUIT时候结束,取消挂钩
消息类型满足下面两个其中之一就要调用sub_4010c7,否则传递消息给下一个
看一下sub_4017c
首先创建一个文件.log
然后得到文件指针得到指向文件末尾指针
得到当前窗口句柄
然后得到窗口标题,上面两个push也是getwindowtext的参数,得到标题放到buffer
接着写入 [window:buffer(标题)]\n形式字符串
loc_4011AB,写入buffer值,如果buffer在27-40h之前
否则loc_4011D2写入buffer,如果在40-5bh之前
否则依据switch选择相应的跳转写相应的字符到.log文件
程序就是这么简单
lab12-04
1这几个字符串都值得注意
程序的开头一段和lab12-01很类似,不过他是再找winlogon程序而不是lab12-01的explorer,sub_401000功能就是查找winlogon
看关键的字符串比较就知道到底再找什么呢,str1是前面 GetModuleBaseNameA得到的模块基本名称,而str2是dword_403010处字符串,他正是winlogon.exe
接着是调用sub_401174,这个函数做了不少事
第一个是sub_4010fc的提权操作
然后加载sfc_os.dll得到他的2号函数地址,作为后面创建远程线程的线程函数地址.
也就是说强制让winlogon.exe执行SfcTerminateWatcherThread效果就是关闭window文件保护
接着就是为了得到wupdmgr.exe的绝对路径
得到临时文件路径
这是移动wupdmgr.exe到临时目录下的winup.exe
接着调用sub_4011fc就结束呢
sub_4011fc一溜看下来就知道在干什么
先是重新得到wupdmgr.exe的绝对路径(系统目录下),
然后读取资源到内存空间
然后创建新的wupdmgr.exe(原来的文件已经被移走了)
再把资源数据写到这个新的wupdmgr.exe文件
然后winexec,隐藏运行他
现在看看这个新的wupdmgr.exe是做什么
程序不大,他先启动原来的wupdmgr.exe文件,然后下载文件到wupdmgrd.exe这个多了一个d.然后隐藏方式运行他
分析结束