Alguns Scripts IDA
Uma coisa que me aborrece terrivelmente é que depois de localizar rotinas em um determinado firmware, é preciso fazer todas as identificações em todos os outros fimrwares compatíveis, incluindo outras versões do mesmo firmware, por isso decidi aprender a fazer alguns scripts do IDA para automatizar as tarefas, assim toda vez que eu abrir um firmware posso rapidamente incluir nele uma parte do que já aprendi com outros.
Eu ainda não domino a criação de scripts, mas já dá para fazer alguns que funcionam:
MP3_TagDisplay
// *************************************************************
// Find MP3_TagDisplay Function usually on Bank 1
static findMP3_TagDisplay()
{
auto ea,ps,po ;
ea = FindBinary (0, SEARCH_DOWN,"7F 4A 7E ? 12 ? ? 90 ? ? EF F0 7F 4B 7E ? 12 ? ? 90 ? ? EF F0 7F 4C 7E ? 12 ? ? 90 ? ? EF F0 7F 4D 7E ? 12 ? ? 90 ? ? ");
if (ea != -1)
{
ps = PrevFunction (ea+0);
Message(" MP3_TagDisplay function at %x \n",ps );
MakeComm (ea, "As quatro chamadas a ARM_Getchar seguintes obtem o endereco inicial do bloco de tags (4 bytes) na shared memory");
MakeCode(ps);
MakeFunction(ps,BADADDR);
Wait ();
MakeName(ps,"MP3_TagDisplay");
MakeRptCmt (ps,"Rotina de exibicao das TAGS ID3");
po = FindFuncEnd (ps);
if (po != -1)
{
ea = FindBinary (ea, SEARCH_DOWN,"7B ? 7A ? 7D ? 7C ? 7F ? 12");
if (ea != -1) // string localizada?
{
if (ea < po) // a string está dentro da função?
{
Message(" Clearrect em Mp3_tagDisplay at %x \n",ps );
MakeComm (ea, "R2R3 = altura");
MakeComm (ea+4, "R4R5 = Largura");
MakeComm (ea+10, "Chama ClearRect para limpar o retangulo");
} //if (ea < po)
} // if (ea != -1)
} //if (po != -1)
po = FindFuncEnd (ps);
if (po != -1)
{
ea = FindBinary (ea, SEARCH_DOWN,"94 0E 40 03 74 0E");
if (ea != -1) // string localizada?
{
if (ea < po) // a string está dentro da função?
{
Message("Encontrada limitação de exibição para 14 caracteres em Mp3_tagDisplay at %x \n",ps );
MakeComm (ea, "Se o numero de caracteres for 14 ou menos, continua");
MakeComm (ea+4, "Se for maior que 14, limitar a 14");
} //if (ea < po)
} // if (ea != -1)
} //if (po != -1)
po = FindFuncEnd (ps);
if (po != -1)
{
ea = FindBinary (ea, SEARCH_DOWN,"74 ? F0 EF 75 F0 ? A4 AE F0 24 ?");
if (ea != -1) // string localizada?
{
if (ea < po) // a string está dentro da função?
{
Message("Encontrada a definição de coordenadas de exibicao das tags em Mp3_tagDisplay at %x \n",ps );
MakeComm (ea+2, "offset horizontal. Quanto menor, mais à esquerda a linha começa.");
MakeComm (ea+3, "R7 contem o numero da TAG (linha) sendo exibida? ");
MakeComm (ea+4, "Altura presumida de cada linha ");
MakeComm (ea+8, "R6 contem agora a coordenada vertical de impressao da linha? ");
MakeComm (ea+10, "Offset vertical. Quanto menor, mais proximas do topo da janela");
} //if (ea < po)
} // if (ea != -1)
} //if (po != -1)
po = FindFuncEnd (ps);
if (po != -1)
{
ea = FindBinary (ea, SEARCH_DOWN,"D3 94 10 ?");
if (ea != -1) // string localizada?
{
if (ea < po) // a string está dentro da função?
{
Message("Encontrado o limitador de caracteres em Mp3_tagDisplay at %x \n",ps );
MakeComm (ea+1, "Numero máximo de caracteres a exibir por TAG");
} //if (ea < po)
} // if (ea != -1)
} //if (po != -1)
}
}
CheckVersionPass
// *************************************************************
// Find CheckVersionPass Function usually on Bank 2
static findCheckVersionPass()
{
auto ea,ps ;
ea = FindBinary (0, SEARCH_DOWN,"90 ? ? E0 64 ? 70 ? 90 ? ? E0 FF 54 0F FE 64 0F 60 ? EE C3 94 ? 50 ? EE 90 ? ? 93 FE 90 FB 00");
if (ea != -1)
{
ps = PrevFunction (ea+01);
Message(" CheckVersionPass function at %x \n",ps );
MakeComm (ea+05, "Este e´ o menu esperado"+ltoa(Byte(ea+06),4));
MakeCode(ps);
MakeFunction(ps,BADADDR);
Wait ();
MakeName(ps,"CheckVersionPass");
MakeRptCmt (ps,"Rotina que verifica a senha para a tela de versao");
}
}
CheckRegionPass
// *************************************************************
// Find CheckRegionPass Function usually on Bank 2
static findCheckRegionPass()
{
auto ea,ps ;
ea = FindBinary (0, SEARCH_DOWN,"90 ? ? E0 FF 64 ? 70 ? 90 ? ? E0 FE 54 0F FD 64 0F 60 ? ED C3 94 ? 50 ? ED 90 ? ? 93 FD 90 FB 00");
if (ea != -1)
{
ps = PrevFunction (ea+01);
Message(" CheckRegionPass function at %x \n",ps );
MakeComm (ea+05, "Este e´ o menu esperado");
MakeCode(ps);
MakeFunction(ps,BADADDR);
Wait ();
MakeName(ps,"CheckRegionPass");
MakeRptCmt (ps,"Rotina que verifica a senha para a tela de regiao");
}
}
vPlayerShowLogo
// *************************************************************
// Find vPlayerShowLogo Function
static findvPlayerShowLogo()
{
auto ea,ps ;
ea = FindBinary (0, SEARCH_DOWN,"90 ? ? EF F0 A3 EC F0 A3 ED F0 90 ? ? E0 FF 64 04 70 03 02 ? ? EF");
if (ea != -1)
{
ps = PrevFunction (ea+01);
Message(" vPlayerShowLogo function at %x \n",ps );
MakeCode(ps);
MakeFunction(ps,BADADDR);
Wait ();
MakeName(ps,"vPlayerShowLogo");
MakeRptCmt (ps,"Rotina que exibe as imagens de background ");
}
}
Estes scripts estão todos relacionados a textos já publicados aqui, por isso dentro de alguns dias eles serão movidos para os respectivos posts.