拡張カーネルに新しい機能を追加しようとして失敗した話

COMCTL32.DLL をラッパーにして、実行ファイルのマニフェストをスキャンして、Version 6.0 か 5.8x を動的にロードする仕組みを作ってみました。

extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
 int *p,q,r;
 DWORD pr,md;
 char fn[640]={0};
 char cmct[] = "cmctl600.dll";
 switch(dwReason)
 {
 case DLL_PROCESS_ATTACH:
  if(_KdwExeInfo&2){
   *(int*)(cmct+5) = '.006';
   md=6;
  } else if( (_KdwExeInfo>>16)<5 ){
   *(int*)(cmct+5) = '.185';
   md=4;
  } else {
   *(int*)(cmct+5) = '.285';
   md=5;
  }
  h_original = LoadLibraryA(cmct);  

結果。

WINLOGON.DLL のロードでタイムアウトするようになってしまった(・ω・) ガーン!
ちゃんとロードはできてるのに…どうしてどうして‥‥

おすすめ

3件のフィードバック

  1. のん より:

    禁断のDllMainでLoadLibraryしたから?

  2. 黒翼猫 より:

    >>1
    LoadLibrary を DllMain でよんではいけない理由が、再帰的ループが発生する可能性が
    あるから、なので再帰的ループが発生しないなら問題ないのです。
    (ログでもループは発生していないのです)

  3. のん より:

    ちょっとWin10のWinSxSで試してみたら、5.82/6.0は共にLoadLibrary/FreeLibraryは正常だしプロセスにロード/アンロードもされてることは確認できたけど、6.0はGetProcAddress(“comctl32.dll”)がNULLで返ってきたのでWin32APIにWinSxSの細工がされてるのかも?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です