People familiar with RE & IDA might find the scripts below helpfull :-p
[IDA SCRIPT] arche_functions.idc
Code:
/*
arche_functions.idc
A tiny script which automatically renames some functions.
It uses a internal Arche Age log function to retrieve the function names.
Created by Omdihar for elitepvpers.com
http://www.elitepvpers.com/forum/members/2354584-omdihar.html
Thanks to Ende!
*/
#include <idc.idc>
static main()
{
auto logNetworkHandlers = 0x390115A0; //LocByName("LogNetworkHandlers");
auto xRef = 0;
auto pushParamAddr = 0;
auto handlerNameAddr = 0;
auto handlerName = "";
auto oldFuncName = "";
auto f;
f = fopen("arche_functions_logs.txt", "w");
Message("Starting!\n");
for(xRef = RfirstB(logNetworkHandlers); xRef != BADADDR; xRef = RnextB(logNetworkHandlers, xRef))
{
for(pushParamAddr = xRef; pushParamAddr != BADADDR; pushParamAddr = PrevAddr(pushParamAddr))
{
if(GetMnem(pushParamAddr) == "push")
{
if(GetOpType(pushParamAddr, 0) == o_imm)
handlerNameAddr = GetOperandValue(pushParamAddr, 0);
else
break;
handlerName = GetString(handlerNameAddr, -1, ASCSTR_C);
if(handlerName)
{
while(LocByName(handlerName) != BADADDR)
handlerName = handlerName + "_";
Message("[0x%08X][%s]\n", xRef, handlerName);
fprintf(f, "[0x%08X][%s]\n", xRef, handlerName);
oldFuncName = GetFunctionName(xRef);
MakeNameEx(LocByName(oldFuncName), handlerName, SN_CHECK | SN_NON_AUTO);
}
}
}
}
auto log2Func = 0x39004BB0;//LocByName("Log2");
for(xRef = RfirstB(log2Func); xRef != BADADDR; xRef = RnextB(log2Func, xRef))
{
auto pushFound = 0;
for(pushParamAddr = xRef; pushParamAddr != BADADDR; pushParamAddr = PrevAddr(pushParamAddr))
{
if(GetMnem(pushParamAddr) == "push")
{
if(pushFound == 1)
{
if(GetOpType(pushParamAddr, 0) == o_imm)
handlerNameAddr = GetOperandValue(pushParamAddr, 0);
else
break;
handlerName = GetString(handlerNameAddr, -1, ASCSTR_C);
if(handlerName)
{
while(LocByName(handlerName) != BADADDR)
handlerName = handlerName + "_";
Message("[0x%08X][%s]\n", xRef, handlerName);
fprintf(f, "[0x%08X][%s]\n", xRef, handlerName);
oldFuncName = GetFunctionName(xRef);
MakeNameEx(LocByName(oldFuncName), handlerName, SN_CHECK | SN_NON_AUTO);
}
}
pushFound = 1;
}
}
}
fclose(f);
Exec("arche_functions_logs.txt");
Message("Done!\n");
}
Code:
/*
arche_debug_logs.idc
A tiny script which automatically dumps all debug messages in ArcheAge
Created by Omdihar for elitepvpers.com
http://www.elitepvpers.com/forum/members/2354584-omdihar.html
Thanks to Ende!
*/
#include <idc.idc>
static main()
{
auto x2Log = LocByName("?X2Log@@YAXW4X2LogLevel@@PBDZZ");
auto xRef = 0;
auto pushParamAddr = 0;
auto logLevel = 0;
auto logMessageAddr = 0;
auto logMessage = "";
auto f;
f = fopen("archeage_debug_logs.txt", "w");
Message("Starting!\n");
Message("x2Log => [0x%08X]\n", x2Log);
for(xRef = DfirstB(x2Log); xRef != BADADDR; xRef = DnextB(x2Log, xRef))
{
auto gotLogLevel = 0;
auto gotLogMessage = 0;
for(pushParamAddr = xRef; pushParamAddr != BADADDR; pushParamAddr = PrevAddr(pushParamAddr))
{
if(GetMnem(pushParamAddr) == "push")
{
if(GetOpType(pushParamAddr, 0) == o_imm)
{
if(gotLogLevel == 0)
{
logLevel = GetOperandValue(pushParamAddr, 0);
gotLogLevel = 1;
}
else if(gotLogMessage == 0)
{
logMessageAddr = GetOperandValue(pushParamAddr, 0);
gotLogMessage = 1;
}
else
break;
}
else
{
break;
}
if(gotLogLevel == 1 && gotLogMessage == 1)
{
logMessage = GetString(logMessageAddr, -1, ASCSTR_C);
if(logMessage)
{
Message("[0x%08X][%d][%s]!\n", xRef, logLevel, logMessage);
fprintf(f, "[0x%08X][%d][%s]!\n", xRef, logLevel, logMessage);
}
}
}
}
}
fclose(f);
Exec("archeage_debug_logs.txt");
Message("Done!\n");
}






