第56章

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

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

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

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

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

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

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

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

    • .ini-file访问(kernel32.dll): GetPrivateProfileString
    • 资源访问(68.2.8): (user32.dll): LoadMen
    • TCP/IP网络(ws2_32.dll): WSARecv, WSASend
    • 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:拦截所有函数特殊模块

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

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

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

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

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