記事ディレクトリ
Windowsハッキングプログラミングシリーズ
VSとウィンドウのプログラミングは非常に困難であり、操作のすべてのステップを見つけるのに長い時間がかかります。
リソース解放
ウイルストロイの木馬は、プログラムをより簡潔にすることができるため、リソース解放テクノロジを広範囲に使用します。
- プログラムがサードパーティのDLLファイル、テキストファイル、画像ファイル、またはその他のオーディオファイルやビデオファイルをロードする必要がある場合は、プログラムにリソースとして挿入できます。
- プログラムが実行されるのを待ってから、ローカルに解放します。
これの利点は、他のファイルを添付する必要なしに、コンパイルされたプログラムに実行ファイルが1つしかないため、プログラムが非常に簡潔になり、発見されるリスクが軽減されることです。
リソース挿入
環境:VS2019
新しいコンソールプログラムを作成するだけです。
- リソースファイルを右クリック->追加->リソース
- [カスタム]を選択し、入力するリソースの種類を入力します。MYTYPESと入力します。
- MYTEPESタイプを選択し、インポートをクリックします
- 次に、挿入するファイルを挿入します。
- 挿入が完了したら、リソースファイルが正常に挿入されたかどうかを確認します。表示->他のウィンドウ->リソースビュー
リソース抽出を実行する
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#undef UNICODE
#include <Windows.h>
#include <stdio.h>
#include "resource.h"
// 提取资源
BOOL FreeMyResourse(UINT uiResouceName, char *lpszResourceType, char* lpszSaveFileName)
{
HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(uiResouceName), lpszResourceType);
if (hRsrc == NULL)
{
printf("can't find the resource!\n");
return FALSE;
}
DWORD dwSize = SizeofResource(NULL, hRsrc);
if (dwSize <= 0)
{
printf("the resource's size is error!\n");
return FALSE;
}
HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
if(hGlobal == NULL)
{
printf("load resource error!\n");
return FALSE;
}
LPVOID lpVoid = LockResource(hGlobal);
if (lpVoid == NULL)
{
printf("lock resource error!\n");
return FALSE;
}
FILE* fp = NULL;
fopen_s(&fp, lpszSaveFileName, "wb+");
if (fp == NULL)
{
printf("open file error!\n");
return FALSE;
}
fwrite(lpVoid, sizeof(char), dwSize, fp);
fclose(fp);
return TRUE;
}
int main()
{
char lpszResourceType[20] = "MYTYPES";
char szSaveFileName[20] = "555.txt";
BOOL flag = FreeMyResourse(IDR_MYTYPES2, lpszResourceType, szSaveFileName);
if (flag == TRUE)
{
printf("the resource is free!\n");
}
return 0;
}
555.txtが正常に抽出されたことがわかります。
中に発生した小さな問題
- タイプ「char *」の実パラメーターは、タイプ「LPCWSTR」の仮パラメーターと互換性がありません
- 未定義の識別子「IDR_MYTYPES2」
最初の質問:
#undef UNICODE
ヘッダーファイルの前にこの行を追加するだけです。
2番目の質問:
#include "resource.h"
この識別子は、上記のリソースの挿入の最後の部分に示されていますが、resource.hヘッダーファイルが導入されていないため、プログラムはこの識別子を定義していません。
DLLの読み込みが遅れました
プログラムを開発するときは、通常、サードパーティのライブラリが使用されます。ただし、すべてのサードパーティライブラリが静的ファイルを提供するわけではなく、ほとんどがDLLファイルを提供するため、プログラムは対応するDLLファイルをロードして起動する必要があります。
DLL遅延読み込みテクノロジは、遅延読み込みを使用して実行可能ファイルをコンパイルおよびリンクする方法です。このようにして、実行可能プログラムを最初にロードして実行し、正式に呼び出されたときに依存DLLを再度ロードすることができます。
このテクノロジーは、リソースリリーステクノロジーと組み合わせて使用できます。つまり、DLLファイルをexeファイルのリソースセクションにロードし、リソースとDLLの遅延ロードを解放することにより、発見の可能性を減らします。1つのexeファイルのみ、追加のDLLはありませんファイル、およびDLLファイルを失う心配はありません。
DLLファイルを遅延ロードする方法
- プロジェクトを右クリック->プロパティ->リンカー->入力->遅延読み込みDLL
- 遅延させる必要のあるDLLファイルを入力し、[OK]をクリックします