コマンドラインプログラムに.exeをロードしている間。この出力が得られます: http://www.privatepaste.com/22dc18e88d/output
出力からわかるように。21個のインポートされたdllを取得します。
コマンド ライン引数 .exe の pe ファイル形式の情報を解析し続けると、wsock32.dll がインポートされます。そうですか:
wsock32.dll のインポートはすべて序数です。80000000 フラグで表示されます。それらをすべて取り除くと、次のようになります。
[Import_By_Ordinal]: 00000016
[Import_By_Ordinal]: 00000003
[Import_By_Ordinal]: 00000073
[Import_By_Ordinal]: 00000017
[Import_By_Ordinal]: 00000015
[Import_By_Ordinal]: 0000000B
[Import_By_Ordinal]: 00000014
[Import_By_Ordinal]: 0000000E
[Import_By_Ordinal]: 0000000A
[Import_By_Ordinal]: 00000034
[Import_By_Ordinal]: 00000011
[Import_By_Ordinal]: 00000013
[Import_By_Ordinal]: 00000010
[Import_By_Ordinal]: 00000009
[Import_By_Ordinal]: 00000002
[Import_By_Ordinal]: 00000008
[Import_By_Ordinal]: 0000006F
[Import_By_Ordinal]: 00000097
[Import_By_Ordinal]: 00000012
[Import_By_Ordinal]: 00000004
[Import_By_Ordinal]: 0000000F
[Import_By_Ordinal]: 0000000C
現在、この情報は、EXE の pe ファイル形式を解析することで確認できます。明らかに、これらの関数の名前を取得することはできません。
00000016 の序数を確認したい場合は、dumpbin または CFF エクスプローラーを使用して wsock32.dll をロードし、そのエクスポートを調べて、00000016 に関連する関数を確認する必要があります。
私はそれをしたくありません。00000016 を取得し、どういうわけか wsock32.dll を開き、そのエクスポート テーブルを exe から取得した序数と比較する ac または c++ の方法が必要です。
現在、これは私が序数を取得する方法です:
// Start Iterating Tables
nFunctions = 0 ;
nOrdinalFunctions = 0 ;
while( (*thunkINT).u1.AddressOfData != 0 ) /* AddressOfData holds RVA
to INT with the imported API name */
{
/* Each IMAGE_THUNK_DATA structures are indicated by zero values when
you reach the end */
// If the high bit isn't set, the IMAGE_THUNK_ DATA value is an RVA to the IMAGE_IMPORT_BY_NAME.
if( !( thunkINT->u1.AddressOfData & IMAGE_ORDINAL_FLAG ) )
{
nameData = (PIMAGE_IMPORT_BY_NAME)( (*thunkINT).u1.AddressOfData );
nameData = (PIMAGE_IMPORT_BY_NAME)rvaToPtr( (DWORD)nameData,
peHeader,
(DWORD)baseAddress );
printf( "\t%s", (*nameData).Name );
printf( "\n" );
}
// Check OriginalFirstThunk ordinal and see if flag is set
// if flag is set, function is called by ordinal number. ( import by ordinal )
if( ( (*thunkINT).u1.Ordinal & IMAGE_ORDINAL_FLAG ) )
{
printf( " [Import_By_Ordinal]:\t" );
printf( "\taddress: %08X", thunkINT->u1.Ordinal );
printf( "\n" );
nOrdinalFunctions++ ;
}
thunkINT++;
thunkIAT++;
nFunctions++;
} // End of while loop
それで、EXEのインポートを解析しているときに知りたいのですが...インポート序数をDLLエクスポート序数に一致させる方法はありますか?序数の関数名を見つけますか?
これを行うには、acまたはc ++の方法が必要です。
私が探している知識を持っている人がそこにいるなら、ありがとう。これは非常に複雑で、私がやろうとしていることは多くの人に広く知られていません。
誰かが助けてくれることを願っています...
ありがとう...