Ищу плагин, снабжающий вызовы виртуальных функций и вызываемые функции ссылками (cross-references). Т.е. работа его заключается в следующем: 1) проводится трейс кода 2) при попадании на инструкцию call reg добавить xref (call reg->[reg]) к call и xref ([reg]<-call reg) к [reg].
До: Код (Text): .text:00439530 sub_439530 proc near ; DATA XREF: .rdata:004EBFE4o .text:00439530 .text:00439530 var_8 = dword ptr -8 .text:00439530 var_4 = dword ptr -4 .text:00439530 .text:00439530 sub esp, 8 .text:00439533 push esi .text:00439534 mov esi, ecx .text:00439536 mov ecx, [esi+4] .text:00439539 mov eax, [ecx] .text:0043953B mov edx, [eax+1Ch] .text:0043953E call edx .text:00439540 mov ecx, [esi+4] .text:00439543 xor eax, eax .text:00439545 mov [esp+0Ch+var_8], eax .text:00439549 mov [esp+0Ch+var_4], eax .text:0043954D mov eax, [ecx] .text:0043954F mov eax, [eax+14h] .text:00439552 lea edx, [esp+0Ch+var_8] .text:00439556 push edx .text:00439557 call eax .text:00439559 test al, al .text:0043955B pop esi .text:0043955C jnz short loc_439566 .text:0043955E xor eax, eax .text:00439560 xor edx, edx .text:00439562 add esp, 8 .text:00439565 retn .text:00439566 ; --------------------------------------------------------------------------- .text:00439566 .text:00439566 loc_439566: ; CODE XREF: sub_439530+2Cj .text:00439566 mov eax, [esp+8+var_8] .text:00439569 mov edx, [esp+8+var_4] .text:0043956D add esp, 8 .text:00439570 retn .text:00439570 sub_439530 endp ======================== .text:0042EE40 ; public: virtual bool __thiscall DataIO::Win32File64::Flush(void) .text:0042EE40 ?Flush@Win32File64@DataIO@@UAE_NXZ proc near ; DATA XREF: .rdata:004E9B6Co .text:0042EE40 mov eax, [ecx+8] .text:0042EE43 push eax ; hFile .text:0042EE44 call ds:FlushFileBuffers .text:0042EE4A neg eax .text:0042EE4C sbb eax, eax .text:0042EE4E neg eax .text:0042EE50 retn .text:0042EE50 ?Flush@Win32File64@DataIO@@UAE_NXZ endp ======================== .text:0042ED70 ; public: virtual bool __thiscall DataIO::Win32File64::GetSize(__int64 *) .text:0042ED70 ?GetSize@Win32File64@DataIO@@UAE_NPA_J@Z proc near .text:0042ED70 ; DATA XREF: .rdata:004E9B64o .text:0042ED70 .text:0042ED70 var_8 = dword ptr -8 .text:0042ED70 var_4 = dword ptr -4 .text:0042ED70 arg_0 = dword ptr 4 .text:0042ED70 .text:0042ED70 mov ecx, [ecx+8] .text:0042ED73 sub esp, 8 .text:0042ED76 lea eax, [esp+8+var_8] .text:0042ED79 push eax ; lpFileSize .text:0042ED7A push ecx ; hFile .text:0042ED7B call ds:GetFileSizeEx .text:0042ED81 test eax, eax .text:0042ED83 jnz short loc_42ED8D .text:0042ED85 xor al, al .text:0042ED87 add esp, 8 .text:0042ED8A retn 4 .text:0042ED8D ; --------------------------------------------------------------------------- .text:0042ED8D .text:0042ED8D loc_42ED8D: ; CODE XREF: DataIO::Win32File64::GetSize(__int64 *)+13j .text:0042ED8D mov eax, [esp+8+arg_0] .text:0042ED91 mov edx, [esp+8+var_8] .text:0042ED94 mov ecx, [esp+8+var_4] .text:0042ED98 mov [eax], edx .text:0042ED9A mov [eax+4], ecx .text:0042ED9D mov al, 1 .text:0042ED9F add esp, 8 .text:0042EDA2 retn 4 .text:0042EDA2 ?GetSize@Win32File64@DataIO@@UAE_NPA_J@Z endp После: Код (Text): .text:00439530 sub_439530 proc near ; DATA XREF: .rdata:004EBFE4o .text:00439530 .text:00439530 var_8 = dword ptr -8 .text:00439530 var_4 = dword ptr -4 .text:00439530 .text:00439530 sub esp, 8 .text:00439533 push esi .text:00439534 mov esi, ecx .text:00439536 mov ecx, [esi+4] .text:00439539 mov eax, [ecx] .text:0043953B mov edx, [eax+1Ch] .text:0043953E call edx ; DataIO::Win32File64::Flush(void) ; DataIO::Win32File64::Flush(void) .text:00439540 mov ecx, [esi+4] .text:00439543 xor eax, eax .text:00439545 mov [esp+0Ch+var_8], eax .text:00439549 mov [esp+0Ch+var_4], eax .text:0043954D mov eax, [ecx] .text:0043954F mov eax, [eax+14h] .text:00439552 lea edx, [esp+0Ch+var_8] .text:00439556 push edx .text:00439557 call eax ; DataIO::Win32File64::GetSize(__int64 *) ; DataIO::Win32File64::GetSize(__int64 *) .text:00439559 test al, al .text:0043955B pop esi .text:0043955C jnz short loc_439566 .text:0043955E xor eax, eax .text:00439560 xor edx, edx .text:00439562 add esp, 8 .text:00439565 retn .text:00439566 ; --------------------------------------------------------------------------- .text:00439566 .text:00439566 loc_439566: ; CODE XREF: sub_439530+2Cj .text:00439566 mov eax, [esp+8+var_8] .text:00439569 mov edx, [esp+8+var_4] .text:0043956D add esp, 8 .text:00439570 retn .text:00439570 sub_439530 endp ======================== .text:0042EE40 ; public: virtual bool __thiscall DataIO::Win32File64::Flush(void) .text:0042EE40 ?Flush@Win32File64@DataIO@@UAE_NXZ proc near ; CODE XREF: sub_439530+E? .text:0042EE40 ; DATA XREF: .rdata:004E9B6Co .text:0042EE40 mov eax, [ecx+8] .text:0042EE43 push eax ; hFile .text:0042EE44 call ds:FlushFileBuffers .text:0042EE4A neg eax .text:0042EE4C sbb eax, eax .text:0042EE4E neg eax .text:0042EE50 retn .text:0042EE50 ?Flush@Win32File64@DataIO@@UAE_NXZ endp ======================== .text:0042ED70 ; public: virtual bool __thiscall DataIO::Win32File64::GetSize(__int64 *) .text:0042ED70 ?GetSize@Win32File64@DataIO@@UAE_NPA_J@Z proc near .text:0042ED70 ; CODE XREF: sub_439530+27p .text:0042ED70 ; DATA XREF: .rdata:004E9B64o .text:0042ED70 .text:0042ED70 var_8 = dword ptr -8 .text:0042ED70 var_4 = dword ptr -4 .text:0042ED70 arg_0 = dword ptr 4 .text:0042ED70 .text:0042ED70 mov ecx, [ecx+8] .text:0042ED73 sub esp, 8 .text:0042ED76 lea eax, [esp+8+var_8] .text:0042ED79 push eax ; lpFileSize .text:0042ED7A push ecx ; hFile .text:0042ED7B call ds:GetFileSizeEx .text:0042ED81 test eax, eax .text:0042ED83 jnz short loc_42ED8D .text:0042ED85 xor al, al .text:0042ED87 add esp, 8 .text:0042ED8A retn 4 .text:0042ED8D ; --------------------------------------------------------------------------- .text:0042ED8D .text:0042ED8D loc_42ED8D: ; CODE XREF: DataIO::Win32File64::GetSize(__int64 *)+13j .text:0042ED8D mov eax, [esp+8+arg_0] .text:0042ED91 mov edx, [esp+8+var_8] .text:0042ED94 mov ecx, [esp+8+var_4] .text:0042ED98 mov [eax], edx .text:0042ED9A mov [eax+4], ecx .text:0042ED9D mov al, 1 .text:0042ED9F add esp, 8 .text:0042EDA2 retn 4 .text:0042EDA2 ?GetSize@Win32File64@DataIO@@UAE_NPA_J@Z endp Семпл сделан с помощью плагина "Change the callee address Alt+F11". Обратите внимание на добавление в комментариях названий процедур куда идёт вызов по call reg и добавление перекрестных ссылок к самим функциям, которые вызываются. Нужно то же самое, только чтобы делалось автоматически при трейсинге.
мож это подойдет http://exelab.ru/f/index.php?action=vthread&forum=3&topic=13247 никогда ею не пользовался но вроде чего там такое умеет
не надо меня квотить http://www.zynamics.com/binnavi.html вот так значит посмотрите почитайте подумайте, вдруг то что надо кроме того что оно там рисует и строит графики помоему оно и трейсить умеет и чего то там расставлять
О_О Спасибо, интересная штука, видимо, возможностей даже больше, чем в IDA. Во всяком случае то, что мне требуется, там вроде есть (демонстрируется на видео). Но слишком большая работа проведена в IDA, переносить всё это в BinNavi утомительно. Плагин был бы идеальным решением.