Сейчас на форуме: tyns777, zds, JustLife (+4 невидимых)

 eXeL@B —› Программирование —› GetProcAddress в АП другого процесса
Посл.ответ Сообщение

Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 19 февраля 2010 07:51
· Личное сообщение · #1

Привет. Прошу мне помочь, так как уже весь извелся и не могу найти решение. Есть цикл debugapi, в котором я запускаю мой таргет, таргет подгружает свою dll через LoadLibrary, вопрос в следующем - как мне из моего цикла debugapi получить адрес функции из dll?

ps. GetProcAddress не катит! т.к. он только для АП текущего процесса



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 19 февраля 2010 08:07
· Личное сообщение · #2

Av0id
Образы одинаковы в обоих процессах одного и тогоже модуля. Подгрузить в текущий, найти RVA функци и добавить к базе модуля в целевом процессе. Либо удалнно исполнить свой код.



Ранг: 137.9 (ветеран), 45thx
Активность: 0.080
Статус: Участник

Создано: 19 февраля 2010 14:41
· Личное сообщение · #3

Av0id
инжект в процесс не работает?




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 19 февраля 2010 15:09 · Поправил: DenCoder
· Личное сообщение · #4

Clerk, если системная dll, то большая вероятность, что да. А если нет? В одном процессе dll может быть загружена по одному адресу, в другом - по другому.

Если нужен инжект, то лучше всего присвоить процессу Debug привилегию вот так

Code:
  1.          HANDLE hToken;
  2.          ImpersonateSelf(SecurityImpersonation);
  3.          if(!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES, false, &hToken))
  4.          {
  5.                  wchar_t wmsg[0x100];
  6.                  wsprintf(wmsg, L"Ошибка %X", GetLastError());
  7.                  //MessageBox(NULL, wmsg, L"", MB_OK);
  8.          }
  9.  
  10.          TOKEN_PRIVILEGES* tp = (TOKEN_PRIVILEGES*)new BYTE[sizeof(TOKEN_PRIVILEGES) + (PRIVILEGE_COUNT - 1) * sizeof(LUID_AND_ATTRIBUTES)];
  11.  
  12.          tp->PrivilegeCount = PRIVILEGE_COUNT;
  13.          tp->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  14.          tp->Privileges[1].Attributes = SE_PRIVILEGE_ENABLED;
  15.  
  16.          LUID luid;
  17.          LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luid);
  18.          tp->Privileges[0].Luid = luid;
  19.          LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);
  20.          tp->Privileges[1].Luid = luid;
  21.  
  22.          AdjustTokenPrivileges(hToken, false, tp, sizeof(TOKEN_PRIVILEGES) + 8, NULL, NULL);
  23.  
  24.          CloseHandle(hToken);
  25.          delete[] tp;


Только SE_SHUTDOWN_NAME убрать, если не надо.

CreateRemoteThread с LoadLibrary и разбирать секцию импорта или то же самое, только в своем процессе тоже hMod = LoadLibrary или hMod = GetModuleHandle, Addr = GetProcAddress, Disp = Addr - hMod и hDebugProcessProcAddr = hDebugProcessMod + Disp. Базу в чужом процессе можно узнать через PEB вот так

Code:
  1. MOV EAX,DWORD PTR FS:[30]
  2. MOV EAX,DWORD PTR DS:[EAX+0C]
  3. MOV ESI,DWORD PTR DS:[EAX+1C]
  4. LODS DWORD PTR DS:[ESI]
  5.  
  6. ;Added by DenCoder
  7. MOV EDX, EAX
  8. LOOP:
  9. MOV EAX, DWORD PTR DS:[EDX+8]; Сам Handle
  10. MOV ECX, DWORD PTR DS:[EDX+18]; UNICODE Path модуля
  11. ...
  12.  
  13. MOV EDX,DWORD PTR DS:[EAX]; Указатель на следующий элемент в списке
  14. CMP EDX, [ESI]
  15. JNZ LOOP
  16. END:


Только, разумеется вставить, где надо сравнение имени модуля и при инжекте скорректировать смещения.

Последняя моя версия восстановления от хуков и выгрузки инжектированной dll
Code:
  1.          __asm
  2.          {
  3.                  jmp finish
  4. start:
  5.                  push esi
  6.                  push edi
  7.                  push ebx
  8.                  push edx
  9.  
  10.                  call DefineAddress
  11. DefineAddress:
  12.                  pop edx
  13.                  mov edi, offset DefineAddress
  14.                  sub edi, edx
  15.  
  16.                  mov eax, offset wLenAddress
  17.                  sub eax, edi
  18.                  mov edx, eax
  19.                  mov ebx, [eax]
  20.                  mov eax, offset wModuleAddress
  21.                  sub eax, edi
  22.                  mov esi, eax
  23.                  mov eax, [eax]
  24.                  add eax, ebx
  25.                  mov ecx, ebx
  26.  
  27. FindSlash:
  28.                  cmp word ptr [eax - 2], 0x5C
  29.                  jz CorrAddr
  30.  
  31.                  dec eax
  32.                  dec eax
  33.                  dec ecx
  34.                  dec ecx
  35.                  jnz FindSlash
  36.                  
  37. CorrAddr:
  38.                  sub ebx, ecx
  39.                  mov [edx], ebx
  40.                  mov [esi], eax
  41.  
  42.                  mov eax, fs:[0x30]
  43.                  mov eax, [eax + 0xC]
  44.                  mov edx, [eax + 0x1C]
  45.                  mov esi, edx
  46.  
  47. modloop:
  48.                  mov ecx, [edx + 0x18]; Path
  49.                  test ecx, ecx
  50.                  jz NextMod
  51.  
  52.                  movzx ebx, word ptr [edx + 0x14]; длина
  53.                  mov eax, ebx
  54.                  add ecx, ebx
  55.  
  56. FindSlash2:
  57.                  cmp word ptr [ecx - 2], 0x5C
  58.                  jz CorrLen
  59.                  
  60.                  dec ecx
  61.                  dec ecx
  62.                  dec ebx
  63.                  dec ebx
  64.                  jnz FindSlash2
  65.  
  66. CorrLen:
  67.                  sub eax, ebx
  68.                  mov ebx, eax
  69.  
  70.                  //код сравнения
  71.                  mov eax, offset wLenAddress
  72.                  sub eax, edi
  73.                  cmp ebx, [eax]
  74.                  jnz NextMod
  75.  
  76. cmploop:
  77.                  mov eax, offset wModuleAddress
  78.                  sub eax, edi
  79.                  mov eax, [eax]
  80.                  mov ax, [eax]
  81.                  cmp ax, [ecx]
  82.                  jnz Corr
  83.  
  84.                  mov eax, offset wModuleAddress
  85.                  sub eax, edi
  86.                  inc dword ptr [eax]
  87.                  inc dword ptr [eax]
  88.                  inc ecx
  89.                  inc ecx
  90.                  dec ebx
  91.                  dec ebx
  92.                  jnz cmploop
  93.                  jmp RestoreQuerySystemInfo
  94.  
  95. Corr:
  96.                  movzx eax, word ptr [edx + 0x14]
  97.                  sub eax, ebx
  98.                  mov ecx, offset wModuleAddress
  99.                  sub ecx, edi
  100.                  sub [ecx], eax
  101.  
  102. NextMod:
  103.                  mov edx, [edx]; следующий элемент
  104.                  cmp edx, esi
  105.                  jnz modloop
  106.                  jmp end
  107.  
  108. RestoreQuerySystemInfo:
  109.                  push dword ptr [edx + 8]; Handle
  110.  
  111.                  mov edx, offset NtQueryAddress
  112.                  sub edx, edi
  113.                  mov edx, [edx]
  114.                  cmp byte ptr [edx], 0xE9
  115.                  jnz RestoreCreateProcessA
  116.  
  117.                  mov eax, [edx + 1]
  118.                  lea eax, [edx + eax + 0x14]
  119.                  mov cl, [eax]
  120.                  mov [edx], cl
  121.                  mov eax, [eax + 1]
  122.                  mov [edx + 1], eax
  123.  
  124.                  push 5
  125.                  push edx
  126.                  call FlushMemoryCache
  127.  
  128. RestoreCreateProcessA:
  129.                  mov edx, offset CreateProcessAAddress
  130.                  sub edx, edi
  131.                  mov edx, [edx]
  132.                  cmp byte ptr [edx], 0xE9
  133.                  jnz RestoreCreateProcessW
  134.  
  135.                  mov dword ptr [edx], 0x8B55FF8B
  136.                  mov byte ptr [edx + 4], 0xEC
  137.  
  138.                  push 5
  139.                  push edx
  140.                  call FlushMemoryCache
  141.  
  142. RestoreCreateProcessW:
  143.                  mov edx, offset CreateProcessWAddress
  144.                  sub edx, edi
  145.                  mov edx, [edx]
  146.                  cmp byte ptr [edx], 0xE9
  147.                  jnz UnloadModule
  148.  
  149.                  mov dword ptr [edx], 0x8B55FF8B
  150.                  mov byte ptr [edx + 4], 0xEC
  151.  
  152.                  push 5
  153.                  push edx
  154.                  call FlushMemoryCache
  155.  
  156. UnloadModule:
  157.                  mov edx, offset FreeLibraryAddress
  158.                  sub edx, edi
  159.                  call [edx]
  160.  
  161.                  jmp end
  162. FreeLibraryAddress:
  163.                  xor eax, eax
  164.                  xor eax, eax
  165. NtQueryAddress:
  166.                  xor eax, eax
  167.                  xor eax, eax
  168. CreateProcessAAddress:
  169.                  xor eax, eax
  170.                  xor eax, eax
  171. CreateProcessWAddress:
  172.                  xor eax, eax
  173.                  xor eax, eax
  174. wModuleAddress:
  175.                  xor eax, eax
  176.                  xor eax, eax
  177. wLenAddress:
  178.                  xor eax, eax
  179.                  xor eax, eax
  180. FlushInstructionCacheAddress:
  181.                  xor eax, eax
  182.                  xor eax, eax
  183. GetCurrentProcessAddress:
  184.                  xor eax, eax
  185.                  xor eax, eax
  186. OpenEventAddress:
  187.                  xor eax, eax
  188.                  xor eax, eax
  189. SetEventAddress:
  190.                  xor eax, eax
  191.                  xor eax, eax
  192. CloseHandleAddress:
  193.                  xor eax, eax
  194.                  xor eax, eax
  195. wEventNameAddress:
  196.                  xor eax, eax
  197.                  xor eax, eax
  198. wcsrchrAddress:
  199.                  xor eax, eax
  200.                  xor eax, eax
  201.  
  202. end:
  203.                  mov edx, offset wEventNameAddress
  204.                  sub edx, edi
  205.                  push dword ptr [edx]
  206.                  push 0
  207.                  push 0x1F0003
  208.                  mov edx, offset OpenEventAddress
  209.                  sub edx, edi
  210.                  call [edx]
  211.  
  212.                  test eax, eax
  213.                  jz Exit
  214.  
  215.                  push eax
  216.                  mov esi, eax
  217.                  mov edx, offset SetEventAddress
  218.                  sub edx, edi
  219.                  call [edx]
  220.  
  221.                  push esi
  222.                  mov edx, offset CloseHandleAddress
  223.                  sub edx, edi
  224.                  call [edx]
  225.  
  226. Exit:
  227.                  pop edx
  228.                  pop ebx
  229.                  pop edi
  230.                  pop esi
  231.                  retn 4
  232.  
  233. FlushMemoryCache:
  234.                  push ebp
  235.                  mov ebp, esp
  236.                  push edx
  237.  
  238.                  mov edx, offset GetCurrentProcessAddress
  239.                  sub edx, edi
  240.                  call [edx]
  241.  
  242.                  mov edx, offset FlushInstructionCacheAddress
  243.                  sub edx, edi
  244.  
  245.                  push dword ptr [ebp + 0xC]
  246.                  push dword ptr [ebp + 8]
  247.                  push eax
  248.                  call [edx]
  249.  
  250.                  pop edx
  251.                  pop ebp
  252.                  retn 8
  253.  
  254. finish:
  255.          }


Только еще через WriteProcessMemory нужно прописать для всего, что кончается на 'Address' правильные адреса

Code:
  1.                                        HANDLE hProcess = OpenProcess(dwAccess, false, spCur->ProcessId);
  2.                                        if(hProcess)
  3.                                        {
  4.                                           wchar_t* wEventName = L"ForHiding";
  5.                                           BYTE* lpAddress = (BYTE*)VirtualAllocEx(hProcess, NULL, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  6.  
  7.                                           DWORD dwProcessWritten = 0, dwThreadId = 0, fOldProtect;
  8.                                           BYTE* StartAddress, *EndAddress;
  9.                                           if(bUnload)
  10.                                           {
  11.                                             __asm
  12.                                             {
  13.                                              mov eax, offset start
  14.                                              mov StartAddress, eax
  15.  
  16.                                              mov eax, offset finish
  17.                                              mov EndAddress, eax
  18.                                             }
  19.  
  20.                                             VirtualProtect(StartAddress, EndAddress - StartAddress, PAGE_EXECUTE_READWRITE, &fOldProtect);
  21.  
  22.                                             __asm
  23.                                             {
  24.                                              mov eax, offset NtQueryAddress
  25.                                              mov edx, _NtQuerySystemInformation
  26.                                              mov [eax], edx
  27.  
  28.                                              mov eax, offset FreeLibraryAddress
  29.                                              mov edx, _FreeLibrary
  30.                                              mov [eax], edx
  31.  
  32.                                              mov eax, offset CreateProcessAAddress
  33.                                              mov edx, _CreateProcessA
  34.                                              mov [eax], edx
  35.  
  36.                                              mov eax, offset CreateProcessWAddress
  37.                                              mov edx, _CreateProcessW
  38.                                              mov [eax], edx
  39.  
  40.                                              mov eax, offset GetCurrentProcessAddress
  41.                                              mov edx, _GetCurrentProcess
  42.                                              mov [eax], edx
  43.  
  44.                                              mov eax, offset FlushInstructionCacheAddress
  45.                                              mov edx, _FlushInstructionCache
  46.                                              mov [eax], edx
  47.  
  48.                                              mov eax, offset OpenEventAddress
  49.                                              mov edx, _OpenEventW
  50.                                              mov [eax], edx
  51.  
  52.                                              mov eax, offset SetEventAddress
  53.                                              mov edx, _SetEvent
  54.                                              mov [eax], edx
  55.  
  56.                                              mov eax, offset CloseHandleAddress
  57.                                              mov edx, _CloseHandle
  58.                                              mov [eax], edx
  59.  
  60.                                              mov eax, offset wLenAddress
  61.                                              mov ecx, wlen
  62.                                              lea ecx, [ecx * 2]
  63.                                              mov [eax], ecx
  64.  
  65.                                              mov eax, offset wModuleAddress
  66.                                              mov edx, offset finish
  67.                                              mov ecx, lpAddress
  68.                                              sub ecx, StartAddress
  69.                                              add edx, ecx
  70.                                              mov [eax], edx
  71.  
  72.                                              mov eax, offset wEventNameAddress
  73.                                              mov ecx, wlen
  74.                                              lea ecx, [ecx * 2 + 2]
  75.                                              
  76.                                              add edx, ecx
  77.                                              mov [eax], edx
  78.                                             }
  79.                                             DWORD dwWritePos = 0;
  80.                                             WriteProcessMemory(hProcess, lpAddress, StartAddress, EndAddress - StartAddress, &dwProcessWritten);
  81.                                             dwWritePos += dwProcessWritten;
  82.                                             WriteProcessMemory(hProcess, (BYTE*)lpAddress + dwWritePos, wModule, wlen * 2 + 2, &dwProcessWritten);
  83.                                             dwWritePos += dwProcessWritten;
  84.                                             WriteProcessMemory(hProcess, (BYTE*)lpAddress + dwWritePos, wEventName, wcslen(wEventName) * 2 + 2, &dwProcessWritten);
  85.                                           }
  86.  
  87.                                           HANDLE hEvent;
  88.                                           hEvent = CreateEvent(NULL, false, false, wEventName);
  89.  
  90.                                           //NtStatus = NtSuspendProcess(hProcess);
  91.                                           for(int i = 0; i < spCur->ThreadCount; i++)
  92.                                           {
  93.                                             HANDLE hThread = OpenThread(dwThreadAccess, false, (DWORD)spCur->Threads[i].ClientId.UniqueThread);
  94.  
  95.                                             if(hThread)
  96.                                             {
  97.                                              SuspendThread(hThread);
  98.  
  99.                                              CloseHandle(hThread);
  100.                                             }
  101.                                           }
  102.                                           HANDLE hRemThread1, hRemThread2;
  103.                                           if(bUnload)
  104.                                           {
  105.                                             hRemThread1 = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpAddress, NULL, CREATE_SUSPENDED, &dwThreadId);
  106.                                             if(hRemThread1)
  107.                                             {
  108.                                              ResumeThread(hRemThread1);
  109.                                              WaitForSingleObject(hRemThread1, INFINITE);
  110.                                              CloseHandle(hRemThread1);
  111.                                             }
  112.  
  113.                                             if(WaitForSingleObject(hEvent, 1000) == WAIT_TIMEOUT)
  114.                                              wmsg = L" unload timeout";
  115.                                             else wmsg = L" reinjected";
  116.  
  117.                                             VirtualFreeEx(hProcess, lpAddress, 0, MEM_RELEASE);
  118.                                           }
  119.  
  120.  
  121.                                           //if(!bUnload)
  122.                                           //{
  123.                                             if(WaitForSingleObject(hEvent, 1000) == WAIT_TIMEOUT)
  124.                                              wmsg = L" timeout";
  125.                                    CloseHandle(hEvent);
  126.                                           //}
  127.  
  128.                                           //NtResumeProcess(hProcess);
  129.                                           for(int i = 0; i < spCur->ThreadCount; i++)
  130.                                           {
  131.                                             HANDLE hThread = OpenThread(dwThreadAccess, false, (DWORD)spCur->Threads[i].ClientId.UniqueThread);
  132.  
  133.                                             if(hThread)
  134.                                             {
  135.                                              ResumeThread(hThread);
  136.  
  137.                                              CloseHandle(hThread);
  138.                                             }
  139.                                           }
  140.                                           CloseHandle(hProcess);
  141.                                        }
  142.                                        else wmsg = L" couldn't open process";


-----
IZ.RU





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 19 февраля 2010 16:06
· Личное сообщение · #5

Нафиг такой изврат? Подгружаем эту же dll в адресное пространство процесса-отладчика, используя LoadLibraryA, далее через GetProcAddress ищем адрес интересующей нас функции, теперь определим через psapi адрес загрузки интересующей нас либы в отлаживаемом процессе. Далее, из значения, которое нам вернуло GetProcAddress вычитаем значение, которое вернуло LoadLibraryA, и получившееся значение плюсуем к адресу, определённого посредством psapi-функций. Всё!

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 61.4 (постоянный), 1thx
Активность: 0.020
Статус: Участник

Создано: 19 февраля 2010 16:15
· Личное сообщение · #6

> Clerk, если системная dll, то большая вероятность, что да. А если нет? В одном процессе dll может быть загружена по одному адресу, в другом - по другому.
лол, он про это и говорит.
"Подгрузить в текущий, найти RVA функци и добавить к базе модуля в целевом процессе."




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 19 февраля 2010 17:26
· Личное сообщение · #7

ARCHANGEL, вообще-то ты прав. Раз уж без инжекта не обойтись, то и легче свою dll целиком инжектировать. Но я привел код на случай, если еще ему нужно правильно выгрузить свою dll.

-----
IZ.RU





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 19 февраля 2010 18:03
· Личное сообщение · #8

DenCoder
Не понял - чего это без инжекта не обойтись? Я про инжект вообще и словом не обмолвился. Да и Av0id тоже.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 19 февраля 2010 18:17
· Личное сообщение · #9

DenCoder
Сосредоточтесь.




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 19 февраля 2010 18:53 · Поправил: DenCoder
· Личное сообщение · #10

Ну, без инжекта кода (WriteProcessMemory) или своей dll загрузить dll в чужой процесс возможно еще тремя известными мне способами
1) SetWindowHookEx (консольные не подцепляет)
2) Через реестр
3) Под отладчиком

Разве есть еще?

-----
IZ.RU




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 19 февраля 2010 18:57
· Личное сообщение · #11

DenCoder
Давайте рассуждать логически. Что по вашему есть длл ?




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 19 февраля 2010 19:14
· Личное сообщение · #12

Clerk, да приведи пример, как ты еще загрузишь в чужой процесс dll. И тупых вопросов не надо задавать!!! dll - Dynamic Link Library. Получил ты ее хендл в отладчике или загрузил, В ЧУЖОМ ПРОЦЕССЕ ЕЕ НЕТ, ЕСЛИ ОНА НЕ СИСТЕМНАЯ, или отлаживаемое приложение по умолчанию никак не пользуется ей.

-----
IZ.RU




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 19 февраля 2010 19:19
· Личное сообщение · #13

DenCoder
Я тупые вопросы не задаю, это вы их такими видите, ибо сами..
> приведи пример, как ты еще загрузишь в чужой процесс dll.
Спроецирую секцию к примеру. Насколько этого достаочно зависит от того, что для вас есть длл, именно это и спросил.



Ранг: 52.2 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 19 февраля 2010 19:24 · Поправил: Vitek
· Личное сообщение · #14

DenCoder пишет:
Ну, без инжекта кода (WriteProcessMemory) или своей dll загрузить dll в чужой процесс возможно еще тремя известными мне способами1) SetWindowHookEx (консольные не подцепляет)2) Через реестр3) Под отладчикомРазве есть еще?


ога. например пролезть через окно ( http://www.wasm.ru/article.php?article=window_inject )




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 19 февраля 2010 19:28 · Поправил: DenCoder
· Личное сообщение · #15

Clerk, ладно, я был невнимателен к первому посту "... таргет подгружает свою dll через LoadLibrary"
Про секции и забыл совсем...

Vitek, что-то сегодня опять у меня wasm не загружается...

-----
IZ.RU





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 19 февраля 2010 19:29 · Поправил: Модератор
· Личное сообщение · #16

Да хорош уже бред то предлагать, длл грузить через окна. Давайте ещё свой лоадер на винду для резолва адреса функции. Ближе к теме, товарищи.
Хотя вопрос по идее тривиален и озвучен уже вполне нормальный способ безо всяких инжектов.




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 19 февраля 2010 19:31
· Личное сообщение · #17

ARCHANGEL более точно выразил решение, что все хотели сказать.

-----
IZ.RU




Ранг: 61.4 (постоянный), 1thx
Активность: 0.020
Статус: Участник

Создано: 19 февраля 2010 19:34
· Личное сообщение · #18

Code:
  1.     HANDLE hSnap;
  2.     PROCESSENTRY32 pe32 = {0};
  3.     MODULEENTRY32 me32 = {0};
  4.     PUCHAR pBase = 0;
  5.     PVOID pTargetApi = 0, pRemoteAddr = 0;
  6.     ULONG apiRVA = 0;
  7.     HMODULE targetLib = 0;
  8.     ULONG pid = 0;
  9.  
  10.     hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  11.     if (hSnap != INVALID_HANDLE_VALUE)
  12.     {
  13.         pe32.dwSize = sizeof(pe32);
  14.         if (Process32First(hSnap, &pe32))
  15.         {
  16.             do
  17.             {
  18.                 if (!_strcmpi(pe32.szExeFile, TARGET_PROCESS_NAME))
  19.                 {
  20.                     pid = pe32.th32ProcessID;
  21.                     break;
  22.                 }
  23.             } while (Process32Next(hSnap, &pe32));
  24.         }
  25.         CloseHandle(hSnap);
  26.     }
  27.     if (pid)
  28.     {
  29.         hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
  30.         if (hSnap != INVALID_HANDLE_VALUE)
  31.         {
  32.             me32.dwSize = sizeof(me32);
  33.             if (Module32First(hSnap, &me32))
  34.             {
  35.                 do
  36.                 {
  37.                     if (!_strcmpi(me32.szModule, TARGET_LIBRARY_NAME))
  38.                     {
  39.                         pBase = me32.modBaseAddr;
  40.                         break;
  41.                     }
  42.                 } while (Module32Next(hSnap, &me32));
  43.             }
  44.             CloseHandle(hSnap);
  45.         }
  46.     }
  47.     if (pBase)
  48.     {
  49.         targetLib = LoadLibrary(TARGET_LIBRARY_NAME);
  50.         if (targetLib)
  51.         {
  52.             pTargetApi = GetProcAddress(targetLib, TARGET_PROC_NAME);
  53.             if (pTargetApi)
  54.             {
  55.                 apiRVA = (PUCHAR)pTargetApi - (PUCHAR)targetLib;
  56.             }
  57.             FreeLibrary(targetLib);
  58.         }
  59.     }
  60.     if (apiRVA)
  61.     {
  62.         pRemoteAddr = pBase + apiRVA;
  63.     }




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 19 февраля 2010 19:35
· Личное сообщение · #19

DenCoder
> я был невнимателен к первому посту "...
Говорил сосредоточтесь, почему не слушаете



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 19 февраля 2010 21:01
· Личное сообщение · #20

dll не системная, грузится в некоторый момент через LoadLibraryA и по разным адресам, различные способы с инжектом DLL и CreateRemoteThread требуют обработки событий LOAD_DLL_DEBUG_EVENT и CREATE_THREAD_DEBUG_EVENT соответственно, поэтому возникает дополнительное ненужное кодописание с тучей всяких проверок на валидность DLL или потока, хотелось всего этого избежать найдя какое-нибудь простое и красивое решение

n0name, благодарю, похоже на это самое решение, в голову почему-то не пришло попробую




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 19 февраля 2010 21:39 · Поправил: Модератор
· Личное сообщение · #21

В добавок к коду n0name могу сказать, что при загрузке длл к себе можно флаг добавить, чтобы точка входа не исполнялась, обычно это лишнее.
К слову сказать, если используется DebugApi, то там половина из этого уже дана. На эвент подгрузки длл будет и база, и полный путь для загрузки себе.



Ранг: 13.9 (новичок), 9thx
Активность: 0.010
Статус: Участник

Создано: 19 февраля 2010 21:45
· Личное сообщение · #22

Av0id пишет:
Привет. Прошу мне помочь, так как уже весь извелся и не могу найти решение. Есть цикл debugapi, в котором я запускаю мой таргет, таргет подгружает свою dll через LoadLibrary, вопрос в следующем - как мне из моего цикла debugapi получить адрес функции из dll?ps. GetProcAddress не катит! т.к. он только для АП текущего процесса


Когда-то писал такой код(тестировалось под XP SP2):
Code:
  1. DWORD internalGetProcAddr(const char * name,const char * moduleName)
  2. {
  3.          HMODULE hLib = GetModuleHandleA(moduleName);
  4.          bool dllExists = true;
  5.          DWORD result = 0;
  6.          int i;
  7.          for(= strlen(moduleName)-1;i >= 0;i--)
  8.          {
  9.                  if(moduleName[i] == '\' || moduleName[i] == '/')
  10.                  {
  11.                         i++;
  12.                         break;
  13.                  }
  14.          }
  15.          if(< 0)
  16.                  i = 0;
  17.          DWORD moduleImageBase = internalGetModuleBase(moduleName+i);
  18.          if(!moduleImageBase)
  19.                  return 0;
  20.          if(!hLib)
  21.          {
  22.                  dllExists = false;
  23.                  hLib = LoadLibraryExA(moduleName,0,DONT_RESOLVE_DLL_REFERENCES | LOAD_WITH_ALTERED_SEARCH_PATH);
  24.          }
  25.          if(hLib)
  26.          {
  27.                  result = (DWORD)GetProcAddress(hLib,name);
  28.                  result = moduleImageBase + (result - (UINT)hLib);
  29.                  if(!dllExists)
  30.                         FreeLibrary(hLib);
  31.          }
  32.          return result;
  33. }
  34.  
  35.  
  36. DWORD internalGetModuleBase(DWORD addr)
  37. {
  38.             //+++skipped+++
  39.             //тут каким то образом необходимо получить imageBase по имени модуля
  40.          return NULL;
  41. }




Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 20 февраля 2010 11:40
· Личное сообщение · #23

ADACH, ваш код схож с кодом n0name, только библиотека подгружается в родное АП

ps. я тему пока закрою, как будут результаты отпишусь



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 20 февраля 2010 13:49 · Поправил: HiEndsoft
· Личное сообщение · #24

Тему вы что-то не закрыли. Я так понимаю результ - фигня. Прислушайтесь к Clerk'у у него бредовые идеи бывают. Но ведь работают.
Clerk пишет:
Либо удалнно исполнить свой код.

_______________
n0name пишет:
CreateToolhelp32Snapshot

чисточушь юзать dbg
ADD: интересно кто какими колесами травится....
я лично второй день шампанским

-----
продавец резиновых утёнков





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 20 февраля 2010 15:58
· Личное сообщение · #25

Ну не хотел человек закрывать, чтоб потом мог отписаться.
Флуд не утихает? Ну закрою я. Когда будет надо-стучите, открою.


 eXeL@B —› Программирование —› GetProcAddress в АП другого процесса
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати