Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/54: Рейтинг темы: голосов - 54, средняя оценка - 4.96
1 / 1 / 0
Регистрация: 28.10.2011
Сообщений: 7

Поиск функции в памяти по статическому адресу

29.10.2011, 22:07. Показов 10301. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Прошу прощения заранее, если текст ниже вам покажется бредом, я только начинаю знакомство с программированием на таком уровне.
Вообщем Н/У:
Имеется приложение которое отсылает зашифрованные пакеты стороннему серверу функциями send, а также получает зашифрованный ответ от сервера функциями recv. Алгоритм шифрования и дешифрования неизвестен.
Задачи
  • получить уже дешфированный пакет пришедший от стороннего сервера
  • зашифровать свой пакет функциями приложения для отправки на сторонний сервер
Домыслы
Начнем с ответов стороннего сервера, чтобы расшифровать пришедший ответ, приложению потребуется прогнать его через свою функцию дешифровки, по логике вещей эта функция(дешифровки), должна идти практически сразу за вызовом функции recv и иметь как минимум два параметра(указатель на данные, и размер данных), запустив IDA Pro, и разложив там нужное мне приложение, я нашел адрес функции recv, примерно так:
Assembler
1
2
3
.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 есть что-то интересное:
C
1
2
3
4
5
6
7
8
    
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 и есть функция дешифровки пакета, отчасти в этом меня убедил ее код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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 файле, в памяти понятное дело другой будет, вот не пойму никак( пните пожалуйста что почитать можно, или если не трудно помогите примерчиком.

Заранее всем экспертам огромное спасибо)

Добавлено через 6 часов 11 минут
неужели никто не знает?( укажите хотя бы что искать, читать.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.10.2011, 22:07
Ответы с готовыми решениями:

Узнать имя хоста по статическому IP адресу
Доброго времени суток! Подскажите, существует ли возможность узнать имя хоста по имеющемуся (статическому) IP адресу?

Вызов функции-члена класса по адресу в памяти
Всем хорошего дня :) Допустим, что где-то есть static функция, не принимающая аргументов и ничего не возвращающая. Имея один лишь...

Инструкция по адресу “0x490e355” обратилась к памяти по адресу “0x065ea847” память не может быть “written”
Здравствуйте, при загрузки картинки в хроме появляется такая ошибка и хром дохнет, также это наблюдается в других браузерах когда нажимаешь...

3
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
30.10.2011, 00:24
Во-первых, не совсем понятно откуда у вас исходники Си-функции дешифровки? Или вы сами написали Си-код по ассемблерному листингу, полученному в Ida Pro?
По поводу образа файла в памяти, то обычно exe-шники грузятся по одному базовому адресу и обычно загрузчик их не перемещает (хотя бывают исключения, но при желании можно запретить перемещать образ - обнулив поле DIRECTORY_ENTRY_BASERELOC в DATA_DIRECTORY заголовка файла).
Так что можно сбросить данное поле и не волноваться о возможных изменениях адреса загрузки.

Т.е. как вариант, запускаете прогу под отладчиком и смотрите, по какому адресу размещается функция в живую и далее используете этот адрес.
Думаю, должно сработать.
1
1 / 1 / 0
Регистрация: 28.10.2011
Сообщений: 7
30.10.2011, 02:09  [ТС]
Haster, спасибо за ответ, сильно выручаете)
1) насчет си, IDA Pro это делает сама при нажатии f5, она перегоняет текущую функцию в си. мне он хотя б немного понятен в отличии от асма)
2) увы адреса перемещаются( менять что-то в exe нельзя, ибо он постоянно обновляется.
3) под отладчиком у меня дохнет машина(приложение когда запускается без отладчиком жрет под гиг памяти и периодически сильно грузит проц, отладчик усугубляет в разы), понимаю что проблема моя и моей жадности, но может все таки есть и другой путь?
4) я рассматриваю такой алгоритм:
а) получить смещение для требуемой функции в exe=147C40,
б) получить смещение для функции recv в exe=755234,
в) вычислить их разницу: 755234-147C40=60D5F4,
г) вбить это смещение(60D5F4) в константу в моей dll
д) вычислить смещение(х) по файлу(при запущенном приложении и внедренной длл) функции recv - как его вычислить внятных примеров увы не нашел((((
е) получить расчетом смещение по файлу искомой функции: x+60D5F4=z, имея смещения z вычислить адрес функции(addr) - как имея смещение, получить адрес?
ж) присвоить объявленому в моей длл указателю на прототип искомой функции адрес addr
з) запустить объявленный прототип.

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

1) как вычислить смещение функции объявленной в работающем приложении из подгруженной в него "левой" длл?
2) как имея смещение функции получить адрес функции?

заранее всем спасибо)
1
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
30.10.2011, 11:33
webprofusa, мне не совсем понятно, как вы внедряете в ехешник свою DLL? Просто подменяете оригинальную DLL на свою?
Вообще для таких целей используется обычно функция GetProcAddress, которая возвращает адрес нужной функции.

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

Вообще данный способ вряд ли сработает - т.к. DLL может в разные моменты времени грузиться по разным адресам.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.10.2011, 11:33
Помогаю со студенческими работами здесь

инструкция по адресу 0x7c91ac4a обратилась к памяти по адресу 0x00000010.Память не может быть written
Помогите разобраться пожалуйста!!!!! С:/rsit info.txt logfile of random's system information tool 1.06 2010-05-27 22:37:54 ...

Ошибка: инструкция по адресу 0x00aeb5e2 обратилась к памяти по адресу 0x00000008.память не может быть read
инструкция по адресу 0x00aeb5e2 обратилась к памяти по адресу 0x00000008.память не может быть read . рамка выскакивает при установке...

Ошибка «Инструкция по адресу 0х0093bd32 обратилась к памяти по адресу 0х00000000.Память не может быть «read»
Недавно установили 2ой Windows на диск D, старый остался на C. На первом Windows программа iTunes работала исправно, на новом,при...

Инструкция по адресу 0х68е61526 обратилась к памяти по адресу 0xcdcdcdbd память не может быть "read"
приобрел джойстик speedlink black widow, установил дрова, а после подключения джойстика к компу не запускаются вообще никакие игры и...

Инструкция по адресу 0x73ce8f18 обратилась к памяти по адресу 0х00000004. Память не может быть "read"
Помогите! Не знаю, что случилось :( мой нетбук перестал включаться. В том месте, где обычно появляется выбор пользователя просто черный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru