日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程

發布時間:2024/4/11 windows 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
標 題: 【原創】使用IDA PRO+OllyDbg+PEview 追蹤windows API 動態鏈接庫函數的調用過程。
作 者: shayi
時 間: 2015-02-12,05:19:54
鏈 接: http://bbs.pediy.com/showthread.php?t=197829

使用IDA?PRO+OllyDbg+PEview?追蹤windows?API?動態鏈接庫函數的調用過程。

(本文同步更新至我的51blog上,我最初是在那里發布的,由于引用該處的圖片,因此帶有水印,該貼原始出處如下:
http://shayi1983.blog.51cto.com/4681835/1613615


首先用文本編輯器寫一個C++源程序名為StackFrame.cpp?,代碼如下:

代碼: #include?"stdio.h"long?add(long?a,?long?b) {long?x?=?a,?y?=?b;return?(x?+?y); }int?main(int?argc,?char*?argv[]) {long?a?=?1,?b?=?2;printf("%d\n",?add(a,?b));return?0; } 使用visual?C++?IDE?對該源文件執行編譯,匯編,鏈接一系列的操作后,最終生成的二進制可執行文件(PE格式)名為StackFrame.exe?
回顧上述源碼,main函數調用了標準C庫函數printf打印信息,我們想要知道,
visual?C++?編譯器是如何實現printf庫函數的,并且StackFrame.exe采用的是靜態鏈接還是動態鏈接,如果是后者,那么printf又調用了哪些位于動態鏈接庫中的windows?API函數?抑或是“動靜”兼用?
要解答這些疑問,首先使用IDA?PRO打開StackFrame.exe?,它會自動查找程序入口點,這是由編譯器自動生成的啟動代碼,用于初始化我們編寫的main函數執行前的環境,以及執行main函數退出后的收尾工作。
一般而言,只要反匯編的對象不是經過加殼或者插入了模糊代碼,IDA?PRO可以輕松識別程序入口點與main函數,這里為了簡化分析流程,我們直接進入main函數的反匯編代碼段,如下所示:












我們通過上面一系列的IDA?PRO截圖可以看到,地址?0x00404063處的call指令想要調用EnterCriticalSection函數,后者的地址嘗試以call的操作數0x0040A018給出,但是這個地址處的值,即EnterCriticalSection函數的最終地址,需要操作系統加載器加載StackFrame.exe文件時才能確定,因此我們對磁盤上的文件反匯編時,無法確定動態鏈接庫中函數的地址。
下面以PEview工具查看StackFrame.exe在磁盤上的“真實”面貌(而不是由IDA?PRO?“模擬”的運行時地址空間面貌)
之所以要先使用PEview工具,是因為后面的動態調試中,會與此處的信息對比,來加深理解程序在磁盤上與在內存中的異同。
使用PEview工具打開StackFrame.exe?,我們的重點是定位到PE文件中的導入表,因為無論是操作系統加載器,反匯編器,還是動態調試器,都依賴該表來解析導入的動態鏈接庫與其中的函數。







我們嘗試在原始PE文件中,計算并找出call?ds:EnterCriticalSection?指令對應的字節序列,其實這沒有想象中困難,而且在這里提出計算方法的原因是,后面會用同樣的計算手法來判斷Ollydbg中追蹤到的EnterCriticalSection函數的實際地址,
該地址究竟屬于kernel32.dll還是ntdll.dll?(因為有時Ollydbg給出的信息并不十分準確)屆時會用到下面的計算方法。

首先,回到IDA?PRO,打開StackFrame.exe的程序段窗口,如下所示:







前面指出,地址?0x00404063處的call指令想要調用EnterCriticalSection函數,因此計算?404063?-?401000?=?3063?,?3063?+?400?=?3463
3463這個值就是該指令字節碼在StackFrame.exe的位置,下面驗證:?




接下來,使用Ollydbg打開StackFrame.exe進行動態調試,我們的目標在于定位EnterCriticalSection函數的入口處,并且單步跟進,查看其中的機器碼,然后使用PEview工具,以上面的計算方法,驗證Ollydbg給出的該函數所屬的動態鏈接庫文件信息是否準確,如下截圖所示:?











上面驗證了StackFrame.exe?在運行時調用的共享庫函數,與它在磁盤文件上的導入表中描述的行為一致。
最后,我們驗證EnterCriticalSection這個?windows?API函確實位于ntdll.dll這個動態鏈接庫中,作為本案例的結尾。
首先,可以訪問微軟MSDN站點,查找關于EnterCriticalSection函數的信息:
https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms682608(v=vs.85).aspx











最后總結一下:?
stack.exe使用“部分”靜態鏈接,其中多數的代碼為庫代碼,
這包含由“編譯器庫”添加的,處理程序初始化的啟動代碼與程序退出善后的結束代碼,
以及程序中調用的庫函數,如printf等函數的代碼。
由于?printf?函數需要在屏幕打印信息,涉及更底層的系統I/O操作,因此它需要調用封裝這些系統功能的?windows?API?函數,
除了windows?API?函數所在的DLL(kernel32.dll,ntdll.dll)作為動態鏈接庫在運行時加載以外,
所有其它被調用函數的二進制目標代碼都被鏈接器復制一份副本,然后鏈接到最終的可執行文件stack.exe中,
因此,stack.exe包含的庫代碼數量遠多于程序員自行編寫的代碼數量。
使用靜態鏈接的程序,很容易通過IDA?PRO的全局函數調用拓撲圖識別出來,如下所示:?



上面只是拋磚引玉,類似的將IDA?PRO,Ollydbg,PEview,甚至WinHex,PEiD等工具結合起來應用,交叉驗證的例子不勝枚舉,通過熟練使用這些工具,不僅能提高逆向工程的效率與準確度,更重要的是,我們對處理器指令集體系結構,操作系統內存管理,以及動態鏈接的機制,編譯器,鏈接器的運行原理等等系統底層機理的認識又提升了一個檔次。
最后,限于個人知識水平有限,文中若有錯誤以及誤導之處,還請提出指正,不勝感激。
有任何問題,看法,也歡迎提出討論。


*轉載請注明來自看雪論壇@PEdiy.com
?

[公告]如果你覺得有人語言挑釁,請點每帖右上角的“舉報”按鈕!
共 8 位會員
感謝 shayi 發表的文章:
dolphinzhu?(2015-03-03), hbcld?(2015-02-27), hrpirip?(2015-02-26), Lnairan?(2015-02-25), springkang[DFCG?(2015-03-14), 學gg?(2015-02-23), 雪衫?(2015-03-04), 馬來?(2015-06-07)
shayi
查看公開信息
查找 shayi 發表的帖子
查找 shayi 發表的所有主題
查看 shayi 發表的精華帖
lihuakx
初級會員
資 料: 注冊日期: Feb 2015 帖子: 2 精華: 0 現金: 50 Kx
2 2015-02-12, 07:31:13

寫的很清楚哦。
?

[培訓]科銳逆向培訓!看雪會員減免200元!
lihuakx
查看公開信息
查找 lihuakx 發表的帖子
查找 lihuakx 發表的所有主題
shayi

普通會員
資 料: 注冊日期: Jul 2012 帖子: 150
3 2015-02-14, 00:05:54

補充一下,前面在查看絕大部分使用靜態鏈接的程序中,整個函數的調用拓撲,非常凌亂,我們甚至找不到main函數與最終的DLL函數入口
下面這張來自于?IDA?PRO?的函數遞歸調用圖,把范圍縮小到了我們追蹤的從main()到?EnterCriticalSection()?的整個過程,驗證了前面在StackFrame的代碼節中的查找工作:




?

[培訓]科銳逆向培訓!看雪會員減免200元!
shayi
查看公開信息
查找 shayi 發表的帖子
查找 shayi 發表的所有主題
查看 shayi 發表的精華帖
shayi

普通會員
資 料: 注冊日期: Jul 2012 帖子: 150
4 2015-02-14, 00:20:10



下面這張圖是用于生成上圖的函數調用設置:




?

[培訓]科銳逆向培訓!看雪會員減免200元!
shayi
查看公開信息
查找 shayi 發表的帖子
查找 shayi 發表的所有主題
查看 shayi 發表的精華帖
yingyue

普通會員
資 料: 注冊日期: May 2007 帖子: 2,439
5 2015-02-14, 04:38:40

不錯?。。。。。。。。。。。。。。。。。。。。
?

[公告]如果你覺得有人語言挑釁,請點每帖右上角的“舉報”按鈕!
yingyue
查看公開信息
查找 yingyue 發表的帖子
查找 yingyue 發表的所有主題

總結

以上是生活随笔為你收集整理的使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。