程序分析 - task6

程序流程

image-20191104145454111

查看文件区段信息,能够看到有tls段,那说明可能有TLScallback函数,线程回调函数会在线程启动和终止的时候被触发,触发之后根据条件判断是否执行线程回调的代码。

主线程也算线程,所以主线程之前也会触发一次TLS回调函数,多用于反调试反虚拟机,在Linux中是init段,其中存放的地址的函数,会在main之前逐一执行,Windows多用TLS的方式在main之前执行,还可以使用main函数的构建函数,在源码里面加入关键字constructor,同时还有destructor。还有一种方法和构建函数很相似,用于快速函数,在C中全局变量初始化优先于main,所以可以写一个全局变量等于某个快速函数算出来的值,然后在程序运行的时候快速函数中的代码实际上是比main先运行的,这个方式的根本原理还是和构建函数那种一样。


image-20191104150041402

找到TlsCallbacks函数列表,但是其中只有一个函数,IDA已经自动识别出来了叫做TlsCallback_0,通常如果要不让tls线程回调执行回调函数的话直接清空文件区段里TlsCallbacks里面的所有值就好了,不过还是觉得这种方式牺牲较大,直接进去patch文件比较好。

曾经写过一篇如何手工寻找TLScallbacks,所以手动清除也不是很难。这里不用清除,直接先断点放在tls回调函数上就好。


image-20191104150531302

TlsCallback主要做了这两个判断,而且检测点很小,就一个字节,我可以放在第二个字节的断点。

不过实际上我还是把判断给patch掉了让他不退出。。。。


上面执行完之后,没有tlscallback函数就会执行main函数了,首先进入tmainCRTStartup,这个函数在引入了某些库的时候我记得也是可以修改内容的,不过这里看了下是没有修改的。

image-20191104150816575

所以在最末尾的两个exit之前找到main函数(这是比较明显的特征)。


image-20191104151007934

main函数一开始的时候能看到四个函数,4个函数每两个的功能都是一致的,不太清楚为啥,大致是通过VMXh,也就是VMware的一个接口判断是否为VMware,剩下两个函数用__asm { vpcext 7, 0Bh }来判断ViretualPC


image-20191104151329416

接下来会有一个判断,用于判断上面四个函数是否全部通过,并且系统处于开机后的两小时之内。


通过拼接字符串得到(字符串拼接处还有个判断,这个判断多出用到,主要是为了判断系统是32位还是64位)

image-20191104151435687

之后通过函数GetFileAttributesExW,来判断文件是否存在


再往下,如果存在,会通过遍历进程名的方式来判断三个进程是否存在

image-20191104151644555

如果都不存在则进入条件体


循环体一开始就会进入一个函数叫做insert_reg,其主要功能为,查询注册表是否含有自身启动项,如果没有就添加,同时检测注册表是否有自己的信息,没有就添加。

image-20191104151904279


image-20191104151956192

接下来会判断某个注册表项中是否含有这些字段的值,如果没有就设置,如果有就判断是否相等,不相等则说明要更新。


函数sub_4026A0

首先初始化两个字符串

image-20191104152151137

前一个是病毒,后一个是微软系统进程

分别判断两个进程是否存在,如果两个都不存在则直接到函数末尾进入新函数

image-20191104152410774

该函数中会设置启动项,并且初始化几个cmd的command,调用CreateProcessW执行

image-20191104152733707

命令分别为:

cmd /c rd /q /s "C:\Windows\IME\Tool" 2>nul
cmd /c pushd "C:\Windows\SysWOW64" & igor e -y -pAd9Yj2Df6A3laX5s8kF7 "msvrlib" & igor x -y -pAd9Yj2Df6A3laX5s8kF7 "mscrlib" -o "C:\Windows\IME\Tool\"
cmd /c attrib "C:\Windows\IME\Tool" +h +s

如果之前的判断存在任意一个也只多了查询更新注册表这一步


总结

认识了基本的在main函数之前运行的代码