Скрипт для переименования Lua функций:
Завтра приду на работу проверю работоспособность.
Код:
typedef char* string;
#include <idc.idc>
static long getRegisterFunction()
{
string str = "";
auto dwAddress = 0;
dwAddress = FindBinary(dwAddress + 1, SEARCH_DOWN|SEARCH_NEXT, "\"Usage: SetCharCustomizeFrame\"");
//Message("dwAddress %x\n", dwAddress);
dwAddress = DfirstB(DfirstB(PrevFunction(DfirstB(dwAddress))))+0xE;
str = GetOpnd (dwAddress,0);
if(IsAddrStartOfFunction(LocByName(str)) == 0)
return -1;
RenameFunc(LocByName(str), "RegisterScriptFunction");
return LocByName(str);
}
static long main()
{
string prefix = "Script_";
long dwAddress, nameptr, maxentries;
long dwRegisterFunction;
string name,fname;
long i;
dwRegisterFunction = getRegisterFunction();
//Message("dwRegisterFunction = %x\n", dwRegisterFunction);
if(dwRegisterFunction == -1)
return;
dwAddress = 0;
while (dwAddress != BADADDR)
{
dwAddress = RnextB (dwRegisterFunction, dwAddress);
//Message("dwAddress %x\n", dwAddress);
nameptr = GetNamesPtrFromAdr(dwAddress);
//Message("nameptr %x\n", nameptr);
maxentries = Dword(dwAddress + 0xD);
for (i=0;i<maxentries/8;i++)
{
name = GetString(Dword(nameptr), -1, ASCSTR_C);
//Message("name %s\n", name);
if(strlen(name) < 4)
break;
if(IsAddrStartOfFunction(Dword(nameptr+4)) == 0)
break;
fname = prefix + name;
Message("%x : %s%s\n", Dword(nameptr+4), prefix, name);
if (RenameFunc(Dword(nameptr+4), fname) == 0)
break;
nameptr = nameptr + 8;
}
}
Message("Done.\n");
}
static long GetNamesPtrFromAdr(long adr)
{
long dwRet;
dwRet = adr - 0x10 + 0x4;
return (Dword(dwRet) - 4);
}
// 1 = Success, 0 = Failure
static long RenameFunc(long dwAddress, string sFunction)
{
long dwRet;
if(hasUserName(GetFlags(dwAddress)))
{
Message("%x already has custom name %s... skipping\n", dwAddress, Name(dwAddress));
return 1;
}
dwRet = MakeNameEx(dwAddress, sFunction, SN_NOCHECK);
if(dwRet == 0)
{
string sTemp;
long i;
for(i = 0; i < 32; i++)
{
sTemp = form("%s_%i", sFunction, i);
if((dwRet = MakeNameEx(dwAddress, sTemp, SN_NOCHECK)) != 0)
{
Message("Info: Renamed to %s instead of %s\n", sTemp, sFunction);
break;
}
}
}
return dwRet;
}
static long IsAddrStartOfFunction(long addr)
{
if(GetFunctionAttr(addr, FUNCATTR_START) == addr)
return 1;
return 0;
}