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

 eXeL@B —› Вопросы новичков —› Созданная мной dll выглядит странно в дебагере
Посл.ответ Сообщение

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

Создано: 30 апреля 2012 19:47
· Личное сообщение · #1

Создал dll из кода, приведенного ниже. Все нормально скомпилилось. Но, когда открываю в дебагере, то то, что там открывается совсем не похоже на оригинальный код. Не то, чтобы мне ее нужно было дебажить, но интересно было бы понять, что происходит. VS оптимизировал код?

Code:
  1. #include <windows.h>
  2.  
  3.  
  4. bool __stdcall sub_51F36F(const char *Str2, int a2)
  5. {
  6.   char FileSystemNameBuffer;
  7.   char Str1;
  8.   unsigned long FileSystemFlags;
  9.   unsigned long VolumeSerialNumber;
  10.   int v7;
  11.   unsigned int uMode;
  12.   unsigned long MaximumComponentLength;
  13.   char FileName[260];
  14.   char RootPathName;
  15.  
  16. GetModuleFileNameA(0, FileName, 0x104u);
  17. memcpy(&RootPathName, &FileName, strlen(FileName)-12);
  18.  
  19. VolumeSerialNumber = 0;
  20. MaximumComponentLength = 0;
  21. FileSystemFlags = 0;
  22. Str1 = 0;
  23. FileSystemNameBuffer = 0;
  24. uMode = SetErrorMode(1u);
  25. v7 = GetVolumeInformationA(
  26.         &RootPathName,
  27.         &Str1,
  28.         0x80u,
  29.         &VolumeSerialNumber,
  30.         &MaximumComponentLength,
  31.         &FileSystemFlags,
  32.         &FileSystemNameBuffer,
  33.         0x80u);
  34.  
  35. GetLastError();
  36. SetErrorMode(uMode);
  37.  
  38.   return  RootPathName != 0;
  39. }


Вот начало того, что получается в дебагере:

Code:
  1. ; Segment type: Pure code
  2. .text:10001000 ; Segment permissions: Read/Execute
  3. .text:10001000 _text           segment para public 'CODE' use32
  4. .text:10001000                 assume cs:_text
  5. .text:10001000                 ;org 10001000h
  6. .text:10001000                 assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing
  7. .text:10001000
  8. .text:10001000 ; =============== S U B R O U T I N E =======================================
  9. .text:10001000
  10. .text:10001000
  11. .text:10001000 ; void __fastcall __security_check_cookie(unsigned int cookie)
  12. .text:10001000 @__security_check_cookie@4 proc near    ; DATA XREF: __except_handler4+11o
  13. .text:10001000 cookie = ecx
  14. .text:10001000                 cmp     cookie, ___security_cookie
  15. .text:10001006                 jnz     short failure
  16. .text:10001008                 rep retn
  17. .text:1000100A ; ---------------------------------------------------------------------------
  18. .text:1000100A
  19. .text:1000100A failure:                                ; CODE XREF: __security_check_cookie(x)+6j
  20. .text:1000100A                 jmp     ___report_gsfailure
  21. .text:1000100A @__security_check_cookie@4 endp
  22. .text:1000100A
  23. .text:1000100F
  24. .text:1000100F ; =============== S U B R O U T I N E =======================================
  25. .text:1000100F
  26. .text:1000100F
  27. .text:1000100F ; int __cdecl pre_c_init()
  28. .text:1000100F pre_c_init      proc near               ; DATA XREF: .rdata:pcinito
  29. .text:1000100F
  30. .text:1000100F var_8           = dword ptr -8
  31. .text:1000100F
  32. .text:1000100F                 mov     edi, edi
  33. .text:10001011                 push    esi
  34. .text:10001012                 push    80h
  35. .text:10001017                 call    ds:__imp___malloc_crt
  36. .text:1000101D                 pop     ecx
  37. .text:1000101E                 mov     esi, eax
  38. .text:10001020                 push    esi             ; Ptr
  39. .text:10001021                 call    ds:__imp__EncodePointer@4 ; EncodePointer(x)
  40. .text:10001027                 mov     ___onexitbegin, eax
  41. .text:1000102C                 mov     ___onexitend, eax
  42. .text:10001031                 test    esi, esi
  43. .text:10001033                 jnz     short loc_1000103A
  44. .text:10001035                 xor     eax, eax
  45. .text:10001037                 inc     eax
  46. .text:10001038                 pop     esi
  47. .text:10001039                 retn
  48. .text:1000103A ; ---------------------------------------------------------------------------
  49. .text:1000103A
  50. .text:1000103A loc_1000103A:                           ; CODE XREF: pre_c_init+24j
  51. .text:1000103A                 and     dword ptr [esi], 0
  52. .text:1000103D                 call    __RTC_Initialize
  53. .text:10001042                 push    offset __RTC_Terminate ; func
  54. .text:10001047                 call    _atexit
  55. .text:1000104C                 mov     [esp+8+var_8], offset ___clean_type_info_names
  56. .text:10001053                 call    _atexit
  57. .text:10001058                 pop     ecx
  58. .text:10001059                 xor     eax, eax
  59. .text:1000105B                 pop     esi
  60. .text:1000105C                 retn
  61. .text:1000105C pre_c_init      endp
  62. .text:1000105C





Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 30 апреля 2012 19:54
· Личное сообщение · #2

компилишь в Debug или в Release?
И твоей функции я там не нашёл в коде.



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

Создано: 30 апреля 2012 20:03 · Поправил: Dim77
· Личное сообщение · #3

Это был не весь код. Сейчас весь код выложу. Смотри ниже. Компелю сначала в Debug, потом в Release. Ошибок компеляции нет. Моей функции там и нет. В этом и непонятки...

Code:
  1. xt:10001000 ;
  2. .text:10001000 ; +-------------------------------------------------------------------------+
  3. .text:10001000 ; | This file has been generated by The Interactive Disassembler (IDA) |
  4. .text:10001000 ; | Copyright (c) 2011 Hex-Rays, <support@hex-rays.com> |
  5. .text:10001000 ; | License info: 48-327F-7274-B7 |
  6. .text:10001000 ; | ESET spol. s r.o. |
  7. .text:10001000 ; +-------------------------------------------------------------------------+
  8. .text:10001000 ;
  9. .text:10001000 ; Input MD5 : 762B27A62CA3EE1DEDD51663B9B4E5B8
  10. .text:10001000 ; Input CRC32 : F2D0972D
  11. .text:10001000
  12. .text:10001000 ; File Name : D:\ReverseEngineer\VisualStudio\PlayGround\NoCD1\Release\NoCD1.dll
  13. .text:10001000 ; Format : Portable executable for 80386 (PE)
  14. .text:10001000 ; Imagebase : 10000000
  15. .text:10001000 ; Section 1. (virtual address 00001000)
  16. .text:10001000 ; Virtual size : 0000088E ( 2190.)
  17. .text:10001000 ; Section size in file : 00000A00 ( 2560.)
  18. .text:10001000 ; Offset to raw data for section: 00000400
  19. .text:10001000 ; Flags 60000020: Text Executable Readable
  20. .text:10001000 ; Alignment : default
  21. .text:10001000 ; OS type : MS Windows
  22. .text:10001000 ; Application type: DLL 32bit
  23. .text:10001000
  24. .text:10001000                 .686p
  25. .text:10001000                 .mmx
  26. .text:10001000                 .model flat
  27. .text:10001000
  28. .text:10001000 ; ===========================================================================
  29. .text:10001000
  30. .text:10001000 ; Segment type: Pure code
  31. .text:10001000 ; Segment permissions: Read/Execute
  32. .text:10001000 _text           segment para public 'CODE' use32
  33. .text:10001000                 assume cs:_text
  34. .text:10001000                 ;org 10001000h
  35. .text:10001000                 assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing
  36. .text:10001000
  37. .text:10001000 ; =============== S U B R O U T I N E =======================================
  38. .text:10001000
  39. .text:10001000
  40. .text:10001000 ; void __fastcall __security_check_cookie(unsigned int cookie)
  41. .text:10001000 @__security_check_cookie@4 proc near    ; DATA XREF: __except_handler4+11o
  42. .text:10001000 cookie = ecx
  43. .text:10001000                 cmp     cookie, ___security_cookie
  44. .text:10001006                 jnz     short failure
  45. .text:10001008                 rep retn
  46. .text:1000100A ; ---------------------------------------------------------------------------
  47. .text:1000100A
  48. .text:1000100A failure:                                ; CODE XREF: __security_check_cookie(x)+6j
  49. .text:1000100A                 jmp     ___report_gsfailure
  50. .text:1000100A @__security_check_cookie@4 endp
  51. .text:1000100A
  52. .text:1000100F
  53. .text:1000100F ; =============== S U B R O U T I N E =======================================
  54. .text:1000100F
  55. .text:1000100F
  56. .text:1000100F ; int __cdecl pre_c_init()
  57. .text:1000100F pre_c_init      proc near               ; DATA XREF: .rdata:pcinito
  58. .text:1000100F
  59. .text:1000100F var_8           = dword ptr -8
  60. .text:1000100F
  61. .text:1000100F                 mov     edi, edi
  62. .text:10001011                 push    esi
  63. .text:10001012                 push    80h
  64. .text:10001017                 call    ds:__imp___malloc_crt
  65. .text:1000101D                 pop     ecx
  66. .text:1000101E                 mov     esi, eax
  67. .text:10001020                 push    esi             ; Ptr
  68. .text:10001021                 call    ds:__imp__EncodePointer@4 ; EncodePointer(x)
  69. .text:10001027                 mov     ___onexitbegin, eax
  70. .text:1000102C                 mov     ___onexitend, eax
  71. .text:10001031                 test    esi, esi
  72. .text:10001033                 jnz     short loc_1000103A
  73. .text:10001035                 xor     eax, eax
  74. .text:10001037                 inc     eax
  75. .text:10001038                 pop     esi
  76. .text:10001039                 retn
  77. .text:1000103A ; ---------------------------------------------------------------------------
  78. .text:1000103A
  79. .text:1000103A loc_1000103A:                           ; CODE XREF: pre_c_init+24j
  80. .text:1000103A                 and     dword ptr [esi], 0
  81. .text:1000103D                 call    __RTC_Initialize
  82. .text:10001042                 push    offset __RTC_Terminate ; func
  83. .text:10001047                 call    _atexit
  84. .text:1000104C                 mov     [esp+8+var_8], offset ___clean_type_info_names
  85. .text:10001053                 call    _atexit
  86. .text:10001058                 pop     ecx
  87. .text:10001059                 xor     eax, eax
  88. .text:1000105B                 pop     esi
  89. .text:1000105C                 retn
  90. .text:1000105C pre_c_init      endp
  91. .text:1000105C
  92. .text:1000105D
  93. .text:1000105D ; =============== S U B R O U T I N E =======================================
  94. .text:1000105D
  95. .text:1000105D ; Attributes: bp-based frame
  96. .text:1000105D
  97. .text:1000105D ; int __stdcall _CRT_INIT(void *hDllHandle, unsigned int dwReason, void *lpreserved)
  98. .text:1000105D __CRT_INIT@12   proc near               ; CODE XREF: __DllMainCRTStartup+62p
  99. .text:1000105D                                         ; __DllMainCRTStartup+92p ...
  100. .text:1000105D
  101. .text:1000105D onexitbegin_new = dword ptr -8
  102. .text:1000105D var_4           = dword ptr -4
  103. .text:1000105D onexitend_saved = dword ptr  8
  104. .text:1000105D onexitbegin     = dword ptr  0Ch
  105. .text:1000105D onexitbegin_saved= dword ptr  10h
  106. .text:1000105D
  107. .text:1000105D                 mov     edi, edi
  108. .text:1000105F                 push    ebp
  109. .text:10001060                 mov     ebp, esp
  110. .text:10001062                 push    ecx
  111. .text:10001063                 push    ecx
  112. .text:10001064                 push    ebx
  113. .text:10001065                 xor     eax, eax
  114. .text:10001067                 push    esi
  115. .text:10001068                 push    edi
  116. .text:10001069                 cmp     [ebp+onexitbegin], eax
  117. .text:1000106C                 jnz     short loc_100010A0
  118. .text:1000106E                 cmp     __proc_attached, eax
  119. .text:10001074                 jle     short loc_10001099
  120. .text:10001076                 mov     eax, large fs:18h
  121. .text:1000107C                 dec     __proc_attached
  122. .text:10001082                 mov     ebx, [eax+4]
  123. .text:10001085                 and     [ebp+var_4], 0
  124. .text:10001089                 mov     esi, ds:__imp__InterlockedCompareExchange@12 ; InterlockedCompareExchange(x,x,x)
  125. .text:1000108F                 mov     edi, offset ___native_startup_lock
  126. .text:10001094                 jmp     loc_10001183
  127. .text:10001099 ; ---------------------------------------------------------------------------
  128. .text:10001099
  129. .text:10001099 loc_10001099:                           ; CODE XREF: _CRT_INIT(x,x,x)+17j
  130. .text:10001099                                         ; _CRT_INIT(x,x,x)+BCj
  131. .text:10001099                 xor     eax, eax
  132. .text:1000109B                 jmp     loc_10001260
  133. .text:100010A0 ; ---------------------------------------------------------------------------
  134. .text:100010A0
  135. .text:100010A0 loc_100010A0:                           ; CODE XREF: _CRT_INIT(x,x,x)+Fj
  136. .text:100010A0                 cmp     [ebp+onexitbegin], 1
  137. .text:100010A4                 jnz     loc_1000125D
  138. .text:100010AA                 mov     ecx, large fs:18h
  139. .text:100010B1                 mov     ebx, [ecx+4]
  140. .text:100010B4                 mov     esi, ds:__imp__InterlockedCompareExchange@12 ; InterlockedCompareExchange(x,x,x)
  141. .text:100010BA                 mov     [ebp+onexitbegin], eax
  142. .text:100010BD                 push    eax
  143. .text:100010BE                 mov     edi, offset ___native_startup_lock
  144. .text:100010C3                 jmp     short loc_100010D6
  145. .text:100010C5 ; ---------------------------------------------------------------------------
  146. .text:100010C5
  147. .text:100010C5 loc_100010C5:                           ; CODE XREF: _CRT_INIT(x,x,x)+7Fj
  148. .text:100010C5                 cmp     eax, ebx
  149. .text:100010C7                 jz      short loc_100010E0
  150. .text:100010C9                 push    3E8h            ; dwMilliseconds
  151. .text:100010CE                 call    ds:__imp__Sleep@4 ; Sleep(x)
  152. .text:100010D4                 push    0               ; Comperand
  153. .text:100010D6
  154. .text:100010D6 loc_100010D6:                           ; CODE XREF: _CRT_INIT(x,x,x)+66j
  155. .text:100010D6                 push    ebx             ; Exchange
  156. .text:100010D7                 push    edi             ; Destination
  157. .text:100010D8                 call    esi ; InterlockedCompareExchange(x,x,x) ; InterlockedCompareExchange(x,x,x)
  158. .text:100010DA                 test    eax, eax
  159. .text:100010DC                 jnz     short loc_100010C5
  160. .text:100010DE                 jmp     short loc_100010E7
  161. .text:100010E0 ; ---------------------------------------------------------------------------
  162. .text:100010E0
  163. .text:100010E0 loc_100010E0:                           ; CODE XREF: _CRT_INIT(x,x,x)+6Aj
  164. .text:100010E0                 mov     [ebp+onexitbegin], 1
  165. .text:100010E7
  166. .text:100010E7 loc_100010E7:                           ; CODE XREF: _CRT_INIT(x,x,x)+81j
  167. .text:100010E7                 mov     eax, ___native_startup_state
  168. .text:100010EC                 push    2
  169. .text:100010EE                 pop     esi
  170. .text:100010EF                 test    eax, eax
  171. .text:100010F1                 jz      short loc_100010FC
  172. .text:100010F3                 push    1Fh
  173. .text:100010F5                 call    __amsg_exit
  174. .text:100010FA                 jmp     short loc_10001135
  175. .text:100010FC ; ---------------------------------------------------------------------------
  176. .text:100010FC
  177. .text:100010FC loc_100010FC:                           ; CODE XREF: _CRT_INIT(x,x,x)+94j
  178. .text:100010FC                 push    offset ___xi_z
  179. .text:10001101                 push    offset ___xi_a
  180. .text:10001106                 mov     ___native_startup_state, 1
  181. .text:10001110                 call    __initterm_e
  182. .text:10001115                 pop     ecx
  183. .text:10001116                 pop     ecx




Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 30 апреля 2012 20:04
· Личное сообщение · #4

Следующие вопросы - какой компилятор или VS 6/7/8?
GetVolumeInformationA в таблице импорта присутствует? перекрестные ссылки.
И еще:
Code:
  1. static char FileName[260];

Buffer-overflow ???:
Code:
  1. char RootPathName;
  2. memcpy(&RootPathName, ...





Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 30 апреля 2012 20:08
· Личное сообщение · #5

у меня такое чувство, что компилер тупо не вставил твою функцию, т.к. на неё ваще нету ссылок из кода. Ни в экспорт, ни в внутренних функциях.



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 30 апреля 2012 20:10
· Личное сообщение · #6

Dart Sergius
Очевидно Release и оптимизация по скорости стоит, вот он и выкинул



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

Создано: 30 апреля 2012 20:19 · Поправил: Dim77
· Личное сообщение · #7

ELF_7719116 пишет:
какой компилятор или VS 6/7/8?

VS 2010

ELF_7719116 пишет:
static char FileName[260];


хм, интересный момент. Я взял то, что мне декомпайлер подсунул. Похоже, что он должен быть поинтером.

ELF_7719116 пишет:
Очевидно Release и оптимизация по скорости стоит, вот он и выкинул

Круто. Пойду искать, где эта оптимизация стоит...

Dart Sergius пишет:
т.к. на неё ваще нету ссылок из кода.

Нету, ибо она предназначалась для инжектирования.



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 30 апреля 2012 20:27
· Личное сообщение · #8

Вообще для начала неплохо привести в более менее нормальный вид. Эдак что-то типа:
Code:
  1.    static char FileSystemNameBuffer[255];
  2.   static char Str1[255];
  3.   static unsigned long FileSystemFlags;
  4.   static unsigned long VolumeSerialNumber;
  5.   
  6.   static unsigned long MaximumComponentLength;
  7.   static char FileName[260];
  8.   static char RootPathName[1];
  9.  
  10. GetModuleFileNameA(0, FileName, sizeof(FileName));
  11. _splitpath(FileName,RootPathName,NULL,NULL,NULL);
  12. if !(GetVolumeInformation(&RootPathName,&Str1,sizeof(Str1),&VolumeSerialNumber,&MaximumComponentLength,&FileSystemFlags,&FileSystemNameBuffer,sizeof(FileSystemNameBuffer)))
  13. {
  14.          DWORD LError = GetLastError();
  15. }


Оптимизация - ключ /O2.

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

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

Создано: 30 апреля 2012 20:38
· Личное сообщение · #9

ELF_7719116 пишет:
Эдак что-то типа:

Спасибо. Приятно посмотреть на нормальный код (я серьезно).

ELF_7719116 пишет:
Оптимизация - ключ /O2

Найду (ибо я GUI пользовал).

А если из GUI? )




Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 30 апреля 2012 21:22
· Личное сообщение · #10

Dim77 пишет:
А если из GUI? )

в настройках решения параметр "оптимизация"



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

Создано: 01 мая 2012 00:55
· Личное сообщение · #11

Чуть-чуть подправил типы данных из примера ELF_7719116 и все компилиться. На оптимизацию еще не смотрел.

Code:
  1. void _splitpath(
  2.    const char *path,
  3.    char *drive,
  4.    char *dir,
  5.    char *fname,
  6.    char *ext 
  7. );


Эта функция drive и dir похоже отдельно вычисляет. Тогда то, что мне нужно будет выглядеть наверное так:

Code:
  1. GetModuleFileNameA(0, FileName, sizeof(FileName));
  2. _splitpath(FileName,NULL,&RootPathName,NULL,NULL);


Ибо RootPathName - это директория, где находится ехе-шник и она-то мне и нужна. ;)

Вопрос об инжектировании этой длл: если я функцию оставлю с таким именем (sub_51F36F) и подцеплю длл через реестр, ключ AppInit_Dlls, то я так скорее всего себе могу порушить систему, так ведь? Ибо длл будет всегда загружена и всегда всем видна, а функция с таким адресом может оказаться неуникальной... Или я ерунду пишу?




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

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

Уф, какой огород. А всего-то надо вызывать эту функу из DllMain, а иначе, как уже написал Dart Sergius:

что компилер тупо не вставил твою функцию, т.к. на неё ваще нету ссылок из кода

Ну, или в экспорт добавить.

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


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

Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

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

Есть еще вариант вроде такого:
Code:
  1. int x = 6;
  2. -= 6;
  3. if (x) {
  4.   sub_51F36F("test", 0);
  5. }

Так, по идее, оптимизатор не выкинет. Туповат он для этого.



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

Создано: 01 мая 2012 19:03
· Личное сообщение · #14

Сделано через DllMain. Функция скомпилилась и я ее вижу в дебагере. Спасибо ARCHANGEL.

Теперь дело за инжектированием и отладкой...



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

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

Инжектировал эту dll в процесс, все нормально должно было вставиться, т.к. этот же инжектор нормально конектится к процессу и инжектирует тест код. Но, похоже, что код для функции sub_51F36F не вызывается. Я думаю, что мой способ адресации этой функции неверен. В конечном итоге, я не знаю оригинального имени функции, а sub_51F36F получилось из ее адреса.

Т.к. программа все время грузится в один и тот же сегмент памяти, то логично было бы подгрузить вызов моей функции по соответствующему адресу. Но как это сделать, я не знаю. Можно было бы привести примеры того как это было сделано другими?




Ранг: 199.6 (ветеран), 12thx
Активность: 0.10
Статус: Участник
www.uinc.ru

Создано: 12 мая 2012 06:34 · Поправил: DrGolova
· Личное сообщение · #16

> В конечном итоге, я не знаю оригинального имени функции, а sub_51F36F получилось из ее адреса.

Логично было бы сделать эту функцию экспортируемой, чтобы её хотя бы в отладчике видеть.
Если это VisualC, то я бы тупо добавил в проект def файл типа такого "hooy.def"
Code:
  1. LIBRARY      "HOOY"
  2. ; DESCRIPTION 'HOOY Dynamic Link Library'
  3.  
  4. EXPORTS
  5.          sub_51F36F


Или бы просто добавил перед реализацией функции __declspec(dllexport), но тогда имя в функции в таблице экспорта заманглится так или иначе

Ну а эффективный адрес экспортируемой функции всегда можно узнать через GetProcAddress()



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

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

я сделал через __declspec(dllexport). То, что я хочу сделать - это заменить вызов оригинальной функции по адресу 51F36F на вызов моей функции. Адрес откуда функция вызывается мне известен (из дебагера), но как туда прописать вызов своей функции (без правки ехешника) мне не очень понятно. Или единственный способ - узнать по какому адресу вставляется моя функция и перенаправить вызов на нее?

Можно как-то без правки адреса вызова в ехе обойтись?

P.S. Это в условиях, когда оригинальное имя функции неизвестно, а заменено дисассемблером на sub_51F36F




Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 12 мая 2012 14:26
· Личное сообщение · #18

Dim77, VirtualProtect по секции кода, и разреши запись, потом пишешь в начало той функции байты
FF 25 <адрес твоей функции>.
Следи за стеком и правильной передачей параметров.
Как вычислить реальный адрес функции думаю объяснять ненадо?



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

Создано: 12 мая 2012 14:52
· Личное сообщение · #19

Dart Sergius пишет:
потом пишешь в начало той функции байты
FF 25 <адрес твоей функции>

А остаток оригинальной 51F36F забиваем нулями?

Dart Sergius пишет:
Как вычислить реальный адрес функции думаю объяснять ненадо?

Ну, раньше я этого не делал - буду смотреть.



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

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

Dim77 пишет:
А остаток оригинальной 51F36F забиваем нулями?

Лучше байтами 0xCC, чтобы спалить возможные обращения в середину процедуры.



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

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

Адрес своей функции нашел. Но адрес у нее меняется, в зависимости от того, какие адреса доступны для инжектированной длл. Т.е. при каждой загрузке он может быть разный. Так что я так понимаю, что придется адрес узнавать не из дебагера, а чем-то вроде GetProcAddress()...




Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 12 мая 2012 20:56
· Личное сообщение · #22

Dim77, если ты загнал её в экспорт, то та, а так в С есть замечательный &, который берёт адрес(реальный!!).
А адрес функции, которую надо заменять, надо считать. Запоминаешь offset...



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

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

Dart Sergius пишет:
а так в С есть замечательный &, который берёт адрес(реальный!!)

Заработало через call sub_51F36F. Не знаю, в чем там дело было. Я в dllmain вызов этой функции прописал на всякий случай. Хотя она оттуда никогда и не должна вызываться. Теперь нужно прописать выделение памяти и т.д., то, что ты выше предложил.

Dart Sergius пишет:
А адрес функции, которую надо заменять, надо считать

Ммм, а зачем? Ее адрес постоянный. Адреса в ехе у меня вообще не меняются.

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

Вторая обнаружилась в процессе отладки. Почему-то запись переменной RootPathName в моей функции происходит не потому адресу, где она должна быть записана. У меня она записывается в 22FADC, а код ее ожидает в 22FC04. Т.е. все это естественно оффсет от EBP. Должно быть [EBP - 104], а оказывается она в [EBP - 23B].

Код на всякий случай ниже.

Code:
  1. extern "C" __declspec(dllexport) bool sub_51F36F(const char *Str2, int a2)
  2. {
  3.   static CHAR FileSystemNameBuffer;
  4.   static CHAR Str1;
  5.   static DWORD FileSystemFlags;
  6.   static DWORD VolumeSerialNumber;
  7.  
  8.   static DWORD MaximumComponentLength;
  9.   static char RootPathName;
  10.   static char FileName[MAX_PATH];
  11.   
  12.  
  13. GetModuleFileNameA(0, FileName, sizeof(FileName));
  14. _splitpath(FileName,&RootPathName,NULL,NULL,NULL);
  15.  
  16. strcat(&RootPathName, "\");
  17.  
  18. if ( !(GetVolumeInformationA(&RootPathName,&Str1,sizeof(Str1),&VolumeSerialNumber,&MaximumComponentLength,&FileSystemFlags,&FileSystemNameBuffer,sizeof(FileSystemNameBuffer))))
  19. {
  20.          DWORD LError = GetLastError();
  21. }
  22. return RootPathName != 0;
  23. }




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

Создано: 15 мая 2012 14:28
· Личное сообщение · #24

>>> Вторая обнаружилась в процессе отладки. Почему-то запись переменной RootPathName в моей функции происходит не потому адресу, где она должна быть записана

С этим почти разобрался. Второй параметр в sub_51F36F(const char *Str2, int a2), а именно а2 - это адрес структуры данных. Думаю, как лучше написать офсет от этого адреса, чтобы получить указатель на правильный адрес для RootPathName.



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

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

Дай исходную DLL, я напишу тебе, как она выглядела в исходнике. Можно через ЛС.

P.S. Hex-Rays дерьмо.

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

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

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

int пишет:
Дай исходную DLL, я напишу тебе, как она выглядела в исходнике. Можно через ЛС.


Это не dll - это ехе и довольно длинный. Я тебе на ЛС скинул ту функцию, которую я меняю. Суть в том, что эта функция в оригинале перебирает все буквы алфавита пока не найдет ту, к которой прикреплен CDROM на этом компе. Потом она эту букву запоминает и, дальше по коду (уже не в этой функции) это значение используется, чтобы открыть 2 файла на сидюке, если это проходит успешно, то программа счастлива, что сидюк на месте и не пишет, что он нужен в дальнейшем.

Моя функция должна запомнить (по нужному адресу, что пока что не получилось) имя драйва с которого вызывался ехе. Для простоты, вместо того, чтобы запоминать весь путь до ехе, я решил запомнить только букву драйва. Чтобы мой код работал, директорию в которой находится ехе, нужно будет замэпить на любую букву.

Заработало с помощью int. У меня изначально была ошибка с возвращаемым значением. Большое спасибо.

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

P.S. Да и довольно понятно, что происходит, только опыта пока немного нехватает...



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

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

Сейчас у меня есть 2 инжектора. Один нормально вставляет dll. Только это происходит после запуска процесса, что несколько неудобно.

Второй способ запускает процесс сам, но работает он только на программах типа notepad или iexplorer. Т.е. для них он вставляет dll без проблем. Этот второй инжектор создан на базе DetourCreateProcessWithDll. При его запуске, он запускает программу и та вылетает с ошибкой: The application failed to initialize properly (0xc0000142). Clik on OK to terminate the application. Плюс ошибка SmartHeap вылезает см прикрепленный файл. Можно это как-то пофиксить?

Эта проблема решена. Я использовал debug версию dll вместо релизной и это создавало конфликт при запуске. Теперь все заработало. Процесс запускается инжектором, что очень удобно.

Поскольку dll инжектирована эта тема закрыта.

cca6_18.05.2012_EXELAB.rU.tgz - ErrorMessage.JPG


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