Windows Phone 8加载外部动态链接库DLL(非安装包内的)

Windows Phone 8加载外部动态链接库DLL(非安装包内的)

在《动态加载与插件化》中大概介绍了下,wp8加载非安装包的下动态链接库,这次详细梳理下。

加载外部DLL主要的原理:

  1. 通过NtCurrentTeb获得线程环境块
  2. 从线程环境块中获得进程环境块
  3. 在进程环境块中加载过得DLL链表
  4. 从链表中找到kernelbase.dll的模块句柄
  5. 从kernelbase.dll中获得LoadLibraryEx函数地址
  6. 加载指定地址下的DLL

相关的结构体:

typedef struct _CLIENT_ID 

{  

    PVOID UniqueProcess;  

    PVOID UniqueThread;  

CLIENT_ID;  

 

//模块链表实体

typedef struct _MODULE_LIST_ENTRY

{

    struct  _MODULE_LIST_ENTRYFlink;

    struct  _MODULE_LIST_ENTRYBlink;

    DWORDbaseAddress;

}MODULE_LIST_ENTRY;

 

//进程加载的模块信息

typedef struct _PEB_LDR_DATA

{

//    BYTE fill[0x1c]; x86

    ULONG Length;

    BOOLEAN Initialized;

    PVOID SsHandle ;

    LIST_ENTRY InLoadOrderModuleList;

    LIST_ENTRY InMemoryOrderModuleList;

    MODULE_LIST_ENTRYinitModuleList;

}PEB_LDR_DATA;

 

//进程环境块

typedef struct _PEB

{

//    BYTE fill[0x0c]; x86

    BYTE Reserved1[2];

    BYTE BeingDebugged;

    BYTE Reserved2[1];

    PVOID Reserved3[2];

    PEB_LDR_DATAldr;

}PEB;

 

//线程环境块

typedef struct _TEB

{

    //BYTE fill[0x30]; x86

    NT_TIB nt_tib;

    PVOID EnvironmentPointer;

    CLIENT_ID id;

    PVOID ActiveRpcHandle;

    PVOID ThreadLocalStoragePointer;

    PEBcurrentPEB;

}TEB;

 

typedef HMODULE(*LoadLibraryEx)(

    LPCTSTR lpLibFileName,

    HANDLE hFile,

    DWORD dwFlags

    );

 

获取kernelbase.dll模块句柄的类定义

namespace Anye
{
    namespace Native
    {
        public ref class DllHandle sealed
        {
            friend ref class NativeInterop;
            friend class NativeHelper;
        public:
            int GetModule();
        private:
            HMODULE _handle;
            DllHandle(HMODULE handle); 
                //获取指定名称的函数地址
            voidGetFunction(LPCSTR name);
        };

 

        public ref class NativeInterop sealed
        {
        public:
            NativeInterop();
            //加载指定路径下的DLL
            DllHandleLoadLibrary(Platform::String^ name); 
    //获取KernelBase.dll的模块句柄
            DllHandleGetKernel();
            int GetModule();
        private:
            DllHandle_kernel;
            LoadLibraryEx _loadLibrary;
            HMODULE getKernelModule();
        };

 

        class NativeHelper
        {
        public:
            NativeHelper(const wchar_t* path);
            voidGetFunction(LPCSTR name);
        private:
            DllHandle_interop;
        };
        
    }
}

 

 

主要的加载逻辑

HMODULE NativeInterop::getKernelModule()
{
    //获取线程环境快
    TEBteb NtCurrentTeb();
    获取KernelBase.dll的模块句柄PS:保险点的方法市历遍DLL初始化链表通过模块名称确定
    return (HMODULEteb->currentPEB->ldr->initModuleList->Flink->baseAddress;
}

 

DllHandleNativeInterop::LoadLibrary(Platform::Stringname)
{
    if (_loadLibrary == nullptr)//获取LoadLibraryExW函数地址
        _loadLibrary (LoadLibraryEx)_kernel->GetFunction("LoadLibraryExW");
    
    HMODULE module _loadLibrary(name->Data(), nullptr0);
    if (module != nullptr)
        return ref new DllHandle(module);

 

    return nullptr;
}

 

voidDllHandle::GetFunction(LPCSTR name)
{
    return GetProcAddress(_handlename);
}

 

 

NativeHelper

NativeHelper::NativeHelper(const wchar_tpath)
{
    auto inter ref new NativeInterop();
    StringpathString (Platform::String^)Platform::StringReference(path);
    _interop inter->LoadLibrary(pathString);
}

 

voidNativeHelper::GetFunction(LPCSTR name)
{
    return _interop->GetFunction(name); 
}

 

下面是加载wp手机SD卡上的plugin.dll的例子

动态库项目

 

 

动态链接库逻辑

extern "C"
{
    __declspec(dllexportvoidCreate();
}

 

namespace Plugin
{
    class IPlugin
    {
    public:
        virtual void Show(Platform::String^ msg0;
    };

 

    class TestPlugin public IPlugin
    {
    public:
        TestPlugin()
        {

 

    }

 

        void Show(Platform::Stringmsg)
        {
        (ref new Windows::UI::Popups::MessageDialog(msg))->ShowAsync();
        }
    };
}

 

voidCreate()
{
    return new Plugin::TestPlugin();
}

 

加载外部动态链接库

class IPlugin
{
public:
    virtual void Show(Platform::String^ msg0;
};

 

void NativeEntry::Load(Platform::Stringpath)
{    //path  D:\\Downloads\\plugin.dll,D盘就是sd
    Anye::Native::NativeHelpernew Anye::Native::NativeHelper(path->Data());
    CreateFunc func
    func (CreateFunc)h->GetFunction("Create");

 

    IPluginplugin (IPlugin*)func();

 

    plugin->Show("我是"+path+"里的插件^_^");
}

 

好了例子就到这了,我们获得了LoadLibraryExW函数,不局限于加载外部DLL,也可以去加载系统的DLL,去访问一些微软未公开的API,如只读访问注册表信息

Anye::Native::NativeInterop interop;
    auto interop.LoadLibrary("ADVAPI32LEGACY.DLL");

 

    Anye_RegCreateKeyEx (RegCreateKeyFunc)GetFunc(h->GetModule(), "RegCreateKeyW");
    Anye_RegSetValueEx (RegSetValueFunc)GetFunc(h->GetModule(), "RegSetValueW");
    Anye_RegQueryValueEx (RegQueryValueFunc)GetFunc(h->GetModule(), "RegQueryValueW");
    Anye_RegCloseKey (RegCloseKeyFunc)GetFunc(h->GetModule(), "RegCloseKey");
    Anye_RegOpenKey (RegOpenKeyFunc)GetFunc(h->GetModule(), "RegOpenKeyW");
    Anye_RegEnumKey (RegEnumKeyFunc)GetFunc(h->GetModule(), "RegEnumKeyW");

 源码:https://onedrive.live.com/redir?resid=30D5EB407F085DD8!31587&authkey=!ABzmTswcDh91WQw&ithint=file%2czip

转载于:https://www.cnblogs.com/anye6488/p/3915852.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值