Автор Тема: Получение\передача данных в перехваченой ф-ии чужого приложения.  (Прочитано 3006 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Slesar

  • Редкий гость
  • Пол: Мужской
Столкнулся с проблемой: чужое приложение, перехвачена одна из функций (сплайсинг), имеющая входным параметром "ссылку на класс"  или объект класса?...Вобщем выглядит так: public: virtual int __thiscall UNetworkHandler::RequestData(class L2ParamStack &). Этот самый парамстек являетса подобием класса-обертки для массива параметров. И тут начинается темный лес для меня (дизазм из иды):
                 push    esi
                 mov     esi, ecx
                 mov     ecx, [esp+4+arg_0]   // - в есх кладет ту ссылку\указатель\кактамегоправильно..(?под вопросом)
                 call    ds:?Top@L2ParamStack@@QAE_JXZ ; L2ParamStack::Top(void)  // - вызов функции, судя по названию - выталкивающей объект из стека
Далее так:                 mov     ecx, [esi+48h] // тут будет указатель на тот самый массив параметров?
                 mov     edx, [ecx]
                 push    eax
                 mov     eax, [edx+6Ch]
 //в данный момент тот самый массив параметров уже получен в есх (мне так кажется) и идет подготовка следующего шага
                 push    23h   
                 push    offset aCs      ; "cS"
                 push    ecx
                 call    eax    // вызов чегото далее, но к делу отношения уже не имеющего.
...
И итогом - ТЗ: как получить тот самый массив (по всей видимости он так же - лишь набор указателей) если я хукаю начало функции? Или проще будет перенести его(хук) кудато в область конечного call eax ? (пока писал подумал что второе - проще...но - мало ли)
« Последнее редактирование: 06 Декабря 2013, 16:14:35 от Slesar »

Оффлайн Vitalik

  • Авторитет
  • Пол: Мужской

Оффлайн Slesar

  • Редкий гость
  • Пол: Мужской
Да сразу писал бы ссылки на гугл - во все темы постов напихать можно будет.

Оффлайн android

  • Авторитет
Самое простое трассировкой в дебаггере отлавливать.  :D
http://www.ollydbg.de/

Оффлайн ZiP

  • Волшебник
  • Пол: Мужской
Самое простое трассировкой в дебаггере отлавливать.  :D
http://www.ollydbg.de/
Мне кажется проще самому сидеть и втыкать. Чем разбираться, что автор тут написал.
= Оказываем аутсорсинговые услуги по разработке ПО любых направлений и администрирования баз данных Oracle, MS SQL. Сопровождение и доработка существующих конфигураций 1С =

Оффлайн Slesar

  • Редкий гость
  • Пол: Мужской
Посидел, повтыкал...Потыкал палочкой в Пейнткиллера, в итоге - решилось установкой джампа в мою функцию-обертку:
//код в начале моей ф-ии:
 asm
    pop addrBack (адрес возврата, откуда вызвалась оригинальная, сохраняю на будущее)
    mov hndl,ecx  //this
    mov ecx,[esp]  (в стеке и лежит нужный указатель)
    mov PckSp,ecx   //------получил указатель на массив.
  end;
///------------------далее обработка чего там требуетса, снятие хука\вызов восстановленной ф-ии\установка обратно.....
..................
///-----------------------------------------------------------------
  asm
    Push addrBack //вернул адрес возврата
    retn                 // возвращаюсь в "откуда вызвана оригинальная"
  end;
end;

ЗЫ: а какое ныне уважающее себя приложение дозволит себя в дебаггере то смотреть?:) "Снимок" то ладно еще....
« Последнее редактирование: 14 Декабря 2013, 12:19:55 от Slesar »

Оффлайн android

  • Авторитет
Посидел, повтыкал...Потыкал палочкой в Пейнткиллера, в итоге - решилось :)
//код в начале моей ф-ии:
 asm
    pop addrBack (адрес возврата, откуда вызвалась оригинальная, сохраняю на будущее)
    mov hndl,ecx  (в есх - указатель на объект для которого был вызван метод)
    mov ecx,[esp]  (в стеке и лежит нужный указатель)
    mov PckSp,ecx   //------получил указатель на массив.
  end;
///------------------далее обработка чего там требуетса
..................
///-----------------------------------------------------------------
  asm
    Push addrBack //вернул адрес возврата
    retn                 // возвращаюсь в "откуда вызвана оригинальная"
  end;
end;

ЗЫ: а какое ныне уважающее себя приложение дозволит себя в дебаггере то смотреть?:) "Снимок" то ладно еще....
Большая часть обычных программ не имеет какой либо серьезной защиты и вполне легко исследуется тем дебаггером что я ссылку давал. Ещё к нему есть плагины всякие, в том числе и для скрытия дебаггера.
Чтобы сделать какую либо серьезную защиту, нужны очень хорошие знания низкоуровневого программирования и операционной системы, а это в наше время встречается достаточно редко.


Оффлайн ZiP

  • Волшебник
  • Пол: Мужской
А мне интересно что же такое дебажите?
= Оказываем аутсорсинговые услуги по разработке ПО любых направлений и администрирования баз данных Oracle, MS SQL. Сопровождение и доработка существующих конфигураций 1С =

Оффлайн Slesar

  • Редкий гость
  • Пол: Мужской
Это клиент lineage (не саркисянофф). Там winlicense aka Themida, и заодно добавки от авторов одной из защит "ccp guard" внедренные в ф-ю отправки пакета данных серверу, скорее даже не добавки, а полная замена.

Но целостность ф-ий клиента пока видимо не проверяетса - так что такой способ (получение данных до ф-ию отправки) пока работает, хоть и придетса вместо одной перехваченной ф-ии делать "много" (в итоге качество перейдет в количество и количество критов будет расти...;))

ЗЫ: с олькой воевал - но так и не смог запустить ее с клиентом. Говорят что с плагинами типа PhantOm\StrONG это возможно - но у меня не вышло. Довольствуюсь идой (хотя и там не все гладко).
ЗЗЫ: все получилось, начал в лог основного модуля выводить требуемое\желаемое...
npc_268467436_Teleport 1
npc_268467436_birthdayHelper
npc_268467436_Util:NoblessTeleport
npc_268467436_services.TeleToMDT:toMDT
npc_268441560_Chat 9
npc_268441560_Chat 0
npc_268441560_services.TeleToMDT:fromMDT
« Последнее редактирование: 14 Декабря 2013, 14:31:03 от Slesar »

Оффлайн Slesar

  • Редкий гость
  • Пол: Мужской
И так:   
    Command2:=chr(wfa(dest));
    Command:=Command+Command2;                   - работает

    Command:=Command+chr(wfa(dest));              - приложение закрываетса без всяких сообщений.

Ваяю в д2009
« Последнее редактирование: 16 Декабря 2013, 02:20:43 от Slesar »

Оффлайн Slesar

  • Редкий гость
  • Пол: Мужской
Стало вырисовываться вот в таком варианте:
[spoiler]procedure ReadS(_pckSp:PL2paramStack);
begin
  asm
    mov ecx,_pckSp
    mov ecx,[ecx]
    mov ecx,[ecx]
    mov addrstr,ecx
  end;
  strpck:='';
  strpck_:='';
  while ((word((pointer(addrstr))^))<>0) do begin
    strpck_:=strpck_+chr(word((pointer(addrstr))^));
    inc(addrstr,2);
  end;
  strpck:=strpck_;
  strpck_:='23';
  for mmm := 1 to length(strpck) do begin
    strpck_:=(strpck_+inttohex((ord(strpck[mmm])),2));
    strpck_:=strpck_+'00';
  end;
  strpck_:=strpck_+'0000';
end;

procedure Request_New;stdcall;
begin
    asm
        pop addrBack
        mov unh,ecx
        mov ecx,[esp]
        mov PckSp,ecx
        Pushad
    end;
//------------------------------------------------------------------------------
  ReadS(PckSp);
  SendTextToMain(strpck_);
//------------------------------------------------------------------------------
    UnhookCode(@Reques_Old);
    asm
        popad
        mov ecx,unh
        Call Request_Original
        Pushad
    end;
    HookProc('...','.....', @Request_New, @Request_Old);
    asm
        popad
        Push addrBack
        retn
    end;
end;
[/spoiler]
Выглядит весьма сурово, но - вызвано необходимостью :) Почемуто (например) использование     
strpck_:=(strpck_+inttohex((ord(strpck[mmm])),2))+'00';
вместо
    strpck_:=(strpck_+inttohex((ord(strpck[mmm])),2));
    strpck_:=strpck_+'00';
вызывает крит в ходе выполнения. Оформление кода procedure ReadS в виде функции с результатом возвращающим strpck_ - так же приводит к падению во время выполнения.
Что может вызывать такое?
Почему, собсно, происходит то так?
« Последнее редактирование: 16 Декабря 2013, 02:48:44 от Slesar »