ArcheAge Functions & Debug Logs - IDC Scripts

09/15/2014 19:59 Omdi#1
Heyo,

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");
}
[IDA SCRIPT] arche_debug_logs.idc
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");
}