第56章

与外部世界通信(win32)

有时理解函数的功能通过观察函数的输入与输出就足够了。这样可以节省时间。

文件和注册访问:对于最基本的分析,SysInternals的Process Monitor工具很有用。

对于基本网络访问分析,Wireshark很有帮助。

但接下来你仍需查看内部。

第一步是查看使用的是OS的API哪个函数,标准库是什么。

如果程序被分为主要的可执行文件和一系列DLL文件,那么DLL文件中的函数名可能会有帮助。

如果我们对指定文本调用MessageBox()的细节感兴趣,我们可以在数据段中查找这个文本,定位文本引用处,以及控制权交给我们感兴趣的MessageBox()的地方。

如果我们在谈论电子游戏,并且对里面的事件的随机性感兴趣,那么我们可以查找rand()函数或者类似函数(比如马特赛特旋转演算法),然后定位调用这些函数的地方,更重要的是,函数执行结果如何被使用。

但如果不是一个游戏,并且仍然使用了rand()函数,找出原因也很有意思。这里有一些关于在数据压缩算法中意外出现rand()函数调用的例子(模仿加密):blog.yurichev.com

56.1 Windows API中常用的函数

下面这些函数可能会被导入。值得注意的是并不是每个函数都在代码中使用。许多函数可能被库函数和CRT代码调用。

  • 注册表访问(advapi32.dll):RegEnumKeyEx, RegEnumValue, RegGetValue7, RegOpenKeyEx, RegQueryValueEx
  • .ini-file访问(kernel32.dll): GetPrivateProfileString
  • 资源访问(68.2.8): (user32.dll): LoadMen
  • TCP/IP网络(ws2_32.dll): WSARecv, WSASend
  • 文件访问(kernel32.dll): CreateFile, ReadFile, ReadFileEx, WriteFile, WriteFileEx
  • Internet高级访问(wininet.dll): WinHttpOpen
  • 可执行文件数字签名(wintrust.dll): WinVerifyTrust
  • 标准MSVC库(如果是动态链接的) (msvcr*.dll): assert, itoa, ltoa, open, printf, read, strcmp, atol, atoi, fopen, fread, fwrite, memcmp, rand, strlen, strstr, strchr

56.2 tracer:拦截所有函数特殊模块

这里有一个INT3断点,只触发了一次,但可以为指定DLL中的所有函数设置。

  1. --one-time-INT3-bp:somedll.dll!.*

我们给所有前缀是xml的函数设置INT3断点吧:

  1. --one-time-INT3-bp:somedll.dll!xml.*

另一方面,这样的断点只会触发一次。

Tracer会在函数调用发生时显示调用情况,但只有一次。但查看函数参数是不可能的。

尽管如此,在你知道这个程序使用了一个DLL,但不知道实际上使用了哪个函数并且有许多的函数的情况下,这个特性还是很有用的。

举个例子,我们来看看,cygwin的uptime工具使用了什么:

  1. tracer -l:uptime.exe --one-time-INT3-bp:cygwin1.dll!.*

我们可以看见所有的至少调用了一次的cygwin1.dll库函数,以及位置:

  1. One-time INT3 breakpoint: cygwin1.dll!__main (called from uptime.exe!OEP+0x6d (0x40106d))
  2. One-time INT3 breakpoint: cygwin1.dll!_geteuid32 (called from uptime.exe!OEP+0xba3 (0x401ba3))
  3. One-time INT3 breakpoint: cygwin1.dll!_getuid32 (called from uptime.exe!OEP+0xbaa (0x401baa))
  4. One-time INT3 breakpoint: cygwin1.dll!_getegid32 (called from uptime.exe!OEP+0xcb7 (0x401cb7))
  5. One-time INT3 breakpoint: cygwin1.dll!_getgid32 (called from uptime.exe!OEP+0xcbe (0x401cbe))
  6. One-time INT3 breakpoint: cygwin1.dll!sysconf (called from uptime.exe!OEP+0x735 (0x401735))
  7. One-time INT3 breakpoint: cygwin1.dll!setlocale (called from uptime.exe!OEP+0x7b2 (0x4017b2))
  8. One-time INT3 breakpoint: cygwin1.dll!_open64 (called from uptime.exe!OEP+0x994 (0x401994))
  9. One-time INT3 breakpoint: cygwin1.dll!_lseek64 (called from uptime.exe!OEP+0x7ea (0x4017ea))
  10. One-time INT3 breakpoint: cygwin1.dll!read (called from uptime.exe!OEP+0x809 (0x401809))
  11. One-time INT3 breakpoint: cygwin1.dll!sscanf (called from uptime.exe!OEP+0x839 (0x401839))
  12. One-time INT3 breakpoint: cygwin1.dll!uname (called from uptime.exe!OEP+0x139 (0x401139))
  13. One-time INT3 breakpoint: cygwin1.dll!time (called from uptime.exe!OEP+0x22e (0x40122e))
  14. One-time INT3 breakpoint: cygwin1.dll!localtime (called from uptime.exe!OEP+0x236 (0x401236))
  15. One-time INT3 breakpoint: cygwin1.dll!sprintf (called from uptime.exe!OEP+0x25a (0x40125a))
  16. One-time INT3 breakpoint: cygwin1.dll!setutent (called from uptime.exe!OEP+0x3b1 (0x4013b1))
  17. One-time INT3 breakpoint: cygwin1.dll!getutent (called from uptime.exe!OEP+0x3c5 (0x4013c5))
  18. One-time INT3 breakpoint: cygwin1.dll!endutent (called from uptime.exe!OEP+0x3e6 (0x4013