0
typedef void (WINAPI *voidfunc)(void);
typedef HMODULE (WINAPI *strfunc1)(char*);
typedef HMODULE (WINAPI *strfunc2)(void*,char*);
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
    HMODULE kernel=GetModuleHandleA("kernel32.dll");
    if(!kernel)return 1;
    strfunc1 LoadLibrary16=(strfunc1)GetProcAddress(kernel,"LoadLibrary16");
    if(!LoadLibrary16){ 
        MessageBoxA(0,"LoadLibrary16 is not imported","err",0);
        return 1;
    }
    HMODULE user=LoadLibrary16("user.exe");
    if(!user){  
        MessageBoxA(0,"user.exe is not loaded","err",0);
        return 1;
    }
    strfunc2 GetProcAddress16=(strfunc2)GetProcAddress(kernel,"GetProcAddress16");
    if(!GetProcAddress16){  
        MessageBoxA(0,"GetProcAddress16 is not imported","err",0);
        return 1;
    }
    voidfunc enable=(voidfunc)GetProcAddress16(user,"EnableOemLayer");
    voidfunc disable=(voidfunc)GetProcAddress16(user,"DisableOemLayer");
    if(!(enable&&disable))return 1;
    disable();
    Sleep(5000);
    enable();

    return 0;
}

不工作。

PS我的操作系统是Win 7。

PPS 首先我简单地尝试了 LoadLibraryA,得到了错误,读了一点,明白我需要 16 位未记录的函数。

4

3 回答 3

3

恐怕 kernel32.dll 中没有 16 位函数。可以找到的功能是

LoadLibraryA
LoadLibraryExA
LoadLibraryExW
LoadLibraryW

一个有用的工具是依赖,你可以从 http://www.dependencywalker.com/找到它

于 2012-05-05T20:11:47.183 回答
1

LoadLibrary16 和 GetProcAddress16 在 kernel32.dll 中不存在

快照

于 2012-05-06T15:53:51.377 回答
1

只有 Windows 95/98/ME 上的 kernel32.dll 具有 LoadLibrary16 和 GetProcAddress16 并且它们不按名称导出。

于 2015-05-07T16:11:10.553 回答