設計一款DLL殼需要考慮的問題

2021-07-15 10:06:04 字數 1042 閱讀 2906

先說前一點,在內存中不確定的位置意味著重定位表是必須的

第二點,程式入口點,如你所知,程式入口點在pe結構中optional->addressofentrypoint表示是乙個rva位址,即相對虛擬位址(relative virtual address),詳見pe結構介紹文章。entrypoint(入口點)系統在解析pe檔案如果是exe則直接呼叫該入口點一次。然後等著結束,遇到dll時候比較特殊,會以呼叫函式的方式首先執行一次(多執行緒另考慮).但是比較特殊的是系統通過三個引數來呼叫dll的入口函式,這段**再通過三個引數呼叫dllmain()。

加密寄主**後我們需要保證解密後**也能正常執行,但是dll對映位置不一,所以為了保證我們的dll總是能夠在揭秘後執行起來,我們需要自己對解密後的**進行重定位。

重定位的規則並沒有想象中的複雜,重定位表中指出哪些位置需要重定位,即:

該位置的值是在預設的載入基址下的偏移,比如預設基址為0x10 000 000,如果載入到記憶體中的實際基址是0x12 000 000,那麼就需要在每個重定位項指向的位址加上這個差值:0x12 000 000-0x10 000 000=0x2 000 000.所有的目標**即被重定位完成,又能正確的執行了。

另一點需要注意的地方是,如果你移動了**的位置你需要這個偏移。

當你的殼程式已經寄生在目標程式上時,如何除錯你的殼程式將是乙個不得不面對的問題。即使你的shell如此並不複雜而你又是作者,也將免對被優化和變形的**-這些**沒有符號。

我也曾為此而苦惱過。

通過嘗試我將原shell的符號檔案.pdb在ida中通過修正載入基址成功將shell部分的符號起到作用。

方法如下:

file->load file->pdb file->

address輸入shell的實際載入位置,顯然這個位置是shell部分mz所在位置而不是當前整個寄生檔案的起始。

2023年9月8日星期四 23:31更新

快取設計需要考慮的問題

前言 沒有一種快取方案可以解決一切的業務場景或資料型別,我們需要根據自身的特殊場景和背景,選擇最適合的快取方案 一.是否需要使用快取 需要使用快取的業務場景 比如前台頁面展示,購物車 二.快取物件的粒度 一種資料乙個物件,簡單,讀取寫入都快,但是種類一多,快取的管理成本就會很高 多種資料放在乙個集合...

程式設計策略 設計一款APP的步驟

偉大的程式起源於乙個偉大的想法,但這並不意味著講想法孕育成成功的程式是一件輕鬆的事。本文介紹的是一些能用於精煉想法 回顧設計選擇 design options 的策略,幫助我們設計出人見人愛的程式。在開發早期就完成程式的定義,能夠幫你講一堆想法和屬性凝聚成乙個使用者夢寐以求的產品。在開發過程中,可以...

設計一款給父母使用的手機

1 需求分析 設計一款給父母用的手機,要讓父母用著舒心,我們也放心。設計給父母的手機不需要太複雜,但是至少要包含通話,簡訊,娛樂的功能。2 組內分工 我是第一組,我們四個人沒有明確的分工,大家一起討論 交流,分享各自父母對手機的需求,取其中的精華。當團隊的想法出新分歧時,我們會取折中的辦法,盡量兼顧...