Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить адрес функции 
:(
    Опции темы
webprofusa
Дата 29.10.2011, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.10.2011

Репутация: нет
Всего: нет



Добрый день!
Прошу прощения заранее, если текст ниже вам покажется бредом, я только начинаю знакомство с программированием на таком уровне.
Вообщем Н/У:
Имеется приложение которое отсылает зашифрованные пакеты стороннему серверу функциями send, а также получает зашифрованный ответ от сервера функциями recv. Алгоритм шифрования и дешифрования неизвестен.
Задачи
1) получить уже дешфированный пакет пришедший от стороннего сервера
2) зашифровать свой пакет функциями приложения для отправки на сторонний сервер
Домыслы
Начнем с ответов стороннего сервера, чтобы расшифровать пришедший ответ, приложению потребуется прогнать его через свою функцию дешифровки, по логике вещей эта функция(дешифровки), должна идти практически сразу за вызовом функции recv и иметь как минимум два параметра(указатель на данные, и размер данных), запустив IDA Pro, и разложив там нужное мне приложение, я нашел адрес функции recv, примерно так:
Код

.idata:00B56834 ; int __stdcall recv(SOCKET s, char *buf, int len, int flags)
.idata:00B56834                 extrn __imp_recv:dword  ; CODE XREF: sub_549FA0+24p
.idata:00B56834                                         ; sub_54A930+381p ...

видим что данную функцию вызывают в двух местах: sub_549FA0 и sub_54A930 (Вопрос 1: правильно ли я понимаю смысл данной записи?), в функции sub_549FA0 дополнительных вызовов функций похожих на функции дешифровки я не нашел( а вот в функции sub_54A930 есть что-то интересное:
Код

v32 = recv(*(_DWORD *)(v1 + 4), (char *)(*(_DWORD *)(v1 + 28) + *(_DWORD *)(v1 + 32)), len, 0);   
...... 
if ( !v57 || sub_548840(*(_DWORD *)(v1 + 28), *(_DWORD *)(v1 + 32)) )
 {
     .........
}
 ........

На мой взгляд sub_548840 и есть функция дешифровки пакета, отчасти в этом меня убедил ее код:
Код

char __cdecl sub_548840(int a1, signed int a2)
{
  signed int v2; // edi@1
  int v3; // eax@2
  char v4; // bl@2
  signed int v5; // ST0C_4@2
  int v6; // ecx@4
  int v7; // ebx@6
  __int64 v8; // qt0@6
  int v9; // esi@6
  char result; // al@8
  int v11; // [sp+4h] [bp-8h]@6
  int v12; // [sp+8h] [bp-4h]@7
  int v13; // [sp+18h] [bp+Ch]@2
 
  v2 = a2;
  if ( a2 < 1 )
  {
    result = 0;
  }
  else
  {
    v4 = *(_BYTE *)a1 & 0x80;
    v5 = a2;
    v13 = ((*(_BYTE *)a1 & 0x80) != 0) + 10;
    v3 = sub_5487F0(a1, v5);
    if ( v3 < 0 || v13 + v3 > v2 )
    {
      result = 0;
    }
    else
    {
      v6 = a1 + 3;
      if ( !v4 )
        v6 = a1 + 2;
      HIDWORD(v8) = (unsigned __int64)*(_BYTE *)v6 << 8 >> 32;
      LODWORD(v8) = *(_BYTE *)(v6 + 1) | (*(_BYTE *)v6 << 8);
      HIDWORD(v8) = (unsigned __int64)(v8 << 8) >> 32;
      LODWORD(v8) = *(_BYTE *)(v6 + 2) | ((_DWORD)v8 << 8);
      HIDWORD(v8) = (unsigned __int64)(v8 << 8) >> 32;
      LODWORD(v8) = *(_BYTE *)(v6 + 3) | ((_DWORD)v8 << 8);
      HIDWORD(v8) = (unsigned __int64)(v8 << 8) >> 32;
      LODWORD(v8) = *(_BYTE *)(v6 + 4) | ((_DWORD)v8 << 8);
      HIDWORD(v8) = (unsigned __int64)(v8 << 8) >> 32;
      LODWORD(v8) = *(_BYTE *)(v6 + 5) | ((_DWORD)v8 << 8);
      HIDWORD(v8) = (unsigned __int64)(v8 << 8) >> 32;
      LODWORD(v8) = *(_BYTE *)(v6 + 6) | ((_DWORD)v8 << 8);
      v9 = *(_BYTE *)(v6 + 7) | ((_DWORD)v8 << 8);
      v7 = (unsigned __int64)(v8 << 8) >> 32;
      sub_4B6F10(a1 + v13, v2 - v13, &v11, 7);
      result = v9 == v11 && v7 == v12;
    }
  }
  return result;
}

Вопрос 2: как думаете вы, уважаемы эксперты?
Итак нужная нам функция найдена(так ли это?)), осталось сделать следующее:
1) создать dll для внедрения в исследуемое приложение
2) перехватить вызов функции recv
3) получить данные от стороннего сервера
4) запустить функцию sub_548840 передав в качестве параметра указатель на полученные данные и их размер(Вопрос 3: правильно ли я понимаю входные параметры?)

Главный вопрос:
С 1-3 проблем вообще никаких не возникает, все ультра просто, получаю зашифрованные данные, но вот как мне запустить найденную мной при дизассемблировании функцию?
Я знаю ее адрес, но это ж адрес в exe файле, в памяти понятное дело другой будет, вот не пойму никак( пните пожалуйста что почитать можно, или если не трудно помогите примерчиком.

Заранее всем экспертам огромное спасибо)
PM MAIL   Вверх
hawk3500
Дата 29.10.2011, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 6.2.2009

Репутация: нет
Всего: 2



1)
Код

.idata:00B56834 ; int __stdcall recv(SOCKET s, char *buf, int len, int flags)
.idata:00B56834                 extrn __imp_recv:dword  ; CODE XREF: sub_549FA0+24p
.idata:00B56834                                         ; sub_54A930+381p ...

не обязательно что только в двух.
Зайдите в IDA  в поис, выбирите поиск текста и ищите recv

2)
ИМХО для получения адреса функции exe файла, надо сделать LoadLibrary и прибавить к полученному адресу, адрес смещения функции.

3)Лучше бы Вы скинули листинг программы на ассемблере...так понятней было бы
--------------------
воин dzen'a
PM MAIL   Вверх
webprofusa
Дата 30.10.2011, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.10.2011

Репутация: нет
Всего: нет



hawk3500,  спасибо огромное) я сщас наверное ниже буду тупить, отнеситесь пожалуйста с пониманием к новичку, но все таки:
1) спасибо, понятно. Но функция вроде б нужная найдена так что вопрос отпадает)
2) (внизу поста листинг функции на асме) кликнув на адрес функции 00548840, выбираю в меню проги file offset, получаю: 147C40 - я так понимаю это и есть требуемое смещение? вопрос по loadLibrary - функция ж вродеб подгружает библиотеки? а у меня ситуация обратная, я внедряю свою длл(в которой и хочу запустить найденную функцию), что мне тогда передать в параметры loadLibrary и поможет ли это мне для получение стартового адреса? что-то мне подсказывает что нет... могу ли сделать следующим образом в таком случае: 
              а) получить смещение для требуемой функции=147C40, 
              б) получить смещение для функции recv=755234, 
              в) вычислить их разницу:  755234-147C40=60D5F4, 
              г) вбить это смещение(60D5F4) в константу в моей dll
              д) вычислить смещение(х) по файлу(при запущенном приложении и внедренной длл) функции recv  - как его вычислить внятных примеров увы не нашел((((
              е) получить расчетом смещение по файлу искомой функции: x+60D5F4=z, имея смещения z вычислить адрес функции(addr) - как имея смещение, получить адрес?
              ж) присвоить объявленому в моей длл указателю на прототип искомой функции адрес addr
              з) запустить объявленный прототип.
Итого в сухом остатке:
1) правильно ли я понимаю алгоритм в моей ситуации?
2) как вычислить смещение функции объявленной в работающем приложении из подгруженной в него "левой" длл?
3) как имея смещение функции получить адрес функции?

заранее спасибо)

P.S. код предполагаемой функции дешифровки пакетов:
Код

.text:00548840 sub_548840      proc near               ; CODE XREF: sub_54A930+43Dp
.text:00548840
.text:00548840 var_8           = dword ptr -8
.text:00548840 var_4           = dword ptr -4
.text:00548840 arg_0           = dword ptr  8
.text:00548840 arg_4           = dword ptr  0Ch
.text:00548840
.text:00548840                 push    ebp
.text:00548841                 mov     ebp, esp
.text:00548843                 sub     esp, 8
.text:00548846                 push    edi
.text:00548847                 mov     edi, [ebp+arg_4]
.text:0054884A                 cmp     edi, 1
.text:0054884D                 jl      loc_548939
.text:00548853                 push    ebx
.text:00548854                 push    esi
.text:00548855                 mov     esi, [ebp+arg_0]
.text:00548858                 mov     bl, [esi]
.text:0054885A                 mov     eax, 0
.text:0054885F                 and     bl, 80h
.text:00548862                 setnz   al
.text:00548865                 push    edi
.text:00548866                 push    esi
.text:00548867                 add     eax, 0Ah
.text:0054886A                 mov     [ebp+arg_4], eax
.text:0054886D                 call    sub_5487F0
.text:00548872                 add     esp, 8
.text:00548875                 test    eax, eax
.text:00548877                 jl      loc_548949
.text:0054887D                 mov     ecx, [ebp+arg_4]
.text:00548880                 add     eax, ecx
.text:00548882                 cmp     eax, edi
.text:00548884                 jg      loc_548949
.text:0054888A                 lea     ecx, [esi+3]
.text:0054888D                 test    bl, bl
.text:0054888F                 jnz     short loc_548894
.text:00548891                 lea     ecx, [esi+2]
.text:00548894
.text:00548894 loc_548894:                             ; CODE XREF: sub_548840+4Fj
.text:00548894                 movzx   eax, byte ptr [ecx]
.text:00548897                 cdq
.text:00548898                 shld    edx, eax, 8
.text:0054889C                 shl     eax, 8
.text:0054889F                 mov     esi, eax
.text:005488A1                 movzx   eax, byte ptr [ecx+1]
.text:005488A5                 mov     ebx, edx
.text:005488A7                 cdq
.text:005488A8                 or      esi, eax
.text:005488AA                 movzx   eax, byte ptr [ecx+2]
.text:005488AE                 or      ebx, edx
.text:005488B0                 shld    ebx, esi, 8
.text:005488B4                 shl     esi, 8
.text:005488B7                 cdq
.text:005488B8                 or      esi, eax
.text:005488BA                 movzx   eax, byte ptr [ecx+3]
.text:005488BE                 or      ebx, edx
.text:005488C0                 shld    ebx, esi, 8
.text:005488C4                 cdq
.text:005488C5                 shl     esi, 8
.text:005488C8                 or      esi, eax
.text:005488CA                 movzx   eax, byte ptr [ecx+4]
.text:005488CE                 or      ebx, edx
.text:005488D0                 shld    ebx, esi, 8
.text:005488D4                 cdq
.text:005488D5                 shl     esi, 8
.text:005488D8                 or      esi, eax
.text:005488DA                 movzx   eax, byte ptr [ecx+5]
.text:005488DE                 or      ebx, edx
.text:005488E0                 shld    ebx, esi, 8
.text:005488E4                 cdq
.text:005488E5                 shl     esi, 8
.text:005488E8                 or      esi, eax
.text:005488EA                 movzx   eax, byte ptr [ecx+6]
.text:005488EE                 or      ebx, edx
.text:005488F0                 shld    ebx, esi, 8
.text:005488F4                 cdq
.text:005488F5                 shl     esi, 8
.text:005488F8                 or      esi, eax
.text:005488FA                 movzx   eax, byte ptr [ecx+7]
.text:005488FE                 mov     ecx, [ebp+arg_0]
.text:00548901                 or      ebx, edx
.text:00548903                 shld    ebx, esi, 8
.text:00548907                 cdq
.text:00548908                 shl     esi, 8
.text:0054890B                 or      esi, eax
.text:0054890D                 mov     eax, [ebp+arg_4]
.text:00548910                 push    7
.text:00548912                 or      ebx, edx
.text:00548914                 lea     edx, [ebp+var_8]
.text:00548917                 push    edx
.text:00548918                 sub     edi, eax
.text:0054891A                 push    edi
.text:0054891B                 add     eax, ecx
.text:0054891D                 push    eax
.text:0054891E                 call    sub_4B6F10
.text:00548923                 cmp     esi, [ebp+var_8]
.text:00548926                 jnz     short loc_548940
.text:00548928                 cmp     ebx, [ebp+var_4]
.text:0054892B                 jnz     short loc_548940
.text:0054892D                 pop     esi
.text:0054892E                 pop     ebx
.text:0054892F                 mov     eax, 1
.text:00548934                 pop     edi
.text:00548935                 mov     esp, ebp
.text:00548937                 pop     ebp
.text:00548938                 retn
.text:00548939 ; ---------------------------------------------------------------------------

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0421 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.