首页
社区
课程
招聘
[原创]windows逆向分析病毒需注意的函数
2018-6-20 20:13 6549

[原创]windows逆向分析病毒需注意的函数

2018-6-20 20:13
6549

逆向病毒分析需注意的函数

                                                                                                                      逆向实习生                                          


PS:刚刚注册看雪账号,入行逆向分析病毒三周,跑来报道,大牛绕道,以上的案例大都是亲身所经历,或基于身边大牛分析报告总结。今后还有更多的知识需要积累,请大家多指点批评!


在逆向分析病毒时,通常使用字符串或者关键的函数来定位核心代码,这里就简单总结一下我现在遇到的一些与恶意代码或者恶意行为相关的函数,这里特指对windows平台下的API进行有限的总结

注:病毒样本全是在已经脱壳的情况下进行分析

1. CreateRemoteThread()

这无疑是最值得注意的函数,没有之一。很多的杀毒引擎甚至是遇到该函数就将其定义为病毒或者恶意软件。该函数经常被用来进行典型的dll注入。一般一个典型的注入过程如下(这里主要注重API的调用):

调用OpenProcess()函数的到想要注入程序的句柄

调用VirtualAllocEx()函数在对被注入程序进行分配空间

调用WriteProcessMemory()函数将欲注入dll路径写入被注入的程序刚刚分配的空间

调用GetModuleHandle()和GetProcAddress函数获取“LoadLibraryW”函数的地址

调用CreateRemoteThread()函数在被注入的进程中生成一个线程执行LoadLibraryW函数加载欲注入的dll文件

从上述过程可知,在对该注入部分代码进行注入时,最有效的定位函数是CreteRemoteThread()API,但有时候可能不会有该函数,而是可能对其他进程做些奇奇怪怪的操作。所以追根溯源是OpenProcess()函数,所以在动态调试时候,如果发现进程在将一些系统进程或者无关进程pid作为参数传入OpenProcess()函数中并获得句柄,那肯定是要有一些不法操作。


2. SetWindowsHookEx()

该函数同样可以用来进行dll注入,不过其原理与CreteRemoteThread函数不同。它是通过设置全局的Hook,当某个时间发生时,如键盘输入事件发生时,会在整个事件链中间截取到信息,并会将dll强制注入到进程中。并执行Hook在截取信息后的动作。KeyLogger通常就是使用该方法实现的内容记录。

3. AdjustTokenPrivileges()

该函数通常会配合OpenProcessToken()和 LookupPrivilegeValue()函数一起使用达到提升权限的功能。通常在OpenProcess()函数被调用之前会进行修改权限的操作,使得进程拥有SeDebug权限,能够有调用OpenProcess打开进程的权限。基本的修改权限的代码如下:

BOOL SetPrivilege(
    HANDLE hToken,          // access token handle
    LPCTSTR lpszPrivilege,  // name of privilege to enable/disable
    BOOL bEnablePrivilege   // to enable or disable privilege
)
{
                  TOKEN_PRIVILEGES tp;
                  LUID luid;
                  if ( !LookupPrivilegeValue(
                                    NULL,            // lookup privilege on local system
                                    lpszPrivilege,   // privilege to lookup
                                    &luid ) )        // receives LUID of privilege
                  {
                                    printf("LookupPrivilegeValue error: %u\n", GetLastError() );
                                    return FALSE;
                  }
                  tp.PrivilegeCount = 1;
                  tp.Privileges[0].Luid = luid;
                  if (bEnablePrivilege)
                                    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
                  else
                                    tp.Privileges[0].Attributes = 0;
                  // Enable the privilege or disable all privileges.
                  if ( !AdjustTokenPrivileges(
                                    hToken,
                                    FALSE,
                                    &tp,
                                    sizeof(TOKEN_PRIVILEGES),
                                    (PTOKEN_PRIVILEGES) NULL,
                                    (PDWORD) NULL) )
                  {
                                    printf("AdjustTokenPrivileges error: %u\n", GetLastError() );
                                    return FALSE;
                  }
                  if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
                  {
                                    printf("The token does not have the specified privilege. \n");
                                    return FALSE;
                  }
                  return TRUE;
}

void main( )
{
                  HANDLE hToken;
                  BOOL bRet = OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hToken);
                  SetPrivilege(hToken,SE_DEBUG_NAME,TRUE);
}
(来自网络)

4. CreateToolhelp32Snapshot()

该函数作用是对当前系统正在运行的进程排快照。通常结合Process32First()和Process32Next()函数对当前的系统进行遍历,然后执行一定的操作,杀死某个进程,或者自退出等。可参照如下代码:


该段代码大意是遍历当前系统所用运行的进程,如果遇到名字为“SbieSvc.exe”的进程,就自身退出。该段代码出自EnMiner病毒样本,该病毒具有反调试的功能。SbieSvc.exe是沙箱进程,当发现沙箱进程时就会自退出。

5. ShellExecute()

ShellExecute的功能是运行一个外部程序,并对外部程序有一定的控制。在恶意软件运行时通常会以命令行的方式运行一些指令或者执行释放出来的文件,如下图所示,下图是在动态调试Scarab病毒时的OllyDbg截图:


由上图可知,调用该函数时,可以在栈中观察到将要执行的参数()这可能是静态调试不可见的参数):调用runas命令执行病毒文件生成一个新的进程。

6. CreateProcess()

该函数用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。和ShellEcxecute()函数可以有着相同的功能,执行病毒文件或相关文件。函数的定义如下:

BOOL CreateProcess

(

LPCTSTR lpApplicationName,

LPTSTR lpCommandLine,                                  //命令行参数

LPSECURITY_ATTRIBUTES lpProcessAttributes,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCTSTR lpCurrentDirectory,

LPSTARTUPINFO lpStartupInfo,

LPPROCESS_INFORMATIONlpProcessInformation

);

分析Scarab勒索病毒样本截图如下:


在该样本中,程序通过调用CreateProcess()函数执行cmd.exe /c copy /y [文件路径]将病毒母体文件拷贝到其他文件夹下。

7. RegOpenKeyEx()和RegCreateKeyEx():

有些恶意软件会调用RegCreateKeyEx()添加自启动项,使得在电脑重启后仍能进行挖矿或者DOS等恶意行为。此时RegCreateKeyEx()函数可以作为很好的定位函数,用来分析恶意软件修改注册表添加自启动向的操作。

8. FindFirstFile()和FindNextFile():

在分析勒索软件的时候,病毒通常会遍历全盘目录或者指定目录夹下的文件,并对指定的文件类型进行加密。与该函数相关的病毒通常是勒索病毒或者感染性的病毒,需要对系统指定文件夹下的文件进行遍历。

9. bind(),listen()和socket():

很明显,bind(),listen()和socket()是用来建立socket连接发送或接收数据的函数,通过定位该类函数能够找到数据建立通信的模块,从而对动态分析有一定的帮助。下图为Xmirg门罗币挖矿病毒2.6.0beta版本的样本部分截图:


总结:

在逆向分析病毒时候通常都需要静态和动态方法结合分析,静态分析的好处是能够更清楚的看到伪代码如(IDA),从中可以了解到程序的整体流程结构和所具备的模块。动态分析一般更多是为静态分析进行添枝加叶,因为有些函数的参数是动态分配的,静态分析查看不到。

使用IDA分析的入手点一般是查看字符串中是否有敏感的命令语句如cmd.exe + /c +[命令],或者像僵尸网络病毒文件中常常包含很多的ip地址,对列出的ip地址提供dos攻击,或者有一些敏感的域名可以在VirusTotal网站得到一定的信息,甚至像很盛行的门罗币挖矿病毒其中可能存在门罗币挖矿软件的版本号。另一个方法就是在本文我主要阐述的使用核心函数定位核心代码,在逆向之后很多函数名是没有的,但是系统函数的名一般都会存在,所以可以通过系统函数的作用来推测和分析该函数的用途。

动态分析,通常使用OllyDbg,是在静态分析函数的基础上进一步详细的对函数参数和实际功能进行解析。有的恶意程序可能需要与C&C建立通讯后得到指定的指令才会确定参数执行某些指令,所以想要进一步明确恶意程序在做什么,需要进行动态分析,在敏感函数被调用前设定断点,从而可以更为清晰的知道恶意程序的一举一动。

(截图来自个人或我司某大牛文档)


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞2
打赏
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  junkboy   +1.00 2018/06/20
最新回复 (3)
雪    币: 129
活跃值: (43)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
True丶end 2018-6-20 20:39
2
0
ShellExecute    +    CreateProcess
最终都是走  CreateProcessInternalW 
而且CreateProcessInternalW也要走NTDLL函数,是什么我忘记了
雪    币: 5651
活跃值: (6593)
能力值: ( LV15,RANK:531 )
在线值:
发帖
回帖
粉丝
houjingyi 11 2018-6-21 10:49
3
0
没有我最喜欢的WriteProcessMemory和ReadProcessMemory么
雪    币: 1563
活跃值: (272)
能力值: ( LV7,RANK:105 )
在线值:
发帖
回帖
粉丝
逆向实习生 1 2018-6-21 14:12
4
0
houjingyi 没有我最喜欢的WriteProcessMemory和ReadProcessMemory么[em_13]
有WriteProcessMemory,配合CreateRemoteThread使用进行dll注入
游客
登录 | 注册 方可回帖
返回