关于恶意软件中的 Windows 功能的问题

逆向工程 部件
2021-07-11 09:48:29

几个月以来,我尝试分析恶意软件,例如通过检查木马的汇编代码,我有时会看到 windows 函数,例如ws2_32.send哪个是send()-function 等。这不是理解的问题,我可以去:

http://msdn.microsoft.com/de-de/library/windows/desktop/ms740149%28v=vs.85%29.aspx

并阅读,一切都很好。

但我问自己,编写该代码的人是如何将该功能放入他们的代码中的。我的意思是,你能不能用 C 代码编写函数

  int send(
     __in  SOCKET s,
     __in  const char *buf,
     __in  int len,
     __in  int flags);

那么是不是让 C 编译器理解它?还有一些其他功能CopyFileA,例如,看起来像:

  BOOL WINAPI CopyFile(
  _In_  LPCTSTR lpExistingFileName,
  _In_  LPCTSTR lpNewFileName,
  _In_  BOOL bFailIfExists
  );

在这里我问自己编译器是如何理解单词的"WINAPI",例如等等。

一般来说,如果人们试图编写这样的代码来创建木马,他们如何明确它应该是一个windows函数?

2个回答

您误解了关键字的使用。正如对您的问题的评论所说,WINAPI 是函数的调用约定。WINAPI 被 #define 定义为 __stdcall,它指定了如何管理与该函数相关的堆栈,您可以在 MSDN此处查看记录那篇文章很好地概述了它的作用以及如何在头文件中使用它。

对于 Windows 上的 CRT 函数,没有明确说明调用约定是很常见的;但这只是在文档中,并不意味着不需要类似地声明调用约定。大多数函数(在 x86 上)将使用 __stdcall。最常见的例外是使用 cdecl 调用约定的 printf() 系列函数。这更多地与 x86 的开发历史有关,而不是任何特定的设计选择。

大多数常量,WINAPI 等,可以在 MSDN 上的某个地方找到,或者如果你有 Visual Studio,可以按 F12。

现在,就我对您的问题的更一般性回答而言,就您如何/为什么会在特定示例中看到某些函数调用而言,简短的回答是 Windows 提供了标准 C 库调用和它自己的API 的版本。在这种情况下,send() 函数在 Winsock2.h 中定义,函数本身在 Ws2_32.lib(也可在您链接的那个 MSDN 页面上找到)。但是,您可能会在同一个 .h 和 .lib 文件中找到此函数的“Windows API 版本”:WSASend(),此处记录该文件

您可以通过 MSDN 上的两篇文章看到这些函数几乎相同,如果您查看它们的反汇编,您会发现 WSASend() 和 send() 几乎是完全相同的函数。但是 Windows 支持两者,因此如果您在 Unix 上学习或仅使用标准 C 库,您可以在 Windows 上编写相同的代码。

大多数其他 CRT 函数(fopen、fread、printf)在 C 运行时库 msvcrt.dll 中实现。它们大多是独立的(与所有在 Ws2_32.lib 中的套接字函数相比)。

WINAPI.h文件中用于__stdcall...的声明即,在堆栈和函数上传递的标准调用类型声明参数应平衡堆栈而不是__cdecl格式,或者__fastcall)。

而且,编译器会为您完成导入工作:

BOOL WINAPI CopyFile(
_In_  LPCTSTR lpExistingFileName,
_In_  LPCTSTR lpNewFileName,
_In_  BOOL bFailIfExists
);

push TRUE ; assume the `bFailIfExists` is set to `true` - compiler looks up
          ; the equate for true which is typically 01 
          ; (unless you're coding in Delphi, then its strange).

push offset lpNewFilename ; compiler sets this as a unique address, linker fixes it up.

push offset lpExistingFileName ; same as above

call [__imp__CopyFile] ; linker fixes this up to the address in the import table

哦,在汇编中;是像c中的//这样的注释。asm 示例... params 以相反的顺序推送。

简而言之,无论编码语言如何,各种事物都等同于一个值,编译器知道或看到它在代码中的设置,编译器制作了编译代码的obj文件,但地址以某种查找表格式设置,唯一地,进口被声明,但同样,名称或序数样式表。

然后,链接器完成将所有内容放在一起以获得最终可执行文件的任务,如果它是一个 DLL,则会完成进一步的工作,例如 reloc 表等

实际上它在这里声明..看看#declare WINAPI底部附近的线

http://msdn.microsoft.com/en-us/library/zxk0tw93.aspx