+ Reply to Thread
Results 1 to 20 of 20

Thread: Диазсм ООП

  1. #1

    Default Диазсм ООП

    Доброго времени суток.

    Подскажите пожайлуста, а происходит вызов ООП функции? где можно почитать...

    Просто собсвтенно сейчас смотрю Qt код приложения и то место по идеи(но не факт), что мне надо выглядит вот так:
    PHP Code:
    .text:004013EA lea     eax, [esi+1Ch]
    .
    text:004013ED push    eax
    .text:004013EE lea     ecx, [esp+60h+var_40]
    .
    text:004013F2 call    edi QString::operator==(QString const &) ; QString::operator==(QString const &)
    .
    text:004013F4 test    alal
    .text:004013F6 jz      short loc_40 
    Что из этого всего строка, с к-ой будет сравниваться? Я так понимаю что-то должно быть объектом this, а что-то собственно строкой самой....

    А да собсвтенно вопрос, а как вообще исходя из дизасма получить саму строку с класса QString. Можно хоть на словах или примерчик.

    Буду благодарен за помощь.

  2. #2

    Default Re: Диазсм ООП

    Итак, если честно я не совсем понимаю что вы спрашиваете. Код который вы привели - скорее всего метод какого-то класса и я представляю его примерно так(псевдокод)
    PHP Code:
    some_method(...)
    {
        
    QString str;
        ...
        if(
    str == this->some_str)
        ...

    Указатель this, который у вас передается через ecx - это и есть объект класса QString который мы назвали str.
    Last edited by Sholar; 18-01-2013 at 20:05.

  3. 2 пользователя(ей) сказали cпасибо:
    coldfire (18-01-2013) root (18-01-2013)
  4. #3
    root's Avatar

    Default Re: Диазсм ООП

    Почитай "Искусство дизассемблирования, Крис Касперски"

    PS: А лучше тренируйся на примерах. Пишешь пустой main и в него пихаешь все, что хочешь исследовать. Затем компилишь и смотришь в Иде или Ольке.
    Успех – это путь от провала до провала без потери энтузиазма. (В. Черчиль)

    Не бойся идти медленно, бойся остановиться. (Китайская пословица)

    When you lose fun and start doing things only for the payback, you're dead. (c) TCLH (Phrack 65, Intro)

  5. #4

    Default Re: Диазсм ООП

    Quote Originally Posted by Sholar View Post
    Итак, если честно я не совсем понимаю что вы спрашиваете. Код который вы привели - скорее всего метод какого-то класса и я представляю его примерно так(псевдокод)
    PHP Code:
    some_method(...)
    {
        
    QString str;
        ...
        if(
    str == this->some_str)
        ...

    Указатель this, который у вас передается через ecx - это и есть объект класса this указывающий на str.
    Одну часть я узнал спасибо.
    А второе я спрашивал след.

    Вот вы написали if(str == this->some_str) и как из этого вытащить саму строку? или надо в момент создание где вызывается конструктора поймать строку?

  6. #5
    root's Avatar

    Default Re: Диазсм ООП

    Ну, во-первых, дан слишком маленький кусок дизасма. Во-вторых, не у всех установлен QT (ладно бы его ставить 5-минут дела было). И в третьих желательно выкладывать анализируемый файл.

    Исходя из предоставленного кода, я могу сказать, что указатель на строку ты найдешь внутри этой функции (но это же очевидно?):
    Code:
     .text:004013F2 call    edi ; QString::operator==(QString const &) ; QString::operator==(QString const &)
    Успех – это путь от провала до провала без потери энтузиазма. (В. Черчиль)

    Не бойся идти медленно, бойся остановиться. (Китайская пословица)

    When you lose fun and start doing things only for the payback, you're dead. (c) TCLH (Phrack 65, Intro)

  7. #6

    Default Re: Диазсм ООП

    Вот вы написали if(str == this->some_str) и как из этого вытащить саму строку?
    Это у нас объекты класса QString, который может сам по себе иметь сколь угодно сложную структуру, этот класс надо ковырять конкретно. Может строка лежит по какому-то определенному смещению от начала памяти принадлежащей экземпляру, может лежит не сама строка, а указатель на нее, а может указатель на какой-то внутренний класс содержащий строку. Вобщем, это я к тому, что тут нет универсального способа, надо исследовать QString. Можно попытаться найти место где какой-либо экземпляр QString инициализируется и посмотреть, куда в итоге сохраняется строка. Или хотябы расковырять тот же метод сравнения.

  8. #7

    Default Re: Диазсм ООП

    Я пробывал расковырять метод сравнения, но что-то я там не нашел ее вроде... Вот бинарь.\

    То что о чем говорю я, и думаю , что это то, что мне надо находится, кто использует иду в ф-ии sub_401140 по адресу 004013ее.

    просто вот даже вначале ф-ии вызывается ф-ия text() , к-ая возвращает собсвстенно на сколько я понимаю введеную строку и опять же таки я не могу узнать, что это именно введеная строка, пока получается не разревершку сам класс QString...
    Attached Files
    Last edited by coldfire; 18-01-2013 at 20:54.

  9. #8

    Default Re: Диазсм ООП

    Sholar, вы не имеете прав для доступа к этой странице. Это может быть вызвано несколькими причинами:
    Ваш аккаунт имеет недостаточно прав для доступа к этой странице. Вы пытаетесь редактировать чьё-то сообщение, использовать административные полномочия или прочие опции ограниченного доступа?
    Вы пытаетесь написать сообщение, но ваш аккаунт отключён администрацией или ожидает активации.
    Залей куда-нибудь еще.

  10. #9

    Default Re: Диазсм ООП


  11. #10

    Default Re: Диазсм ООП

    Набираем в гугле QString reference. Попадаем сюда и начинаем искать интересные методы. Мне показался подходящим
    QChar * data ()
    Смотрим дизасм метода в QtCore4
    PHP Code:
    .text:671401B0                 push    esi             
    .text:671401B1                 mov     esiecx
    .text:671401B3                 mov     eax, [esi]
    .
    text:671401B5                 mov     eax, [eax]
    .
    text:671401B7                 cmp     eax1
    .text:671401BA                 jnz     short loc_671401C6
    .text:671401BC                 mov     eax, [esi]
    .
    text:671401BE                 lea     ecx, [eax+12h]
    .
    text:671401C1                 cmp     [eax+0Ch], ecx
    .text:671401C4                 jz      short loc_671401D4
    .text:671401C6
    .text:671401C6 loc_671401C6:                           ; CODE XREFQString::data(void)+Aj
    .text:671401C6                 mov     ecxesi
    .text:671401C8                 call    ?realloc@QString@@AAEXXZ QString::realloc(void)
    .
    text:671401CD                 mov     edx, [esi]
    .
    text:671401CF                 mov     eax, [edx+0Ch]
    .
    text:671401D2                 pop     esi
    .text:671401D3                 retn 
    Видим, что возвращается this+0Ch. То есть указатель находится по смещению в 12 байтов от начала памяти занимаемой экземпляром класса.

  12. 2 пользователя(ей) сказали cпасибо:
    coldfire (19-01-2013) root (18-01-2013)
  13. #11
    root's Avatar

    Default Re: Диазсм ООП

    Я не стал заморачиваться и полез прямиком в "QString::operator==(QString const &)", результат ниже:


    Очевидно, что в ESP+arg_0 содержится указатель на объект QString, а [ecx] - this.

    Первая проверка "jz short loc_6705BFE5" - это проверка на соответствие объектов размеров строк, т.е. хотят убедиться, не сравниваем ли мы один и тот же объект равны ли размеры строк, и если это так, то сравнение продолжается.

    Если же объекты не одинаковы размеры строк одинаковы, то вытаскиваем указатели на строки:
    Code:
    str1 = [*QString+0Ch]
    str2 = [*this+0Ch]
    И передаем их на сравнение в процедуру sub_6705BB20.
    Last edited by root; 26-01-2013 at 22:30.
    Успех – это путь от провала до провала без потери энтузиазма. (В. Черчиль)

    Не бойся идти медленно, бойся остановиться. (Китайская пословица)

    When you lose fun and start doing things only for the payback, you're dead. (c) TCLH (Phrack 65, Intro)

  14. 2 пользователя(ей) сказали cпасибо:
    Sholar (19-01-2013) coldfire (19-01-2013)
  15. #12

    Default Re: Диазсм ООП

    Quote Originally Posted by root View Post
    Если же объекты не одинаковы, то вытаскиваем указатели на строки:
    Code:
    str1 = [*QString+0Ch]
    str2 = [*this+0Ch]
    И передаем их на сравнение в процедуру sub_6705BB20.
    Толи я что-то не правильно понял или как-то не много не так происходит. По поводу первой строки ( str1 ) , тут больше похоже, что по [*QString+0Ch] находится указатель this, а не строка. Строка начинается чуть ниже и тоже как-то странно идет. Вот смотрите картинку:
    Вот сама ссылка, а то плохо видно что-то http://s1.ipicture.ru/Gallery/Viewfull/20971133.html.

    Собственно, после вызова ф-ии text, она мне вернула QString, его адрес, к-ый находится в стеке по адресу 0012d710. Исходя из этого получаем, что адрес самой QString = 0x00A15478, далее переходим на этот адрес, прибавляем к нему 0Сh и получаем я так понимаю указатель this.а строка идет через 3 байта, она у меня начинается на ini....

    Хотя очень по хожу на адрес начала строки 0012d710+0Сh.

    Тогда надо поискать где this хранится.

    Где я не правильно что-то понял, что у меня не совпадает?
    Last edited by coldfire; 19-01-2013 at 10:41.

  16. #13

    Default Re: Диазсм ООП

    По поводу первой строки ( str1 ) , тут больше похоже, что по [*QString+0Ch] находится указатель this, а не строка. Строка начинается чуть ниже и тоже как-то странно идет. Вот смотрите картинку:
    [*QString] - это и есть this. Далее все смещения считаются относительно него. Строки в QString юникодовские.

  17. #14

    Default Re: Диазсм ООП

    Ура, крякми решил....

    А теперь по поводу this, я то понял, что [*QString] - это this, просто я говорил к тому, что получается, что [*QString + 0Ch] - является только указателем на начало строки, а не уже началом строки, исходя из моего рисунка, либо я не правильно прибавил смещение

  18. #15
    root's Avatar

    Default Re: Диазсм ООП

    Небольшое уточнение своих слов:


    и разъяснение с this'ом:

    Code:
    [0xaaaabbbb] = 0x12345670
    
    0x12345670 struct {
                          0x0 reserved   <= *QString
                          0x8 pSize      <= *QString + 8 
                          0xC pString    <= *QString + C
    }
    
    QString = this(QString) = 0xaaaabbbb
    
    *QString = [QString]
    
    pSize = *QString + 8
    Size = [pSize]
    
    pString = *QString + C
    String = [pString]

    Ура, крякми решил....
    Поздравляю! =)
    Last edited by root; 19-01-2013 at 16:25.
    Успех – это путь от провала до провала без потери энтузиазма. (В. Черчиль)

    Не бойся идти медленно, бойся остановиться. (Китайская пословица)

    When you lose fun and start doing things only for the payback, you're dead. (c) TCLH (Phrack 65, Intro)

  19. Пользователь сказал cпасибо:
    coldfire (19-01-2013)
  20. #16
    root's Avatar

    Default Re: Диазсм ООП

    А теперь по поводу this, я то понял, что [*QString] - это this, просто я говорил к тому, что получается, что [*QString + 0Ch] - является только указателем на начало строки, а не уже началом строки, исходя из моего рисунка, либо я не правильно прибавил смещение
    Если честно, то по твоим словам, вообще было мало чего понятно. Например:

    что адрес самой QString = 0x00A15478, далее переходим на этот адрес, прибавляем к нему 0Сh и получаем я так понимаю указатель this.а строка идет через 3 байта, она у меня начинается на ini....
    Из твоих слов получается:
    Code:
    QString = 0012d710
    *QString = [0012d710] = 0x00A15478
    this = *QString + 0C
    Теперь ты говоришь, что:
    А теперь по поводу this, я то понял, что [*QString] - это this, просто я говорил к тому, что получается, что [*QString + 0Ch] - является только указателем на начало строки, а не уже началом строки, исходя из моего рисунка, либо я не правильно прибавил смещение
    Хотя я тебе еще в самом начале сказал:
    Если же объекты не одинаковы размеры строк одинаковы, то вытаскиваем указатели на строки:
    Code:
    str1 = [*QString+0Ch]
    str2 = [*this+0Ch]
    Откуда ясно, что str1 и str2 являются указателями на строки, и никак не началом самих строк или еще чем-либо.
    Last edited by root; 19-01-2013 at 17:33.
    Успех – это путь от провала до провала без потери энтузиазма. (В. Черчиль)

    Не бойся идти медленно, бойся остановиться. (Китайская пословица)

    When you lose fun and start doing things only for the payback, you're dead. (c) TCLH (Phrack 65, Intro)

  21. #17

    Default Re: Диазсм ООП

    Quote Originally Posted by root View Post
    Небольшое уточнение своих слов:


    и разъяснение с this'ом:

    Code:
    [0xaaaabbbb] = 0x12345670
    
    0x12345670 struct {
                          0x0 reserved   <= *QString
                          0x8 pSize      <= *QString + 8 
                          0xC pString    <= *QString + C
    }
    
    QString = this(QString) = 0xaaaabbbb
    
    *QString = [QString]
    
    pSize = *QString + 8
    Size = [pSize]
    
    pString = *QString + C
    String = [pString]
    Может я не правильно выражался, спору нет =(.
    Но вот все что я и говорил собственно, что *QString + C - это указатель на строку....

    Кого-то заинтересует решения этого крякми в виде туторила?

  22. #18
    root's Avatar

    Default Re: Диазсм ООП

    Всех кто его не решал))) Так что если есть время выложить туториал - выкладывай! Всегда интересно почитать, как, кто и что делал))
    Last edited by root; 19-01-2013 at 18:16.
    Успех – это путь от провала до провала без потери энтузиазма. (В. Черчиль)

    Не бойся идти медленно, бойся остановиться. (Китайская пословица)

    When you lose fun and start doing things only for the payback, you're dead. (c) TCLH (Phrack 65, Intro)

  23. #19

    Default Re: Диазсм ООП

    ОК, тогда на след. неделе напишу и выложу, на этой надо еще перевод сделать ;)

  24. Пользователь сказал cпасибо:
    root (19-01-2013)
  25. #20
    korsader's Avatar

    Default Re: Диазсм ООП

    Crackme не сложный
    Login: PARADISE LOST
    Password:%5(,")G#5"&*4

+ Reply to Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
All times are GMT. The time now is 01:34
vBulletin® Copyright ©2000 - 2018
www.reverse4you.org