Сейчас на форуме: Adler, asfa, bartolomeo (+8 невидимых)

 eXeL@B —› Вопросы новичков —› RTTI ошибка при инжектировании своего кода.
Посл.ответ Сообщение

Ранг: 9.7 (гость)
Активность: 0.020
Статус: Участник

Создано: 25 мая 2012 11:24
· Личное сообщение · #1

При инжектировании своего кода посредством новой dll возникает проблема c RTTI. Исполнение прерывается на определенном адресе, вылетает по RTTI exception. То же самое происходит, если запускать этот ехе в Олли дебагере, даже при отсутствии инжектированного кода. В VS 2010 все запускается нормально (exception все еще возникает, но правильно обрабатывается VS). Как это обойти, ибо в таком варианте программа с инжектированным кодом не работает. Перекомпиляция инжектированной dll с включенной RTTI не помогает.




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

Создано: 25 мая 2012 12:01
· Личное сообщение · #2

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




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 25 мая 2012 12:09
· Личное сообщение · #3

Dim77
кг/ам. вариант - привести код инжекта, минимум

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 25 мая 2012 13:19
· Личное сообщение · #4

ajax пишет:
привести код инжекта, минимум

нет смысла. У него там exe файл кидается исключениями, а он еще туда чего-то инжектить пытается. Сначала надо отдельно выяснить чего исключения летят, а потом инжектить.

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 9.7 (гость)
Активность: 0.020
Статус: Участник

Создано: 25 мая 2012 15:29 · Поправил: Dim77
· Личное сообщение · #5

Hexxx пишет:
нет смысла. У него там exe файл кидается исключениями


Так оно и есть. При инжекте возникает такое же поведение, как при просматривании этого ехе в дебагере. Т.е. исключения не обрабатываются.

Hexxx пишет:
Сначала надо отдельно выяснить чего исключения летят
Как это сделать? Я знаю адреса по которым вылетают исключения, по крайней мере в одном случае ругается на RTTI: Access violation - no RTTI data.

Вот адрес с которого программа соскакивает на exception:

Code:
  1. .text:004021E6                 push    offset g_aInterfaceText_ ; " Interface text..."
  2. .text:004021EB                 call    sub_61A06F
  3. .text:004021F0                 cmp     [ebp+var_D], 0
  4. .text:004021F4                 jz      short loc_40221A
  5. .text:004021F6                 mov     eax, [ebx+8]
  6. .text:004021F9                 mov     esi, [eax+3Ch]
  7. .text:004021FC                 mov     ecx, esi
  8. .text:004021FE                 call    sub_61B715
  9. .text:00402203                 push    eax             ; int
  10. .text:00402204                 mov     ecx, esi
  11. .text:00402206                 call    sub_61B65C
  12. .text:0040220B                 push    eax             ; Dir
  13. .text:0040220C                 push    off_78E954      ; __int16
  14. .text:00402212                 call    sub_61C2EB
  15. .text:00402217                 mov     [ebp+var_D], al


Вылетает при вызове sub_61C2EB с аргументами - имя директории и имя файла. Файл - TApp.dbf. Все это происходит при инициализации текста интерфейса. Подобные инициализации для других компонентов типа фонтов например проходят нормально.

Короче говоря, exception возникает от того, что этот файл не может быть открыт. Это странно, ибо скомпилированная программа прекрасно его открывает. Почему он под Олли не может быть открыт - непонятно. Никаких специальных привилегий на этот файл, Everyone - Full access. Причем другие файлы программа открывает нормально.



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 25 мая 2012 22:50
· Личное сообщение · #6

Dim77 пишет:
Access violation - no RTTI data

Соответственно в коде экзешника используется dynamic_cast, но в настройках компилятора отключено RTTI. Это ваш бинарь?

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 9.7 (гость)
Активность: 0.020
Статус: Участник

Создано: 26 мая 2012 00:53
· Личное сообщение · #7

Нет, оригинальный бинарь не мой. У меня его исходников нет, отсюда необходимость в инжекте.

Hexxx пишет:
Соответственно в коде экзешника используется dynamic_cast, но в настройках компилятора отключено RTTI.

Это не очень понятно. Т.е. про dynamic_cast мне известно, но ехе уже скомпилировано, так что о каких настройках идет речь? Настройках Олли в случае с дебагером - ибо даже дебаг под Олли оригинального экзешника вызывает это исключение?

Не очень также понятно, как RTTI связан с тем, что исключение вызывается, когда програма не может открыть dbf файл. В dbf забиты ресурсы.

В таком случае все мои файлы для инжекта тоже должны быть скомпилированы используя RTTI?

У меня 3 файла для инжекта: ехе - очень простой, вызывающий DetourCreateProcessWithDll.
Dll для инжекта.
А также detoured.dll

Первые два я перекомпилил с включенным RTTI - не помогло.
Последний - нужно найти исходники и тоже скомпилить, я его подцепил в инете.



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 26 мая 2012 20:30
· Личное сообщение · #8

Dim77 пишет:
Нет, оригинальный бинарь не мой


Ну раз так, значит в программе изначально баг. Приложение само кидает исключение и само же его обрабатывает. VS знает что конкретно такие исключения нужно отдать программе на обработку. Olly видимо про это не знает поэтому останавливает работу приложения. Т.е. это вопрос к настройкам Ollydbg. Я без понятия как там это делается, потому что не пользуюсь. В IDA например есть настройки для исключений, можно указать какой код нужно обработать отладчику, а какой отдать приложению.

Но это только по вопросу "почему в олли не работает". Про инжектирование нужны подробности как именно оно глючит.

-----
Реверсивная инженерия - написание кода идентичного натуральному


| Сообщение посчитали полезным: Dim77

Ранг: 9.7 (гость)
Активность: 0.020
Статус: Участник

Создано: 27 мая 2012 01:05 · Поправил: Dim77
· Личное сообщение · #9

Hexxx пишет:
Про инжектирование нужны подробности как именно оно глючит.

Программа вылетает, при подсоединении дебагера видно, что вылет происходит по адресу: 61B028, т.е. при попытке выйти из очень длинной процедуры инициализации различных параметров программы. Ниже код последних шагов.
Вылетает на Leave с ошибкой Unhandled Exception at address 0x0061B028: 0x00000005. Access Violation reading location 0x00000000.

Регистры:
EAX = 00383480 EBX = 00383034 ECX = 0038304D EDX = 00008000 ESI = 0022F844 EDI = 006F3534 EIP = 0061B028 ESP = 0022F838 EBP = 00000000 EFL = 00010246

Есть подозрение, что EBP должно содержать адрес вызывающей функции, но это значение почему-то оказывается равным 0. Как понять, что там на самом деле должно быть не очень ясно, разве что VS присоединиться к оригинальному процессу... Но, даже если это будет понятно, важнее понять, почему там этого адреса не оказывается, если вообще мое предположение верно.

Code:
  1. .text:0061B017 loc_61B017:                             ; CODE XREF: .text:0061AFF0j
  2. .text:0061B017                 mov     ecx, [esp+1Ch]
  3. .text:0061B01B                 mov     eax, esi
  4. .text:0061B01D                 pop     edi
  5. .text:0061B01E                 pop     esi
  6. .text:0061B01F                 pop     ebp
  7. .text:0061B020                 mov     large fs:0, ecx
  8. .text:0061B027                 pop     ebx
  9. .text:0061B028                 leave
  10. .text:0061B029                 retn    4


Полный код функции приаттачен.

98dd_26.05.2012_EXELAB.rU.tgz - SubError.txt




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 27 мая 2012 01:33
· Личное сообщение · #10

сам екзе не хученый работает? значит варианты
- в проге защите от дебагера(1%)
- кривая хук функция(90%)
- хз(9%)

выкладывай наверное екзе+хук
что бы не гадать на ромашках




Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 27 мая 2012 03:12
· Личное сообщение · #11

Dim77 пишет:
Есть подозрение, что EBP должно содержать адрес вызывающей функции

Dim77 пишет:
.text:0061B028    leave

Из EBP в ЕSP копирутся то значение которое было до вызова процедуры(выравнивается стек),
Dim77 пишет:
text:0061B01F   pop     ebp

вот здесь и дёт ошибка,в стеке нарушина последовательность и в EBP ложится хрен знает что,но нето что нужно

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 9.7 (гость)
Активность: 0.020
Статус: Участник

Создано: 27 мая 2012 13:51 · Поправил: Dim77
· Личное сообщение · #12

reversecode пишет:
выкладывай наверное екзе+хук
что бы не гадать на ромашках


Выложил:

1. -->Оригинальный Ехе + ini <--
2. -->Hook - exe (инжектор) + моя dll + detored.dll <-- Эти файлы должны быть там же где и оригинальный ехе
3. --> Файлы инициализации <--Возможно и без них можно дойти до того места, где происходит ошибка...

ClockMan пишет:
,в стеке нарушина последовательность и в EBP ложится хрен знает что

Как это происходит пока не вижу.

На всякий случай код хука:

Code:
  1. // noCD2.cpp : Defines the exported functions for the DLL application.
  2. //
  3. #include "stdafx.h"
  4. #include <windows.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <detours.h>
  8.  
  9. typedef void (WINAPI *pFunc)(DWORD);
  10.  
  11. HINSTANCE hInstance;
  12. #define BUF_LEN 128
  13.  
  14. #pragma comment(lib, "detours.lib")
  15.  
  16. extern "C" __declspec(dllexport) bool proc_51F36F(char *Str2, char *driveletter)
  17. {
  18.   static CHAR FileSystemNameBuffer;
  19.   static CHAR Str1;
  20.   static DWORD FileSystemFlags;
  21.   static DWORD VolumeSerialNumber;
  22.  
  23.   static DWORD MaximumComponentLength;
  24.   static char RootPathName[4];
  25.   static char FileName[MAX_PATH];
  26.  
  27. GetModuleFileNameA(0, FileName, sizeof(FileName));
  28. _splitpath(FileName,RootPathName,NULL,NULL,NULL);
  29.  
  30. strcat(RootPathName, "\");
  31.  
  32. *driveletter=RootPathName[0];
  33.  
  34. if ( !(GetVolumeInformationA(RootPathName,&Str1,BUF_LEN,&VolumeSerialNumber,&MaximumComponentLength,&FileSystemFlags,&FileSystemNameBuffer,BUF_LEN)))
  35. {
  36.          DWORD LError = GetLastError();
  37. }
  38. return (*driveletter != '\0');
  39. }
  40.  
  41.  
  42. pFunc FuncToDetour = (pFunc)(0x0051F36F); //Set it at address to detour in
  43.                     //the process
  44. INT APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved)
  45. {
  46.     switch(Reason)
  47.     {
  48.     case DLL_PROCESS_ATTACH:
  49.         {
  50.             DisableThreadLibraryCalls(hDLL);
  51.             DetourTransactionBegin();
  52.             DetourUpdateThread(GetCurrentThread());
  53.             DetourAttach(&(PVOID&)FuncToDetour, proc_51F36F);
  54.             DetourTransactionCommit();
  55.         }
  56.         break;
  57.     case DLL_PROCESS_DETACH:
  58.         DetourTransactionBegin();
  59.         DetourUpdateThread(GetCurrentThread());
  60.         DetourDetach(&(PVOID&)FuncToDetour,  proc_51F36F);
  61.         DetourTransactionCommit();
  62.         break;
  63.     case DLL_THREAD_ATTACH:
  64.     case DLL_THREAD_DETACH:
  65.         break;
  66.     }
  67.     return TRUE;
  68. }





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 27 мая 2012 14:11
· Личное сообщение · #13

ясное дело
в оригинальном exe stdcall конвершинал
а в вашей хученой cdecl
вот стек и ломается

| Сообщение посчитали полезным: Dim77

Ранг: 9.7 (гость)
Активность: 0.020
Статус: Участник

Создано: 27 мая 2012 16:40 · Поправил: Dim77
· Личное сообщение · #14

reversecode пишет:
в оригинальном exe stdcall конвершинал
а в вашей хученой cdecl
вот стек и ломается

Заработало. Спасибо. Это было круто Это мой первый NoCD. Чувствую прилив эндорфинов

ЗЫ С исключениями в Олли еще предстоит разобраться ибо цель была добавить еще свой код к этому ехе. No CD - это была "проба пера"...



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 27 мая 2012 20:37
· Личное сообщение · #15

Dim77 пишет:
No CD - это была "проба пера"

Дожили, перья жрут...

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 9.7 (гость)
Активность: 0.020
Статус: Участник

Создано: 04 июня 2012 01:38 · Поправил: Dim77
· Личное сообщение · #16

Выяснил в чем проблема с запуском программы под Олли - не может загрузить D3DIM700.dll. Дал Everyone все права на эту длл. Не помогло. Вылетает по исключению. Думаю, что если дать Everyone все права на system32, то заработает, но как-то стремно. Есть еще какие-либо варианты?




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 04 июня 2012 03:13 · Поправил: -=AkaBOSS=-
· Личное сообщение · #17

Dim77
ну попробуй кинуть эту длл в папку с программой и уже на неё дать права
хотя странно это всё..

а может dllInit возвращает 0?
поставь в ольке:
Make first pause at -> System Breakpoint
и флаг Break on new module (DLL)
и попробуй дойти до точки входа в эту длл

Dim77 пишет:
Вылетает по исключению

а код-то какой?

| Сообщение посчитали полезным: Dim77

Ранг: 9.7 (гость)
Активность: 0.020
Статус: Участник

Создано: 04 июня 2012 14:17 · Поправил: Dim77
· Личное сообщение · #18

-=AkaBOSS=- пишет:
а код-то какой?


При вылете попадает на обработку исключений:

Code:
  1. CPU Disasm
  2. Address   Hex dump                    Command                                           Comments
  3. 0A93B395  |.  66:8B50 0E              MOV DX,WORD PTR DS:[EAX+0E]
  4. 0A93B399  |.  66:8BCA                 MOV CX,DX
  5. 0A93B39C  |.  66:81E1 F8FF            AND CX,FFF8
  6. 0A93B3A1  |.  66:81F9 D0CA            CMP CX,0CAD0
  7. 0A93B3A6  |.  75 29                   JNE SHORT 0A93B3D1
  8. 0A93B3A8  |.  80E2 07                 AND DL,07
  9. 0A93B3AB  |.  80FA 05                 CMP DL,5
  10. 0A93B3AE  |.  73 21                   JNB SHORT 0A93B3D1
  11. 0A93B3B0  |.  8B00                    MOV EAX,DWORD PTR DS:[EAX]
  12. 0A93B3B2  |.  66:8178 20 ADBE         CMP WORD PTR DS:[EAX+20],0BEAD
  13. 0A93B3B8  |.  75 17                   JNE SHORT 0A93B3D1
  14. 0A93B3BA  |.  B8 01000000             MOV EAX,1
  15. 0A93B3BF  |.  C745 FC FFFFFFFF        MOV DWORD PTR SS:[LOCAL.1],-1
  16. 0A93B3C6  \.  EB 12                   JMP SHORT 0A93B3DA
  17. 0A93B3C8  /.  B8 01000000             MOV EAX,1
  18. 0A93B3CD  \.  C3                      RETN
  19. 0A93B3CE  /.  8B65 E8                 MOV ESP,DWORD PTR SS:[EBP-18]
  20. 0A93B3D1  |>  C745 FC FFFFFFFF        MOV DWORD PTR SS:[LOCAL.1],-1
  21. 0A93B3D8  |.  33C0                    XOR EAX,EAX
  22. 0A93B3DA  |>  8B4D F0                 MOV ECX,DWORD PTR SS:[LOCAL.4]
  23. 0A93B3DD  |.  5F                      POP EDI
  24. 0A93B3DE  |.  64:890D 00000000        MOV DWORD PTR FS:[0],ECX
  25. 0A93B3E5  |.  5E                      POP ESI
  26. 0A93B3E6  |.  5B                      POP EBX
  27. 0A93B3E7  |.  8BE5                    MOV ESP,EBP
  28. 0A93B3E9  |.  5D                      POP EBP
  29. 0A93B3EA  \.  C3                      RETN
  30.  


Вылетает на вызове EBX (см код ниже). В EBX в этот момент адрес: 0025004С. Другие dll, в том числе системные, нормально грузит. Этот код из модуля snxhk.

Code:
  1. CPU Disasm
  2. Address   Hex dump                    Command                                           Comments
  3. 754C8671  |.  0FB74424 1C             MOVZX EAX,WORD PTR SS:[ESP+1C]
  4. 754C8676  |.  8B5424 20               MOV EDX,DWORD PTR SS:[ESP+20]
  5. 754C867A  |.  D1E8                    SHR EAX,1
  6. 754C867C  |.  33C9                    XOR ECX,ECX
  7. 754C867E  |.  66:890C42               MOV WORD PTR DS:[EAX*2+EDX],CX
  8. 754C8682  |.  83C4 0C                 ADD ESP,0C
  9. 754C8685  |.  8D4424 10               LEA EAX,[ESP+10]
  10. 754C8689  |.  394C24 14               CMP DWORD PTR SS:[ESP+14],ECX
  11. 754C868D  |.- 75 02                   JNE SHORT 754C8691
  12. 754C868F  |>  8BC6                    MOV EAX,ESI
  13. 754C8691  |>  8B7D 14                 MOV EDI,DWORD PTR SS:[EBP+14]
  14. 754C8694  |.  8B4D 08                 MOV ECX,DWORD PTR SS:[EBP+8]
  15. 754C8697  |.  57                      PUSH EDI
  16. 754C8698  |.  50                      PUSH EAX
  17. 754C8699  |.  8B45 0C                 MOV EAX,DWORD PTR SS:[EBP+0C]
  18. 754C869C  |.  50                      PUSH EAX
  19. 754C869D  |.  51                      PUSH ECX
  20. 754C869E  |.  FFD3                    CALL EBX



-=AkaBOSS=- пишет:
и попробуй дойти до точки входа в эту длл

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

Заработало кое-как. Постоянно останавливается по exception, но если передать управление приложению, то через 3-5 циклов проходит дальше...

Пока работает на этапе инициализации данных. Посмотрим, как будет дальше ибо по-моему программа не любит, когда ее ставят на паузу и потом снимают. При этом передача управления программе не происходит. Но пока это не особенно важно. Тему закрываю.


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