0

コマンドラインプログラムに.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 ++の方法が必要です。

私が探している知識を持っている人がそこにいるなら、ありがとう。これは非常に複雑で、私がやろうとしていることは多くの人に広く知られていません。

誰かが助けてくれることを願っています...

ありがとう...

4

1 に答える 1

0

Windows API には、この変換を実行する機能がないようです。ライブラリのエクスポートを一覧表示するための API すらありませんが、比較的簡単に実行できるはずです。おそらく、そのコードを変更して、序数から名前へのマッピングを抽出してみてください。

于 2013-01-05T20:44:10.760 に答える