Есть процедура Код (Text): .text:008FC8B0 FIGZNAET proc near ; DATA XREF: .rdata:00B1E0D0o .text:008FC8B0 .text:008FC8B0 var_C = byte ptr -0Ch .text:008FC8B0 var_8 = dword ptr -8 .text:008FC8B0 var_4 = dword ptr -4 .text:008FC8B0 arg_0 = dword ptr 4 .text:008FC8B0 arg_4 = dword ptr 8 .text:008FC8B0 .text:008FC8B0 sub esp, 0Ch .text:008FC8B3 push esi .text:008FC8B4 mov esi, ecx .text:008FC8B6 cmp byte ptr [esi+0Ch], 0 .text:008FC8BA jnz short loc_8FC8CD .text:008FC8BC mov eax, [esp+10h+arg_0] .text:008FC8C0 mov dword ptr [eax], 2749h .text:008FC8C6 pop esi .text:008FC8C7 add esp, 0Ch .text:008FC8CA retn 8 .text:008FC8CD ; --------------------------------------------------------------------------- .text:008FC8CD .text:008FC8CD loc_8FC8CD: ; CODE XREF: FIGZNAET+Aj .text:008FC8CD push edi .text:008FC8CE mov edi, [esp+14h+arg_4] .text:008FC8D2 mov ecx, edi .text:008FC8D4 call qwe .text:008FC8D9 mov ecx, [esi+28h] .text:008FC8DC add eax, 4 .text:008FC8DF add ecx, eax .text:008FC8E1 cmp ecx, 40000h .text:008FC8E7 jge loc_8FCA5B .text:008FC8ED push ebx .text:008FC8EE push ebp .text:008FC8EF mov ecx, edi .text:008FC8F1 call qwe .text:008FC8F6 mov edx, [edi] .text:008FC8F8 mov ecx, [esi+28h] .text:008FC8FB add ecx, [esi+8] .text:008FC8FE add eax, 4 .text:008FC901 push eax ; Size .text:008FC902 mov eax, [edx+4] .text:008FC905 push eax ; Src .text:008FC906 push ecx ; Dst .text:008FC907 call memcpy .text:008FC90C mov edi, dword_C67870 .text:008FC912 mov ebp, [esi+28h] .text:008FC915 mov edx, dword_C67878 .text:008FC91B add ebp, [esi+8] .text:008FC91E add edx, edi .text:008FC920 xor edx, [ebp+0] .text:008FC923 mov ebx, edi .text:008FC925 and edi, 3 .text:008FC928 movzx eax, byte_C5A661[edi*8] .text:008FC930 mov [esp+28h+var_8], edx .text:008FC934 movzx ecx, byte ptr [esp+eax+28h+var_8] .text:008FC939 add esp, 0Ch .text:008FC93C mov [esp+1Ch+var_C], cl .text:008FC940 mov edx, offset dword_C67870 .text:008FC945 mov ecx, [edx+4] .text:008FC948 movzx eax, [esp+1Ch+var_C] .text:008FC94D ror al, cl .text:008FC94F xor al, [edx+8] .text:008FC952 mov edx, off_C5A5E0[ecx*4] .text:008FC959 mov al, [edx+eax] .text:008FC95C movzx edx, byte_C5A660[edi*8] .text:008FC964 mov byte ptr [esp+edx+1Ch+var_4], al .text:008FC968 movzx eax, byte_C5A663[edi*8] .text:008FC970 movzx ecx, byte ptr [esp+eax+1Ch+var_8] .text:008FC975 mov [esp+1Ch+var_C], cl .text:008FC979 mov edx, offset dword_C67870 .text:008FC97E mov ecx, [edx+4] .text:008FC981 movzx eax, [esp+1Ch+var_C] .text:008FC986 ror al, cl .text:008FC988 xor al, [edx+8] .text:008FC98B mov edx, off_C5A5E0[ecx*4] .text:008FC992 mov al, [edx+eax] .text:008FC995 movzx edx, byte_C5A662[edi*8] .text:008FC99D mov byte ptr [esp+edx+1Ch+var_4], al .text:008FC9A1 movzx eax, byte_C5A665[edi*8] .text:008FC9A9 movzx ecx, byte ptr [esp+eax+1Ch+var_8] .text:008FC9AE mov [esp+1Ch+var_C], cl .text:008FC9B2 mov edx, offset dword_C67870 .text:008FC9B7 mov ecx, [edx+4] .text:008FC9BA movzx eax, [esp+1Ch+var_C] .text:008FC9BF ror al, cl .text:008FC9C1 xor al, [edx+8] .text:008FC9C4 mov edx, off_C5A5E0[ecx*4] .text:008FC9CB mov al, [edx+eax] .text:008FC9CE movzx edx, byte_C5A664[edi*8] .text:008FC9D6 mov byte ptr [esp+edx+1Ch+var_4], al .text:008FC9DA movzx eax, stru_C5A667.anonymous_0[edi*8] .text:008FC9E2 movzx ecx, byte ptr [esp+eax+1Ch+var_8] .text:008FC9E7 mov [esp+1Ch+var_C], cl .text:008FC9EB mov edx, offset dword_C67870 .text:008FC9F0 mov ecx, [edx+4] .text:008FC9F3 movzx eax, [esp+1Ch+var_C] .text:008FC9F8 ror al, cl .text:008FC9FA xor al, [edx+8] .text:008FC9FD mov edx, off_C5A5E0[ecx*4] .text:008FCA04 mov al, [edx+eax] .text:008FCA07 movzx edx, byte_C5A666[edi*8] .text:008FCA0F mov byte ptr [esp+edx+1Ch+var_4], al .text:008FCA13 mov eax, [esp+1Ch+var_4] .text:008FCA17 mov cl, bl .text:008FCA19 and cl, 0Fh .text:008FCA1C ror eax, cl .text:008FCA1E mov ecx, [esp+1Ch+arg_4] .text:008FCA22 and ebx, 0FFh .text:008FCA28 xor eax, dword_C581E0[ebx*4] .text:008FCA2F mov [ebp+0], eax .text:008FCA32 call qwe .text:008FCA37 mov edx, [esi] .text:008FCA39 add eax, 4 .text:008FCA3C add [esi+28h], eax .text:008FCA3F mov eax, [edx+8] .text:008FCA42 mov ecx, esi .text:008FCA44 call eax ;отсылка сгенерированного пакета .text:008FCA46 pop ebp .text:008FCA47 pop ebx .text:008FCA48 mov [esi+34h], eax .text:008FCA4B mov ecx, eax .text:008FCA4D mov eax, [esp+14h+arg_0] .text:008FCA51 pop edi .text:008FCA52 mov [eax], ecx .text:008FCA54 pop esi .text:008FCA55 add esp, 0Ch .text:008FCA58 retn 8 .text:008FCA5B ; --------------------------------------------------------------------------- .text:008FCA5B .text:008FCA5B loc_8FCA5B: ; CODE XREF: FIGZNAET+37j .text:008FCA5B mov eax, [esp+14h+arg_0] .text:008FCA5F mov dword ptr [esi+34h], 2747h .text:008FCA66 mov ecx, [esi+34h] .text:008FCA69 pop edi .text:008FCA6A mov [eax], ecx .text:008FCA6C pop esi .text:008FCA6D add esp, 0Ch .text:008FCA70 retn 8 .text:008FCA70 FIGZNAET endp Известно, что в [edx+4] (см. строку .text:008FC902) хранится указатель на память, предположительно выделенную с помощью сишного оператора new. Можно ли как-то определить место в программе, где этот кусок памяти был выделен?
Ф-ии передается аргумент: адрес. ... .text:008FC8CE mov edi, [esp+14h+arg_4] ... По этому адресу происходит чтение: .. .text:008FC8F6 mov edx, [edi] ... Видимо, в [this + 0x0] хранится адрес объекта, который содержит искомый адрес (сколько раз уэе это слово повторил ). Значит, надо просмотреть ф-ию qwe (похоже, что это метод объекта, адрес которого передается в ecx). Весьма вероятно, что qwe как раз пишет что-то по адресу [this + 0х0]. Если руками это делать лень, то можно поставить точку останова на запись в [this + 0x0]. Если запись происходит в qwe, точка сработает и копать надо от нее. Если нет -- подниматься выше по стеку. Код, похоже, писался на С++, поэтому реверс в основном сводится к поиску конструкторов.
Код (Text): qwe proc near mov eax, [ecx] mov ecx, [eax+4] mov eax, [ecx] retn qwe endp К сожалению, qwe нич не пишет в начало объекта Точку останова на запись в [this + 0x0] поставить не получится, т к память под объект выделяется динамически, а функция FIGZNAET вызывается только один раз при формировании первого пакета(авторизация). Бряк на new ставить тож бесполезно, она вызывается около 1000 раз((
Mika0x65 Так я и делал, просто в дизас листинге черт ногу сломит - программёры постарались - применили все многообразие технологий микрософт(((
Ну, как вариант тогда можно сделать так: 1. Патчим ф-ию malloc так, чтобы она выводила куда-нибудь пару: "адрес вызова"/"возвращаемый адрес". 2. Ставим точку останова на "FIGZNAET" и ищем адрес требуемого объекта в полученном на предыдущем шаге списке. 3. Берем оттуда адрес вызова .