分享

应用程序实现方法的猜测

 换来晴空月儿明 2008-01-18

应用程序实现方法的猜测

今天将向大家介绍一个比较有意思的内容,应用程序实现方法的猜测。

日常生活和工作中,我们总会接触到各种应用程序,这些应用程序往往给我们带来的很大的便利。也许有的人对于如何实现这个应用程序的方法非常好奇,但是要分析具体的实现方法,大家可能会受到一些夸大言论的误导,导致认为要分析出结果有相当大的困难。

实际上,详细的分析的确是非常困难的,需要和逆向工程紧密联系。但是大多数情况下我们对一个应用程序的实现方法的关注可能更多在于这个应用程序是如何对操作系统进行调用的,理解了一些关键的调用以后,就能够对这个应用程序的实现方法有比较好的认识了。

在月初的时候,我曾经发布了一个增强型重命名工具:RenamePlus。这个工具的目的就是支持将任意文件、文件夹在正常文件名和非正常文件名之间进行相互转换,例如:

由 于某种特殊原因,导致C:盘下出现了一个叫做 NUL 的文件夹,根据 Windows 命名规范,NUL 属于 Windows 保留关键字,因此是不应该出现这个叫做 NUL 的文件夹的,但是由于各种原因,这个限制并不是作用于文件系统层面上的(也就是文件系统是承认这个文件夹的存在的,但是Windows Shell并不承认)。因此导致了用户无法使用资源管理器打开这个目录,更别说删除这个目录了。

小知识:Windows 保留文件名:Windows保留文件名指哪些被Windows API内部保留的,禁止用户创建的一些文件名,如 CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9、LPT1、LPT2、 LPT3、LPT4、LPT5、LPT6、LPT7、LPT8、LPT9以及文件名或者文件夹名以“.”结尾等等。因为这些文件名在久远的时代是作为设备 使用的,由于各种原因,这些文件名不允许用户通过常规的方法在 Windows 里面进行使用。微软通过对 API 调用时候的检查以实现上述文件名限制。

以往碰到这种问题,大家一般会采用文件扇区修改级别的编辑工具或者利用KB320081所说的方法进行操作。问题在于文件扇区级别的编辑工具或者KB320081所说的方法在操作上都有很大的难道,特别是文件扇区级别的磁盘编辑工具,很容易导致正常数据的丢失。RenamePlus 出来以后,得益于我在 RenamePlus 里面使用的一种方法,或者技巧,成功的实现了将任意文件、文件夹在正常文件名和非正常文件名之间进行相互转换的功能。

回到正题,RenamePlus 是怎么实现这个功能的,今天我将通过此文揭开 RenamePlus 的实现之谜,同时向大家介绍如何猜测应用程序的实现方法。

  • 输入表

在 Windows 操作系统上运行的应用程序基本上都存在了一种叫做Portable Executable (PE)格式的文件格式类型。而PE格式的文件类型里面有一张表叫做输入表,输入表的用处就是告诉系统该应用程序需要哪些系统库函数或者第三方函数的支持。

关于 PE 格式的详细说明,请参考 《Microsoft Portable Executable and Common Object File Format Specification》一文。

根据输入表的信息,我们可以大致的知道该应用程序和哪些系统库函数或者第三方函数函数有关。前文说到,大多数情况下我们对一个应用程序的实现方法的关注可能更多在于这个应用程序是如何对操作系统进行调用的,而输入表就是帮助我们的一个利器。

要查看PE文件的输入表,需要一些PE相关的工具,例如:Microsoft 在 Visual Studio 里面带的 Depends 工具,或者其他的一些免费工具,如PE TOOLS等。这里使用PE TOOLS做演示。

用PE TOOLS打开RemovePlus.EXE,然后依次点击 Directory — Import Directory,就可以看到RenamePlus的输入表内容了,如图:

Snap1

在上图里面,我们看到了RenamePlus.EXE所依赖的系统DLL是Kernel32.DLL,依赖的系统函数有 MoveFileW、GetLastError等。完整的列表如下所示:

CloseHandle
CreateFileA
DeleteCriticalSection
EnterCriticalSection
ExitProcess
FlushFileBuffers
FormatMessageW
FreeEnvironmentStringsA
FreeEnvironmentStringsW
GetACP
GetCPInfo
GetCommandLineA
GetCommandLineW
GetConsoleCP
GetConsoleMode
GetConsoleOutputCP
GetCurrentProcess
GetCurrentProcessId
GetCurrentThreadId
GetEnvironmentStrings
GetEnvironmentStringsW
GetFileType
GetLastError
GetLocaleInfoA
GetModuleFileNameA
GetModuleFileNameW
GetModuleHandleA
GetOEMCP
GetProcAddress
GetProcessHeap
GetStartupInfoA
GetStdHandle
GetStringTypeA
GetStringTypeW
GetSystemTimeAsFileTime
GetTickCount
GetVersionExA
HeapAlloc
HeapCreate
HeapDestroy
HeapFree
HeapReAlloc
HeapSize
InitializeCriticalSection
InterlockedDecrement
InterlockedIncrement
IsDebuggerPresent
LCMapStringA
LCMapStringW
LeaveCriticalSection
LoadLibraryA
MoveFileW
MultiByteToWideChar
QueryPerformanceCounter
RtlUnwind
SetCurrentDirectoryW
SetFilePointer
SetHandleCount
SetLastError
SetStdHandle
SetUnhandledExceptionFilter
Sleep
TerminateProcess
TlsAlloc
TlsFree
TlsGetValue
TlsSetValue
UnhandledExceptionFilter
VirtualAlloc
VirtualFree
WideCharToMultiByte
WriteConsoleA
WriteConsoleW
WriteFile

如 果对Windows API比较熟悉,会发现在上述API调用里面,大多数是一些很常见的、也就是基本上每个应用程序都会使用到的API,例如像 HeapAlloc、VirtualAlloc 等和系统内存管理相关的 API,ExitProcess等和进程相关的API,TlsAlloc 等和线程相关的API,基本上所有的应用程序都会涉及。除去这些 API 以外,RenamePlus 实现其功能的关键 API 是哪一个呢?

  • 实现方法

既然是叫做 RenamePlus, 那么就和文件或者目录的改名操作相关,改名操作对于 Windows 来说,可以理解为就是一个目标的移动操作。搜索上述列表,果然有一个叫做 MoveFileW 的 API 函数和移动有点相关。查询 MSDN Library 以后,得知 MoveFile 的用处是:Moves an existing file or a directory, including its children。The MoveFile function will move (rename) either a file or a directory (including its children) either in the same directory or across directories. 根据微软的描述,MoveFile 是能够作为改名使用的。

没错,RenamePlus 功能实现的关键性API就是MoveFile。

我们继续,MoveFile 会接收2个参数:源路径和目标路径。没啥特殊的。我们现在知道了 RenamePlus 是利用 MoveFile 函数实现的改名操作,但是直接使用 MoveFile 函数对含有系统保留关键字的目录进行操作,必将导致失败。那么 RenamePlus 是怎么做到的呢?

仔细阅读MSDN会发现 Windows 对于文件命名的一个文档:Naming a File。 阅读完这个文档,有一句话比较特殊:It is possible to create a path with the API that the shell UI cannot handle。这句话的大意就是说:API创建的路径,UI界面可能无法进行控制。联系前文说到的对于含有Windows保留字符的路径,UI界面的确是 没法进行控制的,那么这句话的意思是不是说利用一些特殊的方法是可以进行控制的呢?

根据Windows命名文档的描述,可以使用 \\?\ 前缀扩充Windows对于文件名长度的限制,实际上,RenamePlus 也正是利用了这个性质,利用 \\?\ 前缀绕过了Windows API 对于保留文件名的检查,使得在下面的一些调用能够完成并最终有文件系统对在文件系统上进行实际的操作。

  • 小结
  1. 本文从一个KZTechs.COM的小工具  RenamePlus 入手,首先简单介绍了 RenamePlus 的用途。
  2. RenamePlus 引出了 PE 格式和 PE 格式里面的输入表内容。
  3. 根据 PE 格式的输入表,我们知道了 RenamePlus 关键 API 是 MoveFile。
  4. 根据 MSDN 文档,我们知道了 MoveFile API的用法是移动文件和改名,并通过这份文档找到了一种绕过 Windows 对保留文件名进行检查的方法并最终实现 RenamePlus
  5. 本文简单的介绍了一些猜测应用程序实现方法的知识,但是需要说明的是,上述介绍的方法局限于文件没有被加壳、应用程序开发者没有对关键API使用显式的调用方法,否则本文介绍的内容是不起左右的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多