最近遇到乙個注入過程中崩潰的問題,花了比較長的時間定位,寫下來記錄一下
一、背景
我寫了乙個程序s,s程序會執行時會監控程序中是否有i程序在執行,如果i程序運動的話,s程序就注入乙個my.dll到i程序中,並在i程序中執行乙個myfunc的函式
如下圖
我寫完程式後,執行測試,功能是沒有錯誤的,一切正常。。。
二、 問題和分析
我的程式安裝採用了winrar的自解壓檔案,自解壓完成後,自解壓程式會執行s程式
然後手工啟動i程序後,發現i程序崩潰了。崩潰報告使用vs2008去除錯可以看到如下內容
從崩潰上,崩潰在某個執行緒上,熟悉注入**同學應該可以猜到應該是崩潰在注入時使用的createremotethread上了。
下面介紹一下我寫的注入的過程
1、 利用windows apicreateremotethread在i程序中建立遠端執行緒
2、 執行緒的執行緒函式為i程序中的某個函式位址
3、 這個函式位址中有如下**流程將被執行
上面的函式中的**以二進位制的形式被注入到程序的記憶體中,這段**是沒有pdb檔案也沒有**原始檔的
**如下
hmodule huser32= loadlibrary("user32.dll");
farproc pmessagebox = getprocaddress(huser32," messagebox ");
// load the injected dll into this process
hmodule h = loadlibrary("mydll.dll");
if(!h)
// get the addressof the export function
farproc p =getprocaddress(h, "myfunc");
if(!p)
// so we do notneed a function pointer inte***ce
__asm call p
// exit the threadso the loader continues
exitthread(0);
我懷疑了
i程序還沒有載入到必須的dll
i程序是否主視窗沒有完全顯示,
許可權不足
做了一些嘗試後,基本上排除了上面的可能性,這也是定位過程的「走彎路時間t_t」
因為我在myfunc的入口處也寫了日誌,myfunc完全沒有呼叫,然後通過prces***plorer發現mydll.dll並沒有被載入
也就是說**崩潰在上面的**中我使用黃色底色標識出的那幾行中,到底為什麼會崩潰呢?
因為createremotethread的函式位址我們是知道的,直接使用ollydbg檢視那段記憶體。
一目了然啊,在getprocesaddress這個位址上,崩潰的程序的記憶體中明顯是個錯誤位址。
getprocessaddress函式位址=kernal32.dll的load address + getprocessaddress偏移位址(如下圖getprocessaddress的偏移位址是0x00011222)
通過prces***plorer發現崩潰時kernal32.dll的load address和未崩潰時的kernal32.dll的load address是一致的。
也就是說getprocessaddress
偏移位址被修改了,導致了崩潰
基本上就是懷疑winrar自解壓程式修改getprocessaddress的偏移位址,為了驗證寫了乙個驗證程式
**如下,列印getprocaddress的位址
farproc getprocaddress = null;
// get the address of the main dll
hmodule kernel32 =loadlibrarya("kernel32.dll");
getprocaddress =getprocaddress(kernel32, "getprocaddress");
debugprintf(_t("*****====get procadd 0x%8x"),getprocaddress);
測試結果:
第一條日誌是直接執行測試程式的輸出,也是正確的getprocaddress的位址,
第二條是winrar自解壓執行的結果,是錯誤的。
解決這個問題,我放棄了使用winrar自解壓程式做安裝包,改用inno setup。
三 總結
原來定位問題都需要pdb來定位到**行才可以去分析問題,個別極端情況下,沒有pdb,但是了解了**實現思路,使用olldbg也可以非常精準的定位問題。
一次GC問題定位
同事有段 執行時間過長,需要進行優化,hashmultimapmap for 400w 96 剛開始以為是計算過程docompute效率低造成的,所以想各種方法優化計算,提前計算 多執行緒 等等等等,最終如下 多執行緒計算 計算結果放入佇列 concurrentlinkedqueue queue q...
一次Mycat聚合排序問題定位
mycat mysql實現分庫分表 功能需要遍歷表,資料量有點大,於是通過id排序分頁查詢。在實現過程中發現有部分id查不出來,功能排期只能被迫延後。在確認了 和sql語句沒有問題後,目光轉至mycat與mysql排序邏輯上來。確認了mycat與mysql排序邏輯有問題,至少mycat與mysql排...
一次sql注入攻擊
喜歡學習 但是不想找漏洞 好麻煩 還不一定有乙個漏洞 是我在google上搜到的 畫面看著高大上 乙個頁面乙個頁面的找,尋找有輸入引數的地方,然後進行測試 本來我以為沒有注入的時候 突然 看到了一小句話 wow 有報錯資訊 可以進行報錯注入 想著可以提交烏雲了 然後先 order by 測試下有幾個...