PS:刚刚注册看雪账号,入行逆向分析病毒三周,跑来报道,大牛绕道,以上的案例大都是亲身所经历,或基于身边大牛分析报告总结。今后还有更多的知识需要积累,请大家多指点批评!
在逆向分析病毒时,通常使用字符串或者关键的函数来定位核心代码,这里就简单总结一下我现在遇到的一些与恶意代码或者恶意行为相关的函数,这里特指对windows平台下的API进行有限的总结
注:病毒样本全是在已经脱壳的情况下进行分析
这无疑是最值得注意的函数,没有之一。很多的杀毒引擎甚至是遇到该函数就将其定义为病毒或者恶意软件。该函数经常被用来进行典型的dll注入。一般一个典型的注入过程如下(这里主要注重API的调用):
调用OpenProcess()函数的到想要注入程序的句柄
调用VirtualAllocEx()函数在对被注入程序进行分配空间
调用WriteProcessMemory()函数将欲注入dll路径写入被注入的程序刚刚分配的空间
调用GetModuleHandle()和GetProcAddress函数获取“LoadLibraryW”函数的地址
调用CreateRemoteThread()函数在被注入的进程中生成一个线程执行LoadLibraryW函数加载欲注入的dll文件
从上述过程可知,在对该注入部分代码进行注入时,最有效的定位函数是CreteRemoteThread()API,但有时候可能不会有该函数,而是可能对其他进程做些奇奇怪怪的操作。所以追根溯源是OpenProcess()函数,所以在动态调试时候,如果发现进程在将一些系统进程或者无关进程pid作为参数传入OpenProcess()函数中并获得句柄,那肯定是要有一些不法操作。
该函数同样可以用来进行dll注入,不过其原理与CreteRemoteThread函数不同。它是通过设置全局的Hook,当某个时间发生时,如键盘输入事件发生时,会在整个事件链中间截取到信息,并会将dll强制注入到进程中。并执行Hook在截取信息后的动作。KeyLogger通常就是使用该方法实现的内容记录。
该函数通常会配合OpenProcessToken()和 LookupPrivilegeValue()函数一起使用达到提升权限的功能。通常在OpenProcess()函数被调用之前会进行修改权限的操作,使得进程拥有SeDebug权限,能够有调用OpenProcess打开进程的权限。基本的修改权限的代码如下:
该函数作用是对当前系统正在运行的进程排快照。通常结合Process32First()和Process32Next()函数对当前的系统进行遍历,然后执行一定的操作,杀死某个进程,或者自退出等。可参照如下代码:
该段代码大意是遍历当前系统所用运行的进程,如果遇到名字为“SbieSvc.exe”的进程,就自身退出。该段代码出自EnMiner病毒样本,该病毒具有反调试的功能。SbieSvc.exe是沙箱进程,当发现沙箱进程时就会自退出。
ShellExecute的功能是运行一个外部程序,并对外部程序有一定的控制。在恶意软件运行时通常会以命令行的方式运行一些指令或者执行释放出来的文件,如下图所示,下图是在动态调试Scarab病毒时的OllyDbg截图:
由上图可知,调用该函数时,可以在栈中观察到将要执行的参数()这可能是静态调试不可见的参数):调用runas命令执行病毒文件生成一个新的进程。
该函数用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。和ShellEcxecute()函数可以有着相同的功能,执行病毒文件或相关文件。函数的定义如下:
BOOL CreateProcess
(
LPCTSTR lpApplicationName,
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)