R0 CREW

Несколько вопросов по DBI (PIN)

  1. Как вызвать breakpoint из кода pintools чтоб на него сработала приатеченная Immunity Dbg ?

  2. Анализирую одну из функций шелл кода, которая имеет такой вид.

func_yyy (void *a, void *b){
 // ... 
  func_xxx(  a1, a2, a3, a4 , a5.);
///...
}

Я хочу с помощью pin tools “сделать хук” , func_yyy. И сдампить ее параметры.
Но прежде чем их сдампить мне нужно их переобразовать в строку, что делает func_xxx.

гугление подсказало что нельзя вызвать PIN_CallApplicationFunction из callback_func_yyy.

Надо использовать модель “wrap” и функцию RTN_ReplaceSignature() .
Но я не могу использовать RTN_ReplaceSignature() так как там первый параметр RTN , для шелл кода я не знаю как получить RTN (он же все секций, и pin tools не дает интерфейса чтоб получить обьект RTN для кода вне секций )

примерный код для pin tools

VOID callback_func_yyy(CONTEXT * ctx, ADDRINT threadID){
	PRINT("func_yyy()");

	ADDRINT regESP = PIN_GetContextReg(ctx, REG_ESP);
	ADDRINT a1 = regESP + 4;
	ADDRINT a2 = regESP + 8;
	ADDRINT *params = *(ADDRINT**)a2;
	CHAR *v5 = NULL, *v6 = NULL;

	PRINT("a1 = %p, a2 = %p, eip = %p", a1, a2, PIN_GetContextReg(ctx, REG_EIP) );
	PRINT(" &params = %p,  params[0] = %p", params, params[0]);
	PRINT("*(ADDRINT*)(a1 + 0x0C) = %p", *(ADDRINT*)(a1 + 0x0C) );
	
	
	ADDRINT ptr_to_my_func = 0xAAbbCCDD;

	void *result_eax = 0;

	//__asm int 3;
	PIN_CallApplicationFunction(ctx, (THREADID)threadID, 
								CALLINGSTD_CDECL, (AFUNPTR)(  ptr_to_my_func ),
								NULL, 
								PIN_PARG(void*), &result_eax,   
								PIN_PARG(ADDRINT), *(ADDRINT*)(a1 + 0x0C),
								PIN_PARG(ADDRINT), params,
								PIN_PARG(ADDRINT), 0x1F4,
								PIN_PARG(ADDRINT), &v5,
								PIN_PARG(ADDRINT), &v6,
								PIN_PARG_END()
		);

	PRINT("v5 = %p, v6 = %p", v5, v6);
	PRINT("string = %s", v6);

}

VOID Trace(TRACE trace, VOID *v)
{

	for (BBL bbl = TRACE_BblHead(trace); BBL_Valid(bbl); bbl = BBL_Next(bbl) )
    {
		ADDRINT bbl_address = BBL_Address(bbl);
		
		if (bbl_address == (ADDRINT)func_yyy_addr){
			BBL_InsertCall(bbl, IPOINT_BEFORE, (AFUNPTR) callback_func_yyy, IARG_CONTEXT, IARG_ADDRINT, PIN_ThreadId(), IARG_END);
		}

    }
}

Правильно ли я делаю вызов функции ? Примеры используют еще PROTO_Allocate но я не понимаю зачем, да и не ясно где указавать адресс функции которую надо вызвать.
В общем можно банально похукать нужные функции и обойтись без pin tools, но хочется именно с pin tools это сделать.
Это возможно? Как правильно это сделать?

Никто не знает или вопрос не понятен?

В общем код выше не правилен.
Но для начала работы нужен обьект RTN. Его к сожалению не удается создать.

Получается такой лог:

PIN может использоватся для отладки динамически генерируемого кода или шеллкодов ?