恶意代码分析实战Lab09-01.exe

        首先进行查壳,使用peid查询后发现无壳。之后静态分析应该进行查看字符串和导入表,但是这个程序有点大,也都会一步步分析到字符串和导入表,所以这两步跟动静分析一起结合。

IDA打开实验文件,在主函数开始首先看到命令行参数检查:

        在402afd处看到对argc的比较,若参数个数为1则进入左侧执行,否则进入右侧。应注意的是在没有手动增加命令行参数时参数个数为1,就是如下效果:

         所以若在不加参数情况时,会进入左侧执行:调用sub_401000函数:

         进入sub_401000函数查看:

         可以看到在0040101B处调用RegOpenKeyExA打开注册表,若失败则将eax清零;成功的话利用RegQueryValueExA将目标注册表下的Configuration项添加键值,再把eax赋予1。静态分析至此有几个点需要结合动态分析验证:参数判断和打开注册表能够成功。OD中在00402AFD处下断点,F7单步发现会执行00402B03处的调用sub_401000函数操作,因为此时我们未加参数。

         OD中在00402B03处下断点之后直接F8步过:

         观察eax中的值,结合上述的静态分析可知,当eax为0时表示调用RegOpenKeyExA打开注册表失败。再回到静态分析:

         在00402B0A处的比较会进入左侧,调用sub_402410函数。进入sub_402410查看:

         使用GetModuleFileNameA函数获取文件路径,然后使用ShellExecuteA对文件进行操作。此时静态分析也可以看到一些字符串信息,我们再结合OD进行动态分析,在上面的3个API函数调用处设断点:

         在调用ShellExecuteA时可以看到参数"/c del C:\DOCUME~1\jilei\桌面\Lab09-01.exe >> NUL",所以可知 sub_402410函数既是删除自身功能。所以为了继续分析,我们应该增加参数使得执行路径发生变化,使用Strings分析Lab09-01.exe查看字符串,有没有能提供参考的参数可能:

         -in、-cc、-re更像是参数。在OD中添加参数:

         重启程序后在00402AFD处断点观察,eip指向402b1d。说明此时参数个数不是1。

         再回到IDA中分析,402b1d处将命令行参数个数赋给eax,将参数数组赋给ecx。402b23处为指针操作,获取到命令行参数数组中的最后一个元素。

 

         402b2e处调用sub_402510函数,进入该函数分析发现,并没用调用任何函数,大多是一些比较指令,推测是利用算法对参数进行检查。但是在尾部可以发现该函数比较成功则返回1(mov eax,1),失败则返回0(xor eax,eax)。若返回值为0则会调用sub_402410函数,这个函数前面分析过,删除自身;返回值为1进入右侧执行。OD中动态观察sub_402510函数返回值:

         此时eax为0,则说明接下来会执行删除自身操作。同样为了继续分析,patched二进制文件,使得sub_402510函数返回值为1。操作如下:重启程序,单步进入402b2e处的call,双击反汇编处输入mov eax,1回车之后再输入ret,

 

         修改之后右键选择所有修改、点击全部复制。

         然后右键保存文件

        将Lab09-01_patched.exe使用OD打开,不要忘了加参数-in。在00402B38处下断点发现EIP指向00402B3F处。

         再回到IDA中静态分析00402B3F处,00402B3F和00402B42两处是对命令行参数数组的第二个元素的获取为Str1,有两处push字符串操作,随后调用__mbscmp函数进行字符串比较。分析可知应是对参数的比较。若比较成功则进入左侧00402B63处执行。

         OD中动态观察比较结果,此时栈中有两个-in,可以推测是对参数的比较。在00402B61处下断点,观察到程序到00402B63处执行。

         再回到IDA中分析00402B63处,00402B63处判断参数个数是否为3,是则进入左侧,否则进入右侧;00402B9A处判断参数个数是否为4,是则进入右侧,否则进入左侧。结合00402BBD处来看,若参数个数不为3也不为4则进入00402BBD处执行删除自身操作。此时我们的参数只有Lab09-01_patched.exe -in 两个,所以最终会执行到00402BBD处删除自身操作。

         再增加一个参数:

         OD中在00402B67处设置断点,程序到00402B69处执行。

         回到IDA中分析00402B69处。

         看到有一个sub_4025B0函数的调用,跟进:

         尾部可以得知返回值非1既0,在OD观察00402B75处函数返回值,在00402B7F处下断点观察EIP。

         此时EIP指向00402B89处,回到IDA中静态分析00402B89处。

         看到一个调用函数,跟进sub_402600函数分析

         首先看到对sub_4025B0函数的调用,该函数之前分析过,获取文件路径。

         使用OpenSCManagerA函数建立服务控制管理器,接下来利用OpenServiceA打开服务,若服务存在进入左侧调用ChangeServiceConfigA更改服务的配置参数;若服务不存在,调用CreateServiceA函数,此时注意004027EA处参数dwStartType为2,表示该服务为自启动。

         在执行关闭句柄操作后,调用ExpandEnvironmentStringsA 扩展环境变量字符串并将它们替换为为当前用户定义的值。

         调用CopyFileA将现有文件复制到新文件。

         跟进sub_401070函数分析,使用RegSetValueExA函数创建注册表项。

        使用RegSetValueExA函数将edx中的内容填充注册表下Configuration的键值。然后执行完毕。

 

         OD中验证我们的分析,在00402B90处下断点单步步进sub_402600函数。注意 00402805处的CreateServiceA函数,创建的服务名参数ServiceName="Lab09-01_patched.exe"。

       在004028A1处调用CopyFileA函数设置断点,此时根据参数可以看出将Lab09-01_patched.exe复制到C:\WINDOWS\system32\Lab09-01_patched.exe。

       在004028E0处调用sub_401070函数设置断点,单步跟进。在004011A8处调用RegCreateKeyExA函数设置断点,观察到创建的注册表为"SOFTWARE\\Microsoft \\XPS"。在004011D5处调用RegSetValueExA函数设置断点:

        注意参数Buffer,可以看出该值0012c314是一个内存地址,在内存窗口查看该地址 

        内容就是ups.http://www.practicalmalwareanalysis.com.80.60。

        再回到IDA中分析。

         -in aaaa参数的分析至此执行结束,可以分析出在该参数情况下,程序会创建一个与程序名同名的自启动的服务,并且在添加注册表。

        回到IDA中00402B61处继续分析,若此处的字符串比较失败则会进入00402BC7继续对参数进行比较,逻辑关系与00402B3F相同。结合Strings分析出的字符串可以推测,00402BDE处的Str1不是-cc就是-re。接下来的逻辑关系与上述分析大致相同。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值