Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.137.218.230] |
|
Сообщ.
#1
,
|
|
|
Добрый.
Имеется win32 библиотека, в одном месте потребовалось заменить функцию LoadLibrary_Helper, на импортную GetModuleHandle Имеется такая функция, место где нужно заменить функцию 01D02BCF .text:01D02B7C loc_1D02B7C: ; CODE XREF: sub_1D02B60+12↑j .text:01D02B7C 57 push edi .text:01D02B7D 68 03 01 00 00 push 103h ; size_t .text:01D02B82 8D 85 FD FE FF FF lea eax, [ebp+szModulePath+1] .text:01D02B88 53 push ebx ; int .text:01D02B89 50 push eax ; void * .text:01D02B8A 88 1D 68 61 D1 01 mov byte_1D16168, bl .text:01D02B90 89 1D 8C 62 D1 01 mov dword_1D1628C, ebx .text:01D02B96 88 9D FC FE FF FF mov [ebp+szModulePath], bl .text:01D02B9C E8 6F 18 00 00 call _memset .text:01D02BA1 8D 8D FC FE FF FF lea ecx, [ebp+szModulePath] .text:01D02BA7 68 04 01 00 00 push 104h ; size_t .text:01D02BAC 51 push ecx ; char * .text:01D02BAD E8 FE F2 FF FF call sub_1D01EB0 .text:01D02BB2 8B 3D 30 00 D1 01 mov edi, ds:OutputDebugStringA .text:01D02BB8 83 C4 14 add esp, 14h .text:01D02BBB 84 C0 test al, al .text:01D02BBD 74 54 jz short loc_1D02C13 .text:01D02BBF E8 7C F8 FF FF call IsAppRunning .text:01D02BC4 84 C0 test al, al .text:01D02BC6 74 44 jz short loc_1D02C0C .text:01D02BC8 8D 95 FC FE FF FF lea edx, [ebp+szModulePath] .text:01D02BCE 52 push edx ; lpMultiByteStr .text:01D02BCF E8 8C F0 FF FF ------------------> call LoadLibrary_Helper ; HMODULE __stdcall LoadLibrary_Helper(LPCSTR lpLibFileName); .text:01D02BD4 83 C4 04 add esp, 4 .text:01D02BD7 89 06 mov [esi], eax .text:01D02BD9 3B C3 cmp eax, ebx .text:01D02BDB 75 63 jnz short loc_1D02C40 Нужно пропатчить вызов на это FF 15 18 10 D1 01 call ds:GetModuleHandleA Но т.к здесь для патча требуется больше 5 байтов, то воспользуемся пространством выравнивания поблизости и реализуем некую thunk-функцию. .text:01D02E21 sub_1D02CA0 endp .text:01D02E21 .text:01D02E21 ; --------------------------------------------------------------------------- .text:01D02E23 CC CC CC CC dd 0CCCCCCCCh .text:01D02E27 .text:01D02E27 ; =============== S U B R O U T I N E ======================================= .text:01D02E27 .text:01D02E27 ; Attributes: thunk .text:01D02E27 .text:01D02E27 -------------------> ; HMODULE __stdcall GetModuleHandleA_Thunk(LPCSTR lpModuleName) .text:01D02E27 GetModuleHandleA_Thunk proc near .text:01D02E27 FF 25 18 00 D1 01 jmp ds:__imp_GetModuleHandleA .text:01D02E27 GetModuleHandleA_Thunk endp .text:01D02E27 .text:01D02E27 ; --------------------------------------------------------------------------- .text:01D02E2D CC CC CC align 10h .text:01D02E30 ; Exported entry 16. App_Shutdown .text:01D02E30 .text:01D02E30 ; =============== S U B R O U T I N E ======================================= .text:01D02E30 .text:01D02E30 .text:01D02E30 public sub_1D02E30 .text:01D02E30 sub_1D02E30 proc near ; CODE XREF: sub_1D02FD0:loc_1D0308E↓p И эту thunk-функцию мы можем заменить там, высчитываем разницу адресов и патчим функцию. В итоге мы получаем такой вид. .text:01D02B7C loc_1D02B7C: ; CODE XREF: sub_1D02B60+12↑j .text:01D02B7C 57 push edi .text:01D02B7D 68 03 01 00 00 push 103h ; size_t .text:01D02B82 8D 85 FD FE FF FF lea eax, [ebp+szModulePath+1] .text:01D02B88 53 push ebx ; int .text:01D02B89 50 push eax ; void * .text:01D02B8A 88 1D 68 61 D1 01 mov byte_1D16168, bl .text:01D02B90 89 1D 8C 62 D1 01 mov dword_1D1628C, ebx .text:01D02B96 88 9D FC FE FF FF mov [ebp+szModulePath], bl .text:01D02B9C E8 6F 18 00 00 call _memset .text:01D02BA1 8D 8D FC FE FF FF lea ecx, [ebp+szModulePath] .text:01D02BA7 68 04 01 00 00 push 104h ; size_t .text:01D02BAC 51 push ecx ; char * .text:01D02BAD E8 FE F2 FF FF call sub_1D01EB0 .text:01D02BB2 8B 3D 30 00 D1 01 mov edi, ds:OutputDebugStringA .text:01D02BB8 83 C4 14 add esp, 14h .text:01D02BBB 84 C0 test al, al .text:01D02BBD 74 54 jz short loc_1D02C13 .text:01D02BBF E8 7C F8 FF FF call IsAppRunning .text:01D02BC4 84 C0 test al, al .text:01D02BC6 74 44 jz short loc_1D02C0C .text:01D02BC8 8D 95 FC FE FF FF lea edx, [ebp+szModulePath] .text:01D02BCE 52 push edx ; lpMultiByteStr .text:01D02BCF E8 53 02 00 00 ------------------> call GetModuleHandleA_Thunk ; HMODULE __stdcall GetModuleHandleA_Thunk(LPCSTR lpModuleName); .text:01D02BD4 83 C4 04 add esp, 4 .text:01D02BD7 89 06 mov [esi], eax .text:01D02BD9 3B C3 cmp eax, ebx .text:01D02BDB 75 63 jnz short loc_1D02C40 А теперь о проблеме, поскольку я заменяю на импортируемую функцию, то в этом месте во время загрузки адрес к импортируемой функции не ребейзится как положено, отсюда закономерно происходит краш приложения. Я точно знаю, что такие вещи нужно делать с обновлением информации в IAT, но не уверен где конкретно, ткните носом пожалуйста. |
Сообщ.
#2
,
|
|
|
Решил, нужно добавить запись в Relocations таблице.
|