Windows 프로그래밍 요약 DLL

27970 단어
+--    --+--      --+--    -------------+
|   V1.0   |   2014.9.16  | yin_caoyuan@126.com |
+----------+--------------+---------------------+


       《Windows    (   )》 19,20,22121. Dll          ;
    2.                  ;
    3.    dll;
    4.         ;
    5.         ;
    6.      ;
    7.      ;
    8. DLL    ;
    9.          ;
    10.      ;
    11. DLL   ;
    12. API   ;
     121:        dll               ;
    2~5:      dll              ,           ;
    6~8:      dll           ;
    9~10:     dll          ,           ;
    11~12:    dll      ,    DLL     API     ; 
  ,1~89~12         1~81. DLL          :
               dll       ,     dll                  。
  :
  dll              ,                ,    dll     ,    dll             。    dll        new      ,        dll   ,          。
  dll     ,dll   “    ”     。
            dll  ,dll                 ,         dll                ,                   。
       dll          C    ,    dll     mallocfree      ,             C    ,free        malloc      。      ,                ,                  。
void* DllAllocMem()
{
    return (malloc(100));
}
void DllFreeMem(void* pv)
{
    free(pv);
}


2.                  
  dll              ,     ,                  。
       ,             ,              dll           。
       ,             ,        dll,             ,    。
          ,             ,     .lib   ,   .lib          。
          ,    .lib   ,   .dll               。
     dll,                   ,     #pragma comment(lib,"xxx.lib")   ,            .lib   。
     dll        :
LoadLibrary(pszDllPathName);        //    dll          
LoadLibraryEx(pszDllPathName, hFile, dwFlags);      //       
FreeLibrary(hInstDll);              //            dll 
GetModuleHandle(pszModuleName);     //                   
FARPROC GetProcAddress(hInstDll, pszSymbolName);    //    dll         。
                      dll     ,    ,               ,                 dll。
                    dll    (        dll         ),              。


3.    dll
dll         :
       testdll.h
a.cpp    b.cpp    c.cpp
  |        |        |
  V        V        V
               
  |        |        |
  V        V        V
a.obj    b.obj    c.obj
     \     |     /
      V    V    V
             <-- (.def)
           |
           V
       .dll, .lib
   :
         .cpp      ,     __declspec(dllexport)          、  、 C++    ,       .obj                 
   :
       .obj         ,               (export section),              、        ,             RVA(relative virtual address),          dll       。
  ,                .lib   ,   .lib         dll      。
       dumpbin.exe (  -exports   )      .dll       :
...
ordinal hint  RVA      name
   1    0     00001010 ReadBinaryFileToBuffer = ReadBinaryFileToBuffer
   2    1     00001090 WriteBinaryFileWithBuffer = WriteBinaryFileWithBuffer
...
  ,hint    ,             dll       ,name          ,  RVA        ,        dll          。
  :
    1.       __declspec(dllexport):
                     ,    、  、C++       。     __declspec(dllexport)                  。
    2.     .dll         ?
             ,      dll         ,        。
                              。      ,      dll         dll         。
    3.     .lib         ?
              .dll        dll       ,         .lib  ?
        .lib             dll     ,       dll      。   .def          .lib   ,   .lib         。
    4. C++         :
        C++        C++      ,   C++         ,   ReadBinaryFileToBuffer       ?ReadBinaryFileToBuffer@@YGKPB_WPAEI@Z,           ,            。
           C++       ,  C   ,     C++     dll   C        ,C        ReadBinaryFileToBuffer        。
        C++         ,        : extern "C" ,                     。  : extern "C"   C++    ,C             。
             C++    dll,                extern "C"
    5.    C++         :
             C++ ,     ,        ,     extern "C"    ,          C++               C++                   ,        C++  ,       C++              。  ,                dll                  ,          dll     。
    6. C          :
             C            ,       ,         C++,Microsoft   C        C         ,  C++            , ReadBinaryFileToBuffer      _ReadBinaryFileToBuffer@12
               VC    C      dll   ,     dll             ,                     ReadBinaryFileToBuffer
                        .def 。
                 .obj      ,   .obj           ,   _ReadBinaryFileToBuffer@12,    .def   ,   .def      ReadBinaryFileToBuffer,         ,        .def                。
          :    .cpp         __declspec(dllexport)       ,  .def           ,       。
        
        
4.        
          :
        testexe.h
a.cpp    b.cpp    c.cpp
  |        |        |
  V        V        V
               
  |        |        |
a.obj    b.obj    c.obj
     \     |     /
      V    V    V
              <-- (.lib)
           |
           V
       testexe.exe
   :
     .cpp       .obj  ,       dll     (        dll),            。
   :
    .obj     ,    .lib          、     ,.lib        dll       ,                  ,          dll。
                   ,             。       .lib       dll       ,     error Link2091:           xxxFunc,                   。
            ,                    ,                        ,           ,                  。
            ,                   ,      (import section)。             dll   ,      dll         。
       dumpbin.exe (   -imports   )           :
...
TestDll.dll
    4020B4 Import Address Table
    40242C Import Name Table
        0 time date stamp
        0 Index of first forwarder reference
        1 _WriteBinaryFileWithBuffer@12
        0 _ReadBinaryFileToBuffer@12
...
  ,TestDll.dll             dll    ,Import Address Table          ,  TestDll.dll      ,dll                  ,    。Import Name Table         ,       TestDll.dll        。
  :
    1.           ,          dll,  dll        。   Import Address Table    ,       dll       , Import Address Table       。
    2. .lib           ,       dll        ,                         dll ,       ,             dll     。
    3.        pexports.exe     .dll     .def,      VC   lib.exe     .def     .lib   。
    
    
5.        
    :
    1.            ;
    2.                 ;
    3.            ,               ,      dll    ;
    4.    dll     ,     dll       dll,           dll    ;
    5.               ,               。            ,          dll     ,       ,      ,   dll         RVA           ,                     。
    6.         ,                         ,   Import Address Table       。
    7.                ,    Import Address Table          ,             、  、C++  。
  :
    1.        dll    ,           dll,        :“    ,         xxx.dll”
    2.                ,    dll                 ,        :“      xxxFunc            xxx.dll  ”
    
    
6.      
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:    // dll          ,    DllMain     DLL_PROCESS_ATTACH
        break;
    case DLL_THREAD_ATTACH:     //          ,          DllMain     DLL_THREAD_ATTACH, DllMain                    
        break;
    case DLL_THREAD_DETACH:     //         ,    ExitThread   ,          ExitThread     DllMain     DLL_THREAD_DETACH
        break;
    case DLL_PROCESS_DETACH:    //   dll            ,     dll          DllMain     DLL_PROCESS_DETACH
        break;
    }
    return TRUE;
}
   hModule     dll      ;
   lpReserved    dll       ,        lpReserved    ,        lpReserved    ;
   ul_reason_for_call   DllMain       ,      4     : DLL_PROCESS_ATTACH,DLL_THREAD_ATTACH,DLL_THREAD_DETACH,DLL_PROCESS_DETACH
  :
    1. DLL    DllMain          ,  DllMain      ,   DLL   DllMain         ,        DllMain       DLL       ,       。Platform SDK      DllMain              ,           ,      ,      。         User,Shell,ODBC,COM,RPC       ,            DLL          。
    2.      Dll           C++   ,        ,    DllMain       ,                   。
    3.   DllMain    DLL_PROCESS_ATTACH    , DllMain           DLL        ,        DllMain     FALSE ,      ,      。
    4.     DLL_PROCESS_DETACH        ,            ,     DLL   DLL_PROCESS_DETACH        ,      。     TerminateProcess       ,      DllMain      DLL_PROCESS_DETACH   。
    5.     DLL_THREAD_DETACH        ,            ,     TerminateThread       。


7.      
     (function forwarder)  DLL          ,                DLL        。  ,  dumpbin.exe(-exports)      kernel32.dll             :
1486  5CD  WaitForThreadpoolIoCallbacks (forwarded to NTDLL.TpWaitForIoCompletion)
1487  5CE  WaitForThreadpoolTimerCallbacks (forwarded to NTDLL.TpWaitForTimer)
1488  5CF  WaitForThreadpoolWaitCallbacks (forwarded to NTDLL.TpWaitForWait)
1489  5D0  WaitForThreadpoolWorkCallbacks (forwarded to NTDLL.TpWaitForWork)
       4       。
            kernel32.dll ,           ,        kernel32.dll                NTDLL.dll  ,      NTDLL.dll        。         WaitForThreadpoolIoCallbacks    ,        NTDLL   TpWaitForIoCompletion   。
            kernel32.dll ,                WaitForThreadpoolIoCallbacks ,   GetProcAddress     kernel32.dll        ,    WaitForThreadpoolIoCallbacks         ,         GetProcAddress ,  NTDLL.dll         TpWaitForIoCompletion
   pragma    ,         dll           。    :
#pragma comment(linker, "/export:SomeFunc=DllWork.SomeOtherFunc")
   pragma      ,      DLL          SomeFunc    ,      SomeFunc         SomeOtherFunc    ,             DllWork.dll     。                      pragma。
  :
pragma              :
DLLTEST_LIB int DllTestFunc()
{
    return 10;
}
#pragma comment(linker, "/export:DllTestFunc=FileSystem.fnFileSystem")
      ,       dll        dll         。     dll      dll        ,            。


8. DLL    
DLL                         DLL                   。
      DLL          。
// TODO      DLL      ,          。
DLL       Windows2000          ,    ,            ,dll            ,           dll    ,      DLL Hell    。
        DLL      ,              dll   ,             dll     。
// TODO        DLL    ,    DLL                 。


9.          :
         DLL            (preferred base address),                        。                ,                0x00400000。  DLL     ,             0x10000000 。
      dumpbin.exe(/headers)            :
OPTIONAL HEADER VALUES
         10B magic # (PE32)
        9.00 linker version
        1200 size of code
         C00 size of initialized data
           0 size of uninitialized data
        1630 entry point (00401630)
        1000 base of code
        3000 base of data
      400000 image base (00400000 to 00405FFF)    <--        0x00400000
                     :
             :(       0x00400000)
MOV    [0x00414540],5
  DLL        :(       0x10000000)
MOV    [0X10014540],5
              dll,        ,dll                   0x10000000  ;
             dll,    ,        dll          0x10000000,    dll         0x10000000  ,    dll         0x10000000   。     ,          dll         ,        。
  dll                       。   dll        0x20000000  ,     dll              0x2xxxxxxx,             。
                   。                       ,                   。
          :
1.     VS             :     -->     -->    -->   
2.      dll       ,   Rebase.exe   ,                           ,    dll          ,      。
Rebase.exe                            ,                ,                     。(0x1xxxxxxx      0x2xxxxxxx)


10.      
              :
              Import Address Table ,           ,          ,           dll ,   dll     ,        RVA ,      RVA            ,                      Import Address Table   ;
                dll     ,       Import Address Table             ,      。
Import Address Table       dll            +RVA。RVA  dll          ,                dll          。         dll         ,           Import Address Table         。        Import Address Table     dll      ,               ,               。
              dll            ,       Import Address Table   dll           RVA     ,               。
VS     Bind.exe            dll   。
Bind.exe               ,     dll      RVA,            Import Address Table  。
  :
    1.       Bind.exe      dll         ,dll            。
    2.      Bind.exe        ?      Windows      dll      ,          Windows        ,                    。
    

11. DLL   
     DLL                ,                        。
    1.          DLL:
    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\                   : AppInit_Dlls,LoadAppInit_Dlls,   AppInit_Dlls             dll   ,  LoadAppInit_Dlls       1。  User32.dll              ,    DLL_PROCESS_ATTACH   ,  User32.dll             ,    AppInit_Dlls    ,    LoadLibrary        dll。
           User32.dll                 DLL   ,        ,     GUI         ,           。          ,                         dll,        dll          。
    
    2.    Windows       DLL:
                   ,           ,                     ,           。       SetWindowsHookEx   :
    HHOOK SetWindowsHookEx(
        int idHook,         //         ,   WH_KEYBOARD         ,WH_GETMESSAGE         Post          
        HOOKPROC lpfn,      //     ,        ,         ,                  ,            dll  ;          ,       dll  。
        HINSTANCE hMod,     //      dll,    dll      lpfn   。
        DWORD dwThreadId    //           ,      0   ,                。
        )
       A    SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, hInstDll, 0)        :
        0.    A     SetWindowsHookEx   ,    hInstDll               , GetMsgProc        A          ;
        1.     B             Post     ;
        2.              WH_GETMESSAGE   ;
        3.      GetMsgProc     DLL          B       ;
        4.    DLL      ,          DLL       B       ;
        5.        GetMsgProc     B          ,           : GetMsgProc B = hInstDll B + (GetMsgProc A - hInstDll A)
        7.       B          GetMsgProc   ;
             , hInstDll    DLL         B  ,     dll          B       , dll              B         。
      :
        1. hInstDll            ?
        2. GetMsgProc      B      ,   A                 B     ?
        
    3.             DLL
          ,                   ,          ,              ,             ,           LoadLibrary ,     DLL         。
    Windows     CreateRemoteThread   :
    HANDLE CreateRemoteThread(
        HANDLE hProcess,                     //       
        LPSECURITY_ATTRIBUTES psa,           //     
        SIZE_T dwStackSize,                  //      
        LPTHREAD_START_ROUTINE lpStartAddr,  //       ,                 ,                          。
        LPVOID lpParameter,                  //           
        DWORD dwCreationFlags                //          ,  : CREATE_SUSPENDED
        LPDWORD lpThreadId                   //    Id
    )
          LoadLibrary          CreateRemoteThread,   LoadLibrary       dll ,      DLL    :
    HANDLE hThread = CreateRemoteThread(hProcessRemote, NULL, 0, LoadLibraryW, L"C:\\MyLib.dll", 0, NULL)
              :
        1. LoadLibraryW       kernel32.dll      ,        kernel32.dll    ,   LoadLibraryW                ,    CreateRemoteThread     LoadLibraryW ,     LoadLibraryW       ,    LoadLibraryW      。  lpStartAddr                   ,             ,           LoadLibraryW。            LoadLibraryW          ,      CreateRemoteThread 。
                GetProcAddress    LoadLibraryW   kernel32.dll     ,         dll          kernel32.dll           ,       , LoadLibraryW        LoadLibraryW   kernel32.dll     。
        PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("kernel32")), "LoadLibraryW")
        HANDLE hThread = CreateRemoteThread(hProcessRemote, NULL, 0, pfnThreadRtn, L"C:\\MyLib.dll", 0, NULL)
        2. CreateRemoteThread     "C:\\MyLib.dll"                         。                  ,    。                    ,       。
                 VirtualAllocEx             ,   ReadProcessMemory   WriteProcessMemory           ,  "C:\\MyLib.dll"          。
        LPVOID lpRemoteMemory = VirtualAllocEx(hProcessRemote, 0, sizeof(L"C:\\MyLib.dll"), MEM_COMMIT, PAGE_READWRITE)
        BOOL bRet = WriteProcessMemory(hProcessRemote, lpRemoteMemory, L"C:\\MyLib.dll", sizeof(L"C:\\MyLib.dll"), 0)
        HANDLE hThread = CreateRemoteThread(hProcessRemote, NULL, 0, pfnThreadRtn, lpRemoteMemory, 0, NULL)
                  ,       VirtualFreeEx                 。
        3.           ,    dll           ,         CreateRemoteThread ,         FreeLibrary ,       dll         。
        :http://blog.csdn.net/g710710/article/details/7303081
    
    4.      DLL     DLL
          ,                 DLL     。    dll        dll         ,                  。
                       ,        dll           ,        .exe       。           .exe   .dll      。
    
    
12. API   
DLL                     ,             。  ,                          ,API         Windows     ,          。
          API    ,        DLL   ,                   。
              API:
    dll      ,                   ,            dll       ,                 ,                     ,          。
  ,           ,                          。       ,      :
    1.            ;
    2.             dll,          API    dll         ;
    3.       dll       ,         API         。              API      ,                   ,                    ;
    4.        ,             API    ;
       ,            :
    1. PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToData(hExeMod, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize);  // IMAGE_DIRECTORY_ENTRY_IMPORT                 ;           PIMAGE_IMPORT_DESCRIPTOR         ;
    2. PIMAGE_IMPORT_DESCRIPTOR:             dll       , Name        dll    , FirstThunk     PIMAGE_THUNK_DATA    ,       dll             ;
    3. PIMAGE_THUNK_DATA: PIMAGE_THUNK_DATA.u1.Function               ;       GetProcAddress         ,                       ;
    4. WriteProcessMemory                       ;
           ,           :
    PROC pfnOri = GetProcAddress(GetModuleHandle("kernel32"), "ExitProcess");    //    ExitProcess          ;
    HMODULE hExeMod = GetModuleHandle("Database.exe");                           //           ;
    ULONG ulSize;                                                                //            
    PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(hExeMod, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize);
    for(;pImportDesc->Name;pImportDesc++){                                       //      ,  dll   
        PSTR pszModName = (PSTR)((PBYTE)hExeMod + pImportDesc->Name);            //    dll       
        if(lstrcmpiA("kernel32.dll", pszModName) == 0 ){                         //        kernel32.dll    
            PIMAGE_THUNK_DATA pTrunk = (PIMAGE_THUNK_DATA)((PBYTE)hExeMod + pImportDesc->FirstThunk);
            for(;pTrunk->u1.Function;pTrunk++) {                                 //     kernel32.dll       
                PROC* ppfn = (PROC*)&pTrunk->u1.Function;
                if(ppfn == pfnOri){                                              //    pfnOri   ppfn,    ,   pTrunk      ExitProcess         
                    WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew, sizeof(pfnNew), NULL)    //        pfnNew    ppfn
                    return;
                }
            }
        }
    }
             Database.exe     ExitProcess      ,Database.exe   ExitProcess    ,          pfnNew    ;
      :                  ,    API    ,           dll         ;
                ,      《Windows    》     ;

좋은 웹페이지 즐겨찾기