Frost Moon Project

Src/sslib/ApiHook.cpp -MagicPNG Ver.1.00- - Frost Moon Project   アクセスランキング  

Home > ソフトウェア > MagicPNG > MagicPNG100.zip > Src > sslib > ApiHook.cpp

 
//ApiHook.cpp
//IAT書き換えによるApiHook

#include"../StdAfx.h"
#include"ApiHook.h"
#include<imagehlp.h>

namespace sslib{
namespace apihook{

void replace(PCSTR callee_mod_name,PROC current_pfn,PROC new_pfn,HMODULE mod_caller){
    //モジュールのインポートセクションのアドレスを取得する
    ULONG data_size;

    PIMAGE_IMPORT_DESCRIPTOR import_descriptor=NULL;
    import_descriptor=static_cast<PIMAGE_IMPORT_DESCRIPTOR>(::ImageDirectoryEntryToData(mod_caller,
                                                                                   true,
                                                                                   IMAGE_DIRECTORY_ENTRY_IMPORT,
                                                                                   &data_size));

    if(import_descriptor==NULL){
        //このモジュールにはインポートセクションがない
        //もしくは現在ロードされていない
        return;
    }

    //呼び出し先の関数への参照が含まれているインポート記述子を検索する
    for(;import_descriptor->Name;import_descriptor++){
        PSTR mod_name=reinterpret_cast<PSTR>(reinterpret_cast<PBYTE>(mod_caller)+import_descriptor->Name);

        if(lstrcmpiA(mod_name,callee_mod_name)==0){
            //呼び出し元のIATで呼び出し先関数を取得する
            PIMAGE_THUNK_DATA thunk_data=reinterpret_cast<PIMAGE_THUNK_DATA>(reinterpret_cast<PBYTE>(mod_caller)+import_descriptor->FirstThunk);

            //現在の関数アドレスを新しい関数アドレスと置き換える
            for(;thunk_data->u1.Function;thunk_data++){
                //関数アドレスのアドレスを取得する
                PROC* ppfn=reinterpret_cast<PROC*>(&thunk_data->u1.Function);
                DWORD protect_bak=0;

                if(*ppfn!=current_pfn)continue;

                //保護状態変更
                if(!VirtualProtect(ppfn,sizeof(PROC),PAGE_READWRITE,&protect_bak)){
                    return;
                }
                ::WriteProcessMemory(::GetCurrentProcess(),ppfn,&new_pfn,sizeof(new_pfn),NULL);
                //保護状態を元に戻す
                ::VirtualProtect(ppfn,sizeof(PROC),protect_bak,&protect_bak);
                return;
            }
        }
    }
}

//namespace apihook
}
//namespace sslib
}


Home > ソフトウェア > MagicPNG > MagicPNG100.zip > Src > sslib > ApiHook.cpp