色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++寫殼詳細教程(下)

jf_78858299 ? 來源:看雪論壇九陽道人 ? 作者:看雪論壇九陽道人 ? 2023-03-17 14:49 ? 次閱讀

2. 處理stub.dll

配置stub工程

將工程設置release版本,如果不想代碼被優化,可以禁止優化。

大概流程如下:

① 將數據段,只讀數據段和代碼段進行合并

② 編寫代碼獲取API的地址

③ 加入混淆指令,反調試

④ 解密/解壓縮

⑤ 加密IAT等等

之后會把存根文件stub.dll的.data,.rdata這2個區段合并到.text段并設置為可讀可寫可執行屬性,需要前置代碼

//把數據段融入代碼段
#pragma comment(linker,"/merge:.data=.text")
//把只讀數據段融入代碼段
#pragma comment(linker,"/merge:.rdata=.text")
//設置代碼段為可讀可寫可執行
#pragma comment(linker,"/section:.text,RWE")

根據之前說的已經知道殼區段就是新添加的區段了,里面將保存移植過來的stub的.text段里的所有內容,稱之為殼代碼。

而使用殼代碼的時候要注意,因為加完殼后,在殼代碼中無法使用導入表,因此,需要自己動態獲取需要使用的API函數的地址。

只要獲取到LoadLibraryExA和GetProcAddress兩個函數的地址,我們就可以根據LoadLibraryExA來獲取任意模塊dll的基地址,再使用GetProcAddress函數獲取到任意API函數的地址了。

根據kernel32基址可獲取到GetProcAddress地址。

下面是我獲取kernel32基址的內聯匯編代碼。

__asm
{
push esi;
mov esi, fs:[0x30]; //得到PEB地址
mov esi, [esi + 0xc]; //指向PEB_LDR_DATA結構的首地址
mov esi, [esi + 0x1c];//一個雙向鏈表的地址
mov esi, [esi]; //得到第2個條目kernelBase的鏈表
mov esi, [esi]; //得到第3個條目kernel32的鏈表(win10系統)
mov esi, [esi + 0x8]; //kernel32.dll地址
mov g_hKernel32, esi;
pop esi;
}

然后是獲取GetProcAddress函數的匯編代碼,可以使用C語言方式獲取,但我覺得用匯編寫,它就這樣赤裸裸呈現,能更加清晰的了解找到一個函數地址的過程。

//獲取GetProcAddress函數地址
void MyGetFunAddress()
{
__asm
{
pushad;
mov ebp, esp;
sub esp, 0xc;
mov edx, g_hKernel32;
mov esi, [edx + 0x3c]; //NT頭的RVA
lea esi, [esi + edx]; //NT頭的VA
mov esi, [esi + 0x78]; //Export的Rva
lea edi, [esi + edx]; //Export的Va

mov esi, [edi + 0x1c]; //Eat的Rva
lea esi, [esi + edx]; //Eat的Va
mov[ebp - 0x4], esi; //保存Eat

mov esi, [edi + 0x20]; //Ent的Rva
lea esi, [esi + edx]; //Ent的Va
mov[ebp - 0x8], esi; //保存Ent

mov esi, [edi + 0x24]; //Eot的Rva
lea esi, [esi + edx]; //Eot的Va
mov[ebp - 0xc], esi; //保存Eot

xor ecx, ecx;
jmp _First;
_Zero:
inc ecx;
_First:
mov esi, [ebp - 0x8]; //Ent的Va
mov esi, [esi + ecx * 4]; //FunName的Rva

lea esi, [esi + edx]; //FunName的Va
cmp dword ptr[esi], 050746547h;// 47657450 726F6341 64647265 7373;
jne _Zero; // 上面的16進制是GetProcAddress的ASCII
cmp dword ptr[esi + 4], 041636f72h;
jne _Zero;
cmp dword ptr[esi + 8], 065726464h;
jne _Zero;
cmp word ptr[esi + 0ch], 07373h;
jne _Zero;

xor ebx,ebx
mov esi, [ebp - 0xc]; //Eot的Va
mov bx, [esi + ecx * 2]; //得到序號

mov esi, [ebp - 0x4]; //Eat的Va
mov esi, [esi + ebx * 4]; //FunAddr的Rva
lea eax, [esi + edx]; //FunAddr
mov MyGetProcAddress, eax;
add esp, 0xc;
popad;
}
}

然后再獲取下MessageBoxW函數,彈出一個對話框,測試是否成功。

//運行函數
void RunFun()
{
MyLoadLibraryExA = (FuLoadLibraryExA)MyGetProcAddress(g_hKernel32, "LoadLibraryExA");
g_hUser32 = MyLoadLibraryExA("user32.dll", 0, 0);
MyMessageBoxW = (FuMessageBoxW)MyGetProcAddress(g_hUser32, "MessageBoxW");
MyMessageBoxW(0, L"大家好我是一個殼", L"提示", 0);
}

它在運行原代碼之前先運行了殼代碼,測試成功。

圖片

四、代碼段加密

我們在逆向破解的時候通常第一方法是找到關鍵字符串,關鍵代碼等,他們都是存在于代碼段的,那么只要把代碼段進行加密,這種方式就不可行了。

先在加殼器中加密,這使用簡單的亦或加密。

//加密代碼段
//1.獲取代碼段首地址
char* pTarText = GetSecHeader(pTarBuff, ".text")->PointerToRawData + pTarBuff;
//2.獲取代碼段實際大小
int nSize = GetSecHeader(pTarBuff, ".text")->Misc.VirtualSize;
for (int i = 0; i < nSize; ++i)
{
pTarText[i] ^= 0x15;
}

再到殼代碼里解密,自己寫了一個對比字符串的函數。

//自寫strcmp
int StrCmpText(const char* pStr, char* pBuff)
{
int nFlag = 1;
__asm
{
mov esi, pStr;
mov edi, pBuff;
mov ecx, 0x6;
cld;
repe cmpsb;
je _end;
mov nFlag, 0;
_end:
}
return nFlag;
}

//解密
void Decryption()
{
//獲取.text的區段頭
auto pNt = GetNtHeader((char*)g_hModule);
DWORD dwSecNum = pNt->FileHeader.NumberOfSections;
auto pSec = IMAGE_FIRST_SECTION(pNt);

//找到代碼區段
for (size_t i = 0; i < dwSecNum; i++)
{
if (StrCmpText(".text", (char*)pSec[i].Name))
{
pSec += i;
break;
}
}

//獲取代碼段首地址
char* pTarText = pSec->VirtualAddress + (char*)g_hModule;
int nSize = pSec->Misc.VirtualSize;
DWORD old = 0;
//解密代碼段
MyVirtualProtect(pTarText, nSize, PAGE_READWRITE, &old);
for (int i = 0; i < nSize; ++i) {
pTarText[i] ^= 0x15;
}
MyVirtualProtect(pTarText, nSize, old, &old);
}

五、壓縮

壓縮是一個比較復雜的過程,對于一個主要功能的加密的殼來說,壓縮也有一定的加密效果,如果使用了一些加密庫加密,即使你壓縮了,會發現加殼后的文件比沒加殼之前還要大!

圖片

這說一下壓縮大概思路,首先不能壓縮頭部,考慮到后面要處理TLS,還有一個程序的圖標在資源段,所以不壓縮這兩個段。

在加殼器中把原文件的中除了.tls和.rsrc段的其他段的數據一個一個的按順序取出來,然后拼接在一起,然后對這份拼接后數據進行一個整體的壓縮,之后需要再添加一個區段專門用于存放壓縮后的數據,這個過程中,需要把壓縮后的區段的文件偏移和文件大小都清零,如下圖所示,把.tsl段和.rsrc段移動到頭部的后面。

值得注意的是沒有處理TLS時要把TLS表的RVA和大小清零,TLS在數據目錄表的第九項。

auto pData = GetOptHeader(pTarBuff)->DataDirectory;
pData[9].Size = 0;
pData[9].VirtualAddress = 0;

運行時,先在殼代碼中進行解壓縮,再解密,然后程序就能正常運行了。

到此一個簡單的加密壓縮殼就完成了,在這個過程中實際出現了很多bug,因為涉及到DLL文件無法用VS調試, 所以使用OD或者x64dbg進行調試,推薦使用x64dbg(x32dbg),這個軟件一直在更新,而且字符串提示更友好,更方便快捷。OD主要用于脫殼破解,逆向還是x64dbg更方便。

最后再說一下VS2017使用配置:

有2個工程文件 一個是加殼器,一個是sutb。

加殼器使用x32debug編譯

sutb使用x32Release編譯

找到工程所在文件夾,新建一個bin目錄,把這兩個工程屬性中的輸出目錄改為bin,這樣操作起來方便一些,不改也行,但是加載stub時路徑就要填寫正確才行。

圖片

一個殼的基本框架就搭建完成了,而加殼主要是為了防止被別人破解,所以接下來就可以執行加密操作了,下一次再說說IAT加密,Hash加密,動態解密,反調試等技術吧。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • WINDOWS
    +關注

    關注

    4

    文章

    3551

    瀏覽量

    88841
  • C++
    C++
    +關注

    關注

    22

    文章

    2110

    瀏覽量

    73697
  • PE文件
    +關注

    關注

    0

    文章

    4

    瀏覽量

    5457
收藏 人收藏

    評論

    相關推薦

    C++一個http服務器

    本篇文章不會涉及到很多復雜的概念,也沒有很難讀懂的模板函數,代碼簡單可讀,本篇文章送給每一個想自己用C++一個http服務器的小伙伴!高手們、大佬們當然可以不用看的啦!
    發表于 09-30 10:47 ?2245次閱讀

    詳細講解C++串口的相關知識

    大家可以先參考一這篇blog,C++串口通信里面詳細講解了C++串口的相關知識,以及一些函數的講解。下面我也會根據他的blog再講解。二、實現過程1、打開串口:使用函數:HANDLE
    發表于 08-24 06:56

    詳述不用c++網頁的理由

    C++在web開發中地位如何,進來一探究竟吧。
    的頭像 發表于 12-22 10:07 ?5961次閱讀

    C++課程資料詳細資料合集包括了:面向對象程序設計與C++,算法,函數等

    本文檔的主要內容詳細介紹的是C++課程資料資料合集包括了:面向對象程序設計與C++,算法,函數,概述, C++語言基礎,構造數據類型,數據類型,C+
    發表于 07-09 08:00 ?18次下載
    <b class='flag-5'>C++</b>課程資料<b class='flag-5'>詳細</b>資料合集包括了:面向對象程序設計與<b class='flag-5'>C++</b>,算法,函數等

    基于fpgrowth的c++實現詳細資料免費下載

    本文檔的主要內容詳細介紹的是基于fpgrowth的c++實現詳細資料免費下載
    發表于 08-02 08:00 ?1次下載

    如何提高cc++的安全編程能力?《CC++安全編碼》帶你詳細學習

    ,既詳細闡述了C/C++語言及其相關庫固有的安全問題和陷阱,系統總結了導致軟件漏洞的各種常見編碼錯誤,并給出了應對錯誤的解決方案;又對C/C++
    發表于 08-28 08:00 ?0次下載

    如何進行高質量的CC++編程?高質量C++C編程指南詳細資料免費下載

    本文檔的作用內容詳細介紹的是如何進行高質量的CC++編程?高質量C++C編程指南詳細資料免費
    發表于 09-10 08:00 ?30次下載

    VISUAL C++教程之VISUAL C++的安裝和使用方法

    本文檔的主要內容詳細介紹的是VISUAL C++教程之VISUAL C++的安裝和使用方法資料免費下載。
    發表于 12-27 16:32 ?19次下載
    VISUAL <b class='flag-5'>C++</b>教程之VISUAL <b class='flag-5'>C++</b>的安裝和使用方法

    C++的cast最完整最詳細的解釋資料說明

    本文檔的主要內容詳細介紹的是C++的cast最完整最詳細的解釋資料說明。
    發表于 01-29 15:26 ?0次下載
    <b class='flag-5'>C++</b>的cast最完整最<b class='flag-5'>詳細</b>的解釋資料說明

    C++程序設計教程之C++的初步知識的詳細資料說明

    C++程序設計教程之C++的初步知識的詳細資料說明包括了:1. 從CC++,2 . 最簡單的C++
    發表于 03-14 14:48 ?31次下載
    <b class='flag-5'>C++</b>程序設計教程之<b class='flag-5'>C++</b>的初步知識的<b class='flag-5'>詳細</b>資料說明

    C++程序設計教程之C++工具的詳細資料說明

    本文檔的詳細介紹的是C++程序設計教程之C++工具的詳細資料說明主要內容包括了:1. 異常處理,2. 命名空間,3. 使用早期的函數庫
    發表于 03-14 16:39 ?4次下載
    <b class='flag-5'>C++</b>程序設計教程之<b class='flag-5'>C++</b>工具的<b class='flag-5'>詳細</b>資料說明

    C++語言編碼規范詳細說明

    本文檔的主要內容詳細介紹的是C++語言編碼規范詳細說明。
    發表于 01-07 16:19 ?14次下載
    <b class='flag-5'>C++</b>語言編碼規范<b class='flag-5'>詳細</b>說明

    C語言和C++的特點與用法詳細說明

    本文檔的主要內容詳細介紹的是C語言和C++的特點與用法詳細說明。
    的頭像 發表于 12-26 10:58 ?4431次閱讀

    qt用C++的2048小游戲源代碼

    qt用C++的2048小游戲源代碼
    發表于 09-27 11:48 ?1次下載

    C++詳細教程(上)

    本文基于Windows平臺對PE文件加的項目,經過一個月的緩沖,決定復習總結及分享的我的心得。
    的頭像 發表于 03-17 14:49 ?830次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>寫</b><b class='flag-5'>殼</b><b class='flag-5'>詳細</b>教程(上)
    主站蜘蛛池模板: 一个人的视频全免费在线观看www 一个人的免费完整在线观看HD | 一级毛片免费播放| 丰满五十六十老熟女HD60| 国产女人乱人伦精品一区二区| 久久AV国产麻豆HD真实乱| 欧美激情性AAAAA片欧美| 小sao货ji巴cao死你视频| 最近免费中文字幕完整版HD| 大相蕉伊人狼人久草av| 久久热这里面只有精品| 日韩精品无码免费专区| 在线观看亚洲AV无码每日更新| 郭德纲于谦2012最新相声| 久久婷婷久久一区二区三区| 一二三四在线视频社区8| 久久电影精品| 星空无限传媒视频在线观看视频| 国产AV视频二区在线观看| 色综合a在线| JAPANRCEP老熟妇乱子伦视频| 姐姐不~不可以动漫在线观看| 日韩高清在线亚洲专区| 变形金刚7免费观看完整| 噜妇插内射精品| 亚洲精品一二三区-久久| 第九色区av天堂| 忘忧草日本在线WWW日本| yellow日本动漫高清| 久久怡红院国产精品| 亚洲精品久久久无码| 忘忧草高清| 国产在线播放精品视频| 四虎影院网红美女| 成年人深夜福利| 久久三级视频| 99re10久久热| 里番acg纲手的熟蜜姬训练场| 2017欧美狠狠色| 久久综合色一综合色88| aaaaaaa一级毛片| 欧美另类极品videosbest|