Windows 프로그래밍 요약 DLL
+-- --+-- --+-- -------------+
| V1.0 | 2014.9.16 | yin_caoyuan@126.com |
+----------+--------------+---------------------+
《Windows ( )》 19,20,22 。
12 :
1. Dll ;
2. ;
3. dll;
4. ;
5. ;
6. ;
7. ;
8. DLL ;
9. ;
10. ;
11. DLL ;
12. API ;
12 :
1: dll ;
2~5: dll , ;
6~8: dll ;
9~10: dll , ;
11~12: dll , DLL API ;
,1~8 ,9~12 1~8 ;
1. DLL :
dll , dll 。
:
dll , , dll , dll 。 dll new , dll , 。
dll ,dll “ ” 。
dll ,dll , dll , 。
dll C , dll malloc , free , 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 》 ;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.