1. 程式人生 > >利用匯編與機器碼定位崩潰點

利用匯編與機器碼定位崩潰點

roc fff adc 程序集 col 匯編代碼 water 定位 vpd

由於在公司自己寫的代碼交給測試時老是有那種我這邊正常測試那邊老是崩潰的情況。調試除了windbg OD等其時還可以簡單定位崩潰點。這是在自己搞linux時產生的想法。linux有非常強大的調試機制。
原理是源碼編譯時會生成匯編代碼與機器碼。同時有對應的地址行號等等。
開始操作。環境vs2015
寫段空指針代碼。

#include "stdafx.h"
int main(int argc, _TCHAR* argv[])

{
    char* ptr = NULL; 
    *ptr = ‘A‘;
    return 0;
}

運行發生崩潰
技術分享圖片
設置屬性 去掉隨機基址

再次運行時記下地址0x0000000140001437

生成機器碼文件 匯編文件 map文件
產生機器碼文件 匯編文件文件:屬性-c/c++-輸出文件-匯編程序輸出:程序集、機器碼和源代碼 (/FAcs) 可以直接選FAcs 一次全生成
技術分享圖片
這種是沒有偏移的
技術分享圖片
技術分享圖片
產生Map文件:屬性-連接器-調試-生成映射文件:是 (/MAP)
技術分享圖片
map我的生成在這
技術分享圖片
打開map
崩潰地址 0x0000000140001437
技術分享圖片
而 0001:00000400 main 0000000140001400 f testbug.obj
因此在testbug.obj 裏面計算偏移為37
找對應的匯編文件 .cod文件
找到偏移處
技術分享圖片

利用匯編與機器碼定位崩潰點