恶意代码分析实战Lab03——04.exe(详细分析)

第一步:查看程序的基本信息:
查壳:无壳
在这里插入图片描述
查看资源数据:
没有资源数据,暂时可以排除目标程序,通过资源数据来释放恶意的程序。
第二步:使用IDA和OD进行分析:
在使用IDA进行分析的时候,可以先查看一下字符串(在IDA里边看到的字符串数据并不完整,如果要看比较完整的字符串数据,可以通过,Bintext这样的字符串查看工具,但是通过IDA看到的都是一些比较敏感重要的字符串数据):
在这里插入图片描述
之后就通过IDA和OD进行动态分析
,通过IDA定位查看主函数:可以看到是If else 结构的函数,我们先来看一下if结构的语法
在这里插入图片描述
可以看到,先对函数的参数进行判断(这个一会儿详细说),之后执行sub_401000() 这个函数
在这里插入图片描述
通过对这个函数的分析,我们可以知道,只有当系统里边没有或者存在目标的子键或者目标的键值(这里需要注意,在RegOpenKeyEx这个API执行的时候,如果成功返回的是ERROR_Success,这个值对应的是0,而执行失败的时候是非零的错误代码),才会执行 if 语句块,而在实际调试中,也确实系统中没有目标子键或者键值,接下来执行Sub_402410()这个函数
目标子键如下:
在这里插入图片描述
目标键值如下:
在这里插入图片描述
分析Sub_402410()这个函数:
在这里插入图片描述
这个函数的目的,一眼就可以看出来,是在执行自删除的过程,之后退出程序,所以现在整个程序的逻辑,有一点是比较清晰了,那就是检查目标子键或者键值如果没有就自删除退出程序,哪我们接下来采用强行该跳转的方式,来看一下,if语句块中的另一个函数Sub_402360()这个函数的功能(其实这一块也不用强行改跳转,也就是动态调试,直接静态观察反汇编的结果就可以)
函数结构是While()循环结构,先看一下第一个嵌套的if语句的判断条件
在这里插入图片描述
可以看到,只有当第一个if的判断条件为假,才会执行下面的操作(否则这个函数也就直接退出了)
在这里插入图片描述
这个判断函数也还是针对注册表项和键值的一个判断,前边说了,这个函数只有返回值是0的时候才有意义,那也就是说,在这个函数的判断里边,是存在这个目标子键和目标的键值的,但是这个结论又是和主函数的第一个if判断条件相违背的,也就是说这个主程序的主函数的if语句块其实就是一个判断机制,不管前边还是后边的判断机制,其实都是针对于注册表项的,不然的话就只会执行一个操作,那就是自删除.

那么现在,问题来了,怎么让这个程序运行起来呢?
这个就要回到,主程序的第一个if判断条件,在前边也说过这个是对main函数的参数的判断,当参数是1的时候,会一直执行if语句块,所以我们成功启动这个程序的方法就是,输入参数,main函数默认是有一个参数的,这个参数存储着层序的路径,所以刚开始程序的if语句的判断条件应该是该程序是否只有一个参数,如果不是才会执行关键的语句块,而且这个数据是由程序在运行的时候自己统计的(输入几个参数,程序会统计起来,赋值给argc),同时还要注意:argv:为指针数组,分别指向各个字符串参数的首地址,其中argv[0]存储的是可执行文件的文件名的首地址

上边这个要点掌握了之后,我们接下来继续分析进行动态分析,那么随之而来的问题就是,在用OD附加动态调试的时候,怎么给程序输入参数呢?

我采用下边的方式来给我们的程序输入一个参数:
先打开OD,点击文件,打开,选择目标文件的路径之后,在下边的参数一栏填入要输入的参数:
在这里插入图片描述
好,上边这个问题解决了之后,下一个问题又来了,我们要填入什么参数?我们要填入的参数有没有什么要求?
这个要看下边这个函数:Sub_4020510()
通过查看这个If语句的结构,我们同样能够看出,要想让这个程序执行真正核心的内容,if的判断条件必须为假,否则的话就会执行自删除这个现在看来非常鸡肋的操作:
在这里插入图片描述
也就是说 函数 Sub_402510()这个函数的返回值必须为真,顺着这个分析的话,就比较好理解了,接下来我们再来看一下这个函数的内容
在这里插入图片描述
通过,对这个函数的分析,我们能够得出结论来,这个参数应该是"a b c d"分析过程如下图:
在这里插入图片描述
附图说明整个过程:
在这里插入图片描述
这一步执行过去之后,也就是到了关键的真正的代码的部分:
在这里插入图片描述
可以看到,这一部分的代码段也是一个大的 if else 的循环结构,最开始的时候,会对我们之前得到结论的第一个参数进行字符串匹配比较:
在这里插入图片描述
而要比较的字符串,如下:
在这里插入图片描述
看到这里的时候,其实感觉这个程序有点像远控的程序,因为上边这些字符串,看上去像是C2段下发的命令,然后根据命令执行相应的功能,我们可以详细进行一下分析:
而且很明显可以看到,这些命令也还是,通过main函数的参数进行判断的,所以说,还是和上边一样的分析方法,其实这里,不需要参数也完全了以进行分析,可以直接使用该跳转的方式进行分析(因为,这里的代码结构块,可以用switch case 结构来理解,当使用不同的参数的时候,会执行不同的代码块,)
所以,可以直接调试对应的代码块功能:
先看-in代码块的功能:
在这里插入图片描述
对于-in代码段的具体分析如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结一下:-in的命令所对应的代码功能:
1、安装服务,设置自启动
2、将文件自身复制到系统目录
3、设置注册表项
4、修改文件的时间信息
其实,到这里的话,整个文件的执行逻辑已经很明确了,主要的难点就是怎么把这个程序运行起来,至于之后的命令的分析,其实相对也比较简单,这里就只对第一个命令的功能代码进行分析,下面的三个就不做分析。

总结
1、在调试程序的时候,在程序的执行逻辑上,多一点关注
2、在调试程序的过程中,要注意到程序运行参数的重要性
3、放个图,来总结一下,部分文件代码的判断逻辑:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值