2024-11-20-XORandRtf

2024-11-20-XORandRtf

十一月 20, 2024

反汇编代码审计

进入 sub_4014D0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
char __cdecl sub_4014D0(LPCSTR lpString)
{
LPCVOID lpBuffer; // [esp+50h] [ebp-1Ch]
DWORD NumberOfBytesWritten; // [esp+58h] [ebp-14h] BYREF
DWORD nNumberOfBytesToWrite; // [esp+5Ch] [ebp-10h]
HGLOBAL hResData; // [esp+60h] [ebp-Ch]
HRSRC hResInfo; // [esp+64h] [ebp-8h]
HANDLE hFile; // [esp+68h] [ebp-4h]
// 从上往下声明六个变量
// 根据变量名推断意思为 lp 缓冲区 、写入字节数、要写入的字节数、h资源数据、h资源信息、h文件


hFile = 0;
hResData = 0;
nNumberOfBytesToWrite = 0;
NumberOfBytesWritten = 0;
// 变量名初始化


hResInfo = FindResourceA(0, (LPCSTR)0x65, "AAA");
if ( !hResInfo )
return 0;
nNumberOfBytesToWrite = SizeofResource(0, hResInfo);
hResData = LoadResource(0, hResInfo);
if ( !hResData )
return 0;
lpBuffer = LockResource(hResData);
sub_401005(lpString, (int)lpBuffer, nNumberOfBytesToWrite);
// 明白结果是创建 rtf文件
hFile = CreateFileA("dbapp.rtf", 0x10000000u, 0, 0, 2u, 0x80u, 0);
if ( hFile == (HANDLE)-1 )
return 0;
if ( !WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, &NumberOfBytesWritten, 0) )
return 0;
CloseHandle(hFile);
return 1;
}

根据函数原型逆推代码作用

1
2
3
4
5
6
7
8
9
HANDLE CreateFileA(
LPCSTR lpFileName, // 文件或设备的名称
DWORD dwDesiredAccess, // 访问权限
DWORD dwShareMode, // 文件共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性
DWORD dwCreationDisposition, // 如何创建或打开文件
DWORD dwFlagsAndAttributes, // 文件属性和标志
HANDLE hTemplateFile // 模板文件句柄
);

CreateFileA("dbapp.rtf", 0x10000000u, 0, 0, 2u, 0x80u, 0);

文件名 dbapp.rtf

0x10000000 等同于 GENERIC_READ,意味着请求对文件的读取权限。

0 表示不允许文件与其他进程共享。

0 表示不设置安全属性,使用默认的安全设置。

2u 等同 OPEN_ALWAYS 类似python open 的 a+ 文件存在则打开,文件不存在则创建新的

0x80uFILE_FLAG_NO_BUFFERING,表示文件操作将不使用系统缓存进行缓冲,要求应用程序直接与物理存储进行交互。通常用于高效的文件操作。 0 表示没有模板文件,通常设置为 NULL,即不使用任何模板文件

上方的可疑代码

hResInfo = FindResourceA(0, (LPCSTR)0x65, "AAA");

1
2
3
4
5
HRSRC FindResourceA(
HMODULE hModule, // 模块句柄
LPCSTR lpName, // 资源名称
LPCSTR lpType // 资源类型
);
  • hModule 参数指定了模块句柄。
    • 0 表示该函数将搜索当前进程的可执行文件(EXE)或者动态链接库(DLL)中的资源。因此,0 实际上指的是当前进程本身。
  • lpName 参数指定了资源的名称。
    • 在这个例子中,0x65 是一个整数常量,表示资源的名称(以字符串形式传递时,会进行转换)。由于 (LPCSTR)0x65 表示将数字 0x65 强制转换为 LPCSTR 类型,这里的 0x65 是一个指向某个特定字符串资源的地址,通常是一个字符。
  • 0x65 对应的 ASCII 字符是 'e',因此,传递的资源名称实际上是一个指向字符 'e' 的指针。
    • 但值得注意的是,这并不意味着它是字符串 "e",而是一个内存地址,所以需要结合上下文来看。如果程序的资源文件中包含一个以 'e' 为标识符的资源,这种写法就能匹配到该资源。
  • lpType 是资源的类型,这里是一个常量字符串 "AAA",表示要查找的资源的类型。
    • 资源类型可以是 "RT_BITMAP"(位图),"RT_ICON"(图标),"RT_STRING"(字符串表)等。这里 "AAA" 是一个用户自定义的资源类型标识符。