QQ盗号木马之逆向分析(怎么用木马病毒盗QQ)
大家好,今天就和蜜蜜一起来看看这个问题吧 。怎么用木马病毒盗QQ,QQ盗号木马之逆向分析很多人还不知道,现在让我们一起来看看吧!
一般来说,病毒分析不涉及算法。如果要分析算法(就像我之前对CM4注册机制的分析),那么就需要更加关注程序的流程和逻辑,一般不要深究调用的具体内容。但是,病毒分析往往需要找出不同调用的含义,从而找出病毒的行为。因此,本文的第一部分着重对这些呼吁进行分析。第二部分简要讨论了守护进程技术的实现。
逆向分析
这里我们跳过程序的初始化部分,直接进入第一个API函数的位置:
我们可以直接看到的第一个API函数是GetModuleFileName。该函数用于获取当前进程加载的模块的文件的完整路径,该模块必须由当前进程加载。这个函数的返回值是文件路径长度,保存在EAX是2B,也就是说路径长度是2B字符。你可以看到返回的路径是什么。将路径保存在“PathBuffer”中,按照地址查看:
可以看出,程序已经正确地获得了当前文件的地址。然后继续分析下一个API函数:
ShellExecute函数出现在这里。它的功能是运行外部程序(或打开注册文件、打开目录、打印文件等。)并对外部程序有一些控制。具体到这个程序,ShellExecute会运行Explorer.exe程序打开“d:”,其实就是用程序管理器打开d盘的根目录,但是这个API函数的执行是有条件的,需要根据第二行CALL语句的结果来判断,所以需要输入这个调用,看看需要满足什么条件才能执行ShellExecute。
输入函数oso.00403C48
程序会比较EAX和EDX的内容,其中EAX保存的字符串是我们之前用GetModuleFileName得到的当前文件的路径,只是转换成了大写字符。OSO.EXE的文件路径EDX保存在d盘的根目录下,这里两者明显不同。因此,用黄色突出显示的条件跳转语句无效,程序将继续按顺序执行:
这里需要注意的是,由于这个病毒是Delphi写的,所以这个字符串的长度就是字符串的第一个地址减去4后的4字节内容。所以代码的前两句意思是得到两个路径的字符数,然后用减法比较。这里很明显,当前路径中的字符数很大,所以用黄色突出显示的条件跳转成立,它来到oso.00403C6B的位置:
这里还是人物对比。因为两者不相等,最后一句的条件跳转成立,就到了oso.00403CD1的位置:
这里比较的是盘符,也是不相等的,所以条件跳转成立,这个功能就完成了。基于以上分析,该函数的作用是判断当前执行的文件是否位于D盘根目录,如果是,则正在执行ShellExecute函数,否则跳过该函数的执行。因为我们的程序位于桌面,所以不执行ShellExecute函数。
接下来,程序会继续判断当前程序是否位于E,F,G,H,I的根目录下,如果不是,那么就不会执行相应的ShellExecute函数。
之后,程序将调用名为oso.004050F0的函数进入其内部分析:
可以看出,病毒程序调用了GetSystemDirectory函数来获取系统目录。一般来说,恶意程序使用该功能的目的是将自身复制到系统目录中迷惑用户(详见《反病毒攻防研究第001篇:自我复制与自删除》)。之后病毒程序会将字符“severe.exe”与上面得到的系统目录字符串结合,新路径就是病毒程序需要隐藏的地方:
然后您可以看到CreateFile函数:
但是这个CreateFile函数的执行是有条件的,它依赖于第一行代码中CALL的返回值。输入此呼叫进行分析,您可以发现:
该程序调用FindFirstFile函数来查找系统目录中是否有severe.exe文件。如果没有文件(返回值为-1),则不会执行CreateFile函数。可以看出,这里CreateFile的作用不是创建文件,而是打开文件。接下来是文件复制操作:
然后就是一系列的文件复制,病毒会把自己改名为tfidma.exe,复制到系统目录下。它还会将自己重命名为conime.exe,并将其复制到系统目录下的驱动程序文件夹中。类似的操作在此不再赘述。之后,程序会再次调用ShellExecute函数来执行创建的程序。因此,severe.exe、conime.exe和tfidma.exe等进程将出现在资源管理器中。可以说,这个时候,我们的电脑已经感染了病毒。接下来我们将遇到线程的创建函数:
CreateThread函数通常与Sleep或WaitForSingleObject函数一起使用。因为每个线程都有自己的CPU时间片,所以当主线程创建一个新线程的时候,它的CPU时间片有时候是没有完成的,可以继续执行。有时如果主线程的代码很小,那么在CPU中
根据OD对CreateThread函数的解析可以知道,该线程所调用的是oso.00404958这个函数。分析这个函数可以知道,它主要是创建了名为“hx1.bat”的批处理文件并执行,而该批处理的内容为:
其主要作用就是修改系统时间,测试本地网络系统并删除自身。病毒的常规分析部分就是这些。
三、进程守护技术原理
进程的守护技术最早应该是源于“中国黑客病毒(worm.runouce)”,它开创性地采用了“三线程”结构。创建三线程就是为了更好地保护程序自身不被关闭和删除。我们可以将想要执行的代码放在主线程里,然后再生成两个辅助线程,它们的功能就是实现对程序的保护,防止程序被用户关闭或删除。在此,称我们的可执行文件的进程为主进程。两个辅助线程相互实时监视,如果监视对象被关闭了,就重新创建线程或进程。比如病毒程序可以选择Explorer.exe和Taskmgr.exe作为远程进程驻体。如果用户知道了远程线程的驻体为资源管理器后,就会打开任务管理器来结束Explorer,这时我们再把远程线程驻入到任务管理器中。也就是说,只要Explorer或Taskmgr有一个存在,就不可能结束主进程。如果有其它结束进程的工具,你就可以将其关闭掉,只要资源管理器和任务管理器均不存在时,就没有驻体来维持远程进程。不过,如果我们选择的远程进程为随机的,或者就是病毒自创的,这就不容易发现了。
这种三线程结构的程序框架大致如下(代码来自《浅析三线程程序开发思路与实现》):
// 1.主线程:main // 获得操作系统的系统目录
GetSystemDirectory(syspath,MAX_PATH); // 查询系统目录下病毒是否存在
FindFirstFile(virusname,&fdata); // 如果系统目录下没有,在将正在运行的程序复制到系统目录下
CopyFile(curname,tname,TRUE); // 在查询完毕后,关闭相关句柄
FindClose(ffhandle); // 打开系统目录下的文件
CreateFile(kname,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); // 修改时间
SetFileTime(fchandle,&ftime,NULL,&ftime); // 设置属性
SetFileAttributes(kname,FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM ); // 创建驻留在主进程内的辅助监视线程
CreateThread(NULL,0,watch,(LPVOID)rthread,0,NULL);
// 2.本地辅助监视线程:watch // 以查询方式打开注册表的HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
RegOpenKeyEx(HKEY_LOCAL_MACHINE,rgspath,0,KEY_QUERY_VALUE,&hkey); // 查询是否存在virusname的键值
RegQueryValueEx(hkey,_T("virusname"),NULL,NULL,(LPBYTE)lpdata,&dwbuflen); // 如果没有相关键值,就以写方式再次打开注册表
RegOpenKeyEx(HKEY_LOCAL_MACHINE,rgspath,0,KEY_WRITE,&hkey); // 写入我们想要的东西,系统每次启动都会运行我们的可执行文件;
RegSetValueEx(hkey,_T("virusname"),NULL,type,(const byte *)wtname,dwbuflen); // 获得远程线程的运行情况,看是否为STILL_ACTIVE,如果不是则创建远程线程
GetExitCodeThread(wethread,&exitcode);
// 3.远程线程:remote // 以所有可能的访问方式打开主进程,以便监视主进程的运行情况
tOpenProcess(PROCESS_ALL_ACCESS,FALSE,erp->rpmousepid); // 等待直到主进程结束
tWaitForSingleObject(erp->rpprocesshandle,INFINITE); // 重新启动我们的可执行文件
tWinExec(erp->rpwinexecname, 0);
// 4.获得进程ID:processtopid // 列举所有的进程
EnumProcesses(lpidprocesses,sizeof(lpidprocesses),&cbneeded); // 以查询信息和读取的方式打开进程
OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,lpidprocesses[i]); //获得进程模块的句柄
EnumProcessModules(hprocess,&hmodule,sizeof(hmodule),&cbneeded); // 获得特定模块的名字,以备比较
GetModuleBaseName(hprocess,hmodule,normalname,sizeof(normalname));
// 5.创建远程线程:createremote // PROCESS_CREATE_THREAD for CreateRemoteThread
// PROCESS_VM_OPERATION for VirtualAllocEx // PROCESS_VM_WRITE for WriteProcessMemory
OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,remotepid); // 在远程进程中分配空间,以备将线程代码置入其中
VirtualAllocEx(rphandle,NULL,cb,MEM_COMMIT,PAGE_EXECUTE_READWRITE); // 将远程线程remote的代码写入到远程进程的地址空间中
WriteProcessMemory(rphandle,remotethr,(LPVOID)remote,cb,NULL); // 将远程线程所需的参数也写入到远程进程的地址空间中
WriteProcessMemory(rphandle,remotepar,(LPVOID)&rp,cb,NULL); // 创建远程监视线程
CreateRemoteThread(rphandle,NULL,0,(LPTHREAD_START_ROUTINE)remotethr,(LPVOID)remotepar,0,NULL);
毕竟本系列不是教大家编写病毒,而是剖析病毒的大概思路,所以上述程序大家有个大概的印象即可,这样在以后的实际分析中,就能有大概的应对思路。
四、小结
至此,QQ盗号木马(oso.exe)病毒程序的分析就到这里。希望大家喜欢.
这篇文章到此就结束,希望能帮助到大家。
扫描二维码推送至手机访问。
版权声明:文章内容摘自网络,如果无意之中侵犯了您的版权,请联系本站,本站将在3个工作日内删除。谢谢!