有關殼問題的一些總結

2021-08-17 04:03:01 字數 2389 閱讀 4983

重定位問題

資訊互動問題

如何寫殼**

api函式的呼叫問題

重定位問題

資訊互動問題

除錯問題

關於目標程式的隨機基址

7.關於目標程式的匯入表

8.關於動態加解密

9.關於tls的處理

考慮到自己的專案是用c++寫的,可以直接把編好的**生成乙個dll檔案,然後將dll檔案的**直接拷貝過去即可,(這裡要注意乙個問題,只是將**拷貝過去,而不是乙個完整的pe檔案,也就是說,只把這個dll檔案的**拷過去,匯入表,重定位表什麼的其他表都沒有」帶過去」),考慮到**不可避免的會使用到到一些全域性變數,故而將**段與資料段合併到一起是很有必要的,這樣我們只需要拷貝乙個區段就可以了,合併區段可以利用下面**,將區段設定為可讀可寫可執行:

#pragma comment(linker,"/merge:.data=.text")

#pragma comment(linker,"/merge:.rdata=.text")

#pragma comment(linker,"/section:.data=.text,rwe")

原始pe檔案中99%會呼叫系統api,殼**大部分情況下也是需要呼叫api的,一般情況下,我們呼叫api是通過pe檔案中的匯入表中的iat表來實現的(一般程式在載入的時候,iat表裡面會被填入api的位址),上面已經講到,dll**被考入目標exe裡面的時候,其匯入表並沒有被」帶過來」,因此當我們把殼**拷貝至目標程式的時候,呼叫api的地方肯定會出錯!解決這個問題有兩個辦法:

1.動態獲取api

2.在目標程式中構建出殼**的匯入表,並修改目標程式的資料目錄表

動態獲取api

在網上有很多這類文獻資料,這裡找到一些:

如何動態獲取api對抗win7中aslr安全機制

如何獲取kernel32位址

獲取kernel32基址

獲取kernel32基址方法學習筆記

主要邏輯如下:

要想獲得任何乙個api函式的位址,可以採用loadlibrary和getprocaddress這兩個函式,而這兩個函式本身也是api,這兩個api在kernel32.dll這個模組裡面,而這個模組又是任何乙個程序所必須載入的,而如何找到kernel32的載入基址呢,fs暫存器指向teb暫存器,teb+0x30處指向peb結構體,peb+0x0c處又指向peb_ldr_data結構,peb_ldr_data+0x1c存放著一些動態鏈結庫位址,第乙個指向ntdll.dll,第二個就指向kernel32.dll位址

mov ebx,fs:[0x30]   //得到peb結構體的位址

mov ebx,[ebx + 0xc] //得到ldr結構體的位址

mov ebx,[ebx + 0xc] //得到ldr.inloadordermodulelist

.flink 第乙個模組,當前程序

mov ebx,[ebx] //得到第二個模組位址 ntdll.dll

mov ebx,[ebx] //得到第三個模組位址 kernel32.dll

mov ebx,[ebx+0x18] //得到第三個模組位址(kernel32模組的dllbase)

動態獲取api中有關函式指標的問題:

typedef lpvoid(winapi *pfngetprocaddress)(_in_ hmodule hmodule,_in_ lpcstr lpprocname);

表示定義了乙個函式指標;(為什麼要定義函式指標看下面:)

apis.pfngetprocaddress = (pfngetprocaddress)mygetprocaddress(hkernel32, "getprocaddress");

位址 = 返回值型別(就是指標型別) 函式名 (實參1,,實參2)

由於函式的返回值是乙個位址,故返回型別要是乙個指標型別!

殼**中不可避免的會使用全域性變數,而涉及到全域性變數則會涉及到重定位問題,可以參考之前寫的一篇文章:

重定位問題

我們寫的殼**在跑起來的時候,可能會用到一些資料,但是這些資料在寫殼**的時候是不知道的,比如目標程式的oep,被加密區域大小等,這些資料都是在加殼程式執行中才能獲得的,必須要把這些資料以一種得體的方式放入殼**裡面,有一種比較好的方法就是在殼部分到出乙個全域性變數,然後在加殼的時候使用符號找到這個全域性結構體變數,之後把需要用到的資料寫入進去.

對殼的一些理解

需要兩個檔案 待加殼的a.exe和加殼程式。加殼程式對a.exe檔案處理後,對a.exe做的手腳也就是清除或者加密原檔案的iat和各個段 和資料段等 並且會在a.exe檔案中新增加一些內容,這些內容可能獨立的在乙個新的段中,也可能在原來的段中,一般新的內容是可執行的,這些新的內容就構成了外殼程式 外...

有關OpenCV的一些基礎問題

opencv是intel公司推出的優秀的視覺庫,它提供了許多與視覺計算相關的函式,極大的方便了開發人員。但是,由於它和我們常用的微軟體系的軟體有所不同,還是讓我困惑了許久,現在我就把不同之處整理出來,希望對大家有所幫助。1 opencv在用cvloadimage時,自動將帶有調色盤的影象在記憶體內轉...

有關於使用者體驗的一些總結

首先分享一句話 使用者是沒有錯的,如果使用者在使用某物品的時候遇到麻煩,那是因為設計出了問題。諾曼 設計心理學 認識使用者 使用者永遠都沒有錯。使用者都是特別忙,特別沒有耐心的人。使用者永遠都比你想象的聰明。使用者體驗對產品的重要性 不論使用者訪問的是什麼型別產品,都是乙個自助的行為。他們所能依靠的...