Определть место, откуда была выделена память

Тема в разделе "WASM.RESEARCH", создана пользователем Kasparov, 19 авг 2009.

  1. Kasparov

    Kasparov New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2009
    Сообщения:
    22
    Есть процедура

    Код (Text):
    1. .text:008FC8B0 FIGZNAET        proc near               ; DATA XREF: .rdata:00B1E0D0o
    2. .text:008FC8B0
    3. .text:008FC8B0 var_C           = byte ptr -0Ch
    4. .text:008FC8B0 var_8           = dword ptr -8
    5. .text:008FC8B0 var_4           = dword ptr -4
    6. .text:008FC8B0 arg_0           = dword ptr  4
    7. .text:008FC8B0 arg_4           = dword ptr  8
    8. .text:008FC8B0
    9. .text:008FC8B0                 sub     esp, 0Ch
    10. .text:008FC8B3                 push    esi
    11. .text:008FC8B4                 mov     esi, ecx
    12. .text:008FC8B6                 cmp     byte ptr [esi+0Ch], 0
    13. .text:008FC8BA                 jnz     short loc_8FC8CD
    14. .text:008FC8BC                 mov     eax, [esp+10h+arg_0]
    15. .text:008FC8C0                 mov     dword ptr [eax], 2749h
    16. .text:008FC8C6                 pop     esi
    17. .text:008FC8C7                 add     esp, 0Ch
    18. .text:008FC8CA                 retn    8
    19. .text:008FC8CD ; ---------------------------------------------------------------------------
    20. .text:008FC8CD
    21. .text:008FC8CD loc_8FC8CD:                             ; CODE XREF: FIGZNAET+Aj
    22. .text:008FC8CD                 push    edi
    23. .text:008FC8CE                 mov     edi, [esp+14h+arg_4]
    24. .text:008FC8D2                 mov     ecx, edi
    25. .text:008FC8D4                 call    qwe
    26. .text:008FC8D9                 mov     ecx, [esi+28h]
    27. .text:008FC8DC                 add     eax, 4
    28. .text:008FC8DF                 add     ecx, eax
    29. .text:008FC8E1                 cmp     ecx, 40000h
    30. .text:008FC8E7                 jge     loc_8FCA5B
    31. .text:008FC8ED                 push    ebx
    32. .text:008FC8EE                 push    ebp
    33. .text:008FC8EF                 mov     ecx, edi
    34. .text:008FC8F1                 call    qwe
    35. .text:008FC8F6                 mov     edx, [edi]
    36. .text:008FC8F8                 mov     ecx, [esi+28h]
    37. .text:008FC8FB                 add     ecx, [esi+8]
    38. .text:008FC8FE                 add     eax, 4
    39. .text:008FC901                 push    eax             ; Size
    40. .text:008FC902                 mov     eax, [edx+4]
    41. .text:008FC905                 push    eax             ; Src
    42. .text:008FC906                 push    ecx             ; Dst
    43. .text:008FC907                 call    memcpy
    44. .text:008FC90C                 mov     edi, dword_C67870
    45. .text:008FC912                 mov     ebp, [esi+28h]
    46. .text:008FC915                 mov     edx, dword_C67878
    47. .text:008FC91B                 add     ebp, [esi+8]
    48. .text:008FC91E                 add     edx, edi
    49. .text:008FC920                 xor     edx, [ebp+0]
    50. .text:008FC923                 mov     ebx, edi
    51. .text:008FC925                 and     edi, 3
    52. .text:008FC928                 movzx   eax, byte_C5A661[edi*8]
    53. .text:008FC930                 mov     [esp+28h+var_8], edx
    54. .text:008FC934                 movzx   ecx, byte ptr [esp+eax+28h+var_8]
    55. .text:008FC939                 add     esp, 0Ch
    56. .text:008FC93C                 mov     [esp+1Ch+var_C], cl
    57. .text:008FC940                 mov     edx, offset dword_C67870
    58. .text:008FC945                 mov     ecx, [edx+4]
    59. .text:008FC948                 movzx   eax, [esp+1Ch+var_C]
    60. .text:008FC94D                 ror     al, cl
    61. .text:008FC94F                 xor     al, [edx+8]
    62. .text:008FC952                 mov     edx, off_C5A5E0[ecx*4]
    63. .text:008FC959                 mov     al, [edx+eax]
    64. .text:008FC95C                 movzx   edx, byte_C5A660[edi*8]
    65. .text:008FC964                 mov     byte ptr [esp+edx+1Ch+var_4], al
    66. .text:008FC968                 movzx   eax, byte_C5A663[edi*8]
    67. .text:008FC970                 movzx   ecx, byte ptr [esp+eax+1Ch+var_8]
    68. .text:008FC975                 mov     [esp+1Ch+var_C], cl
    69. .text:008FC979                 mov     edx, offset dword_C67870
    70. .text:008FC97E                 mov     ecx, [edx+4]
    71. .text:008FC981                 movzx   eax, [esp+1Ch+var_C]
    72. .text:008FC986                 ror     al, cl
    73. .text:008FC988                 xor     al, [edx+8]
    74. .text:008FC98B                 mov     edx, off_C5A5E0[ecx*4]
    75. .text:008FC992                 mov     al, [edx+eax]
    76. .text:008FC995                 movzx   edx, byte_C5A662[edi*8]
    77. .text:008FC99D                 mov     byte ptr [esp+edx+1Ch+var_4], al
    78. .text:008FC9A1                 movzx   eax, byte_C5A665[edi*8]
    79. .text:008FC9A9                 movzx   ecx, byte ptr [esp+eax+1Ch+var_8]
    80. .text:008FC9AE                 mov     [esp+1Ch+var_C], cl
    81. .text:008FC9B2                 mov     edx, offset dword_C67870
    82. .text:008FC9B7                 mov     ecx, [edx+4]
    83. .text:008FC9BA                 movzx   eax, [esp+1Ch+var_C]
    84. .text:008FC9BF                 ror     al, cl
    85. .text:008FC9C1                 xor     al, [edx+8]
    86. .text:008FC9C4                 mov     edx, off_C5A5E0[ecx*4]
    87. .text:008FC9CB                 mov     al, [edx+eax]
    88. .text:008FC9CE                 movzx   edx, byte_C5A664[edi*8]
    89. .text:008FC9D6                 mov     byte ptr [esp+edx+1Ch+var_4], al
    90. .text:008FC9DA                 movzx   eax, stru_C5A667.anonymous_0[edi*8]
    91. .text:008FC9E2                 movzx   ecx, byte ptr [esp+eax+1Ch+var_8]
    92. .text:008FC9E7                 mov     [esp+1Ch+var_C], cl
    93. .text:008FC9EB                 mov     edx, offset dword_C67870
    94. .text:008FC9F0                 mov     ecx, [edx+4]
    95. .text:008FC9F3                 movzx   eax, [esp+1Ch+var_C]
    96. .text:008FC9F8                 ror     al, cl
    97. .text:008FC9FA                 xor     al, [edx+8]
    98. .text:008FC9FD                 mov     edx, off_C5A5E0[ecx*4]
    99. .text:008FCA04                 mov     al, [edx+eax]
    100. .text:008FCA07                 movzx   edx, byte_C5A666[edi*8]
    101. .text:008FCA0F                 mov     byte ptr [esp+edx+1Ch+var_4], al
    102. .text:008FCA13                 mov     eax, [esp+1Ch+var_4]
    103. .text:008FCA17                 mov     cl, bl
    104. .text:008FCA19                 and     cl, 0Fh
    105. .text:008FCA1C                 ror     eax, cl
    106. .text:008FCA1E                 mov     ecx, [esp+1Ch+arg_4]
    107. .text:008FCA22                 and     ebx, 0FFh
    108. .text:008FCA28                 xor     eax, dword_C581E0[ebx*4]
    109. .text:008FCA2F                 mov     [ebp+0], eax
    110. .text:008FCA32                 call    qwe
    111. .text:008FCA37                 mov     edx, [esi]
    112. .text:008FCA39                 add     eax, 4
    113. .text:008FCA3C                 add     [esi+28h], eax
    114. .text:008FCA3F                 mov     eax, [edx+8]
    115. .text:008FCA42                 mov     ecx, esi
    116. .text:008FCA44                 call    eax                ;отсылка сгенерированного пакета
    117. .text:008FCA46                 pop     ebp
    118. .text:008FCA47                 pop     ebx
    119. .text:008FCA48                 mov     [esi+34h], eax
    120. .text:008FCA4B                 mov     ecx, eax
    121. .text:008FCA4D                 mov     eax, [esp+14h+arg_0]
    122. .text:008FCA51                 pop     edi
    123. .text:008FCA52                 mov     [eax], ecx
    124. .text:008FCA54                 pop     esi
    125. .text:008FCA55                 add     esp, 0Ch
    126. .text:008FCA58                 retn    8
    127. .text:008FCA5B ; ---------------------------------------------------------------------------
    128. .text:008FCA5B
    129. .text:008FCA5B loc_8FCA5B:                             ; CODE XREF: FIGZNAET+37j
    130. .text:008FCA5B                 mov     eax, [esp+14h+arg_0]
    131. .text:008FCA5F                 mov     dword ptr [esi+34h], 2747h
    132. .text:008FCA66                 mov     ecx, [esi+34h]
    133. .text:008FCA69                 pop     edi
    134. .text:008FCA6A                 mov     [eax], ecx
    135. .text:008FCA6C                 pop     esi
    136. .text:008FCA6D                 add     esp, 0Ch
    137. .text:008FCA70                 retn    8
    138. .text:008FCA70 FIGZNAET        endp
    Известно, что в [edx+4] (см. строку .text:008FC902) хранится указатель на память, предположительно выделенную с помощью сишного оператора new.
    Можно ли как-то определить место в программе, где этот кусок памяти был выделен?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ф-ии передается аргумент: адрес.
    ...
    .text:008FC8CE mov edi, [esp+14h+arg_4]
    ...
    По этому адресу происходит чтение:
    ..
    .text:008FC8F6 mov edx, [edi]
    ...
    Видимо, в [this + 0x0] хранится адрес объекта, который содержит искомый адрес (сколько раз уэе это слово повторил :) ). Значит, надо просмотреть ф-ию qwe (похоже, что это метод объекта, адрес которого передается в ecx). Весьма вероятно, что qwe как раз пишет что-то по адресу [this + 0х0]. Если руками это делать лень, то можно поставить точку останова на запись в [this + 0x0]. Если запись происходит в qwe, точка сработает и копать надо от нее. Если нет -- подниматься выше по стеку.

    Код, похоже, писался на С++, поэтому реверс в основном сводится к поиску конструкторов.
     
  3. Kasparov

    Kasparov New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2009
    Сообщения:
    22
    Код (Text):
    1. qwe proc near
    2. mov     eax, [ecx]
    3. mov     ecx, [eax+4]
    4. mov     eax, [ecx]
    5. retn
    6. qwe endp
    К сожалению, qwe нич не пишет в начало объекта

    Точку останова на запись в [this + 0x0] поставить не получится, т к память под объект выделяется динамически, а функция FIGZNAET вызывается только один раз при формировании первого пакета(авторизация).
    Бряк на new ставить тож бесполезно, она вызывается около 1000 раз((
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Тогда придется подниматься вверх по стеку, отслеживая где происходит создание объекта.
     
  5. Kasparov

    Kasparov New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2009
    Сообщения:
    22
    Mika0x65
    Так я и делал, просто в дизас листинге черт ногу сломит - программёры постарались - применили все многообразие технологий микрософт(((
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ну, как вариант тогда можно сделать так:

    1. Патчим ф-ию malloc так, чтобы она выводила куда-нибудь пару: "адрес вызова"/"возвращаемый адрес".
    2. Ставим точку останова на "FIGZNAET" и ищем адрес требуемого объекта в полученном на предыдущем шаге списке.
    3. Берем оттуда адрес вызова :).
     
  7. Kasparov

    Kasparov New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2009
    Сообщения:
    22
    Mika0x65
    А это вариант)) Спасибо