Exemplo n.º 1
0
void Resolver_Sak1()
{
	// E8********	// call	INITNP
	// 85C0			// test	eax, eax
	// 75**			// jne	rel8
	// 5F			// pop	edi
	// 5E			// pos	esi
	// B801000000	// mov	eax, 1
	// 5B			// pop	ebx
	// 8B5E			// mov	esp, ebp
	// 5D			// pop	ebp
	// C3			// ret
	// 68********	// push	"resNameTable.txt"

	ULONG Pos = 0;

	if (FindAddStack("resNameTable.txt", &Pos) == false)
		return;

	ULONG InitNP = 0;

	if (CompareBinary<UCHAR>(Pos-21, 0xE8))				// call	rel32
	{
		InitNP = Pos - 21;
		g_Intrnl.Addr[IA_INITNP] = InitNP;
	}
	if (CompareBinary<UCHAR>(Pos-23, 0xE8))				// call	rel32
	{
		InitNP = Pos - 23;
		g_Intrnl.Addr[IA_INITNP] = InitNP;
	}

	DbgPrintW(DBGINF, _CRT_WIDE("INF ResolverSak1 InitNP=%08X\n"), InitNP);
}
Exemplo n.º 2
0
void ROParser::OwnOption(PUCHAR Buffer)
{
	USHORT Param1 = *reinterpret_cast<USHORT*>(Buffer+6);
	USHORT Param2 = *reinterpret_cast<USHORT*>(Buffer+8);
	USHORT Param3 = *reinterpret_cast<USHORT*>(Buffer+10);
	DbgPrintW(DBGINF, _CRT_WIDE("INF ZC_OPTION TGT=OWN P1=%04X P2=%04X P3=%04X\n"), Param1, Param2, Param3);

	switch (Param1)
	{
		case OPT_STUN:
			NoticeAbnormal("CONDITION_TO_STUN");
			break;
		case OPT_SLEEP:
			NoticeAbnormal("CONDITION_TO_CURSE_SLEEP");
			break;
		default:
			break;
	}

	if (Param2 & OPT_POISON)
		NoticeAbnormal("CONDITION_TO_POISON");
	if (Param2 & OPT_BLIND)
	{
		*reinterpret_cast<USHORT*>(Buffer+8) ^= OPT_BLIND;
		NoticeAbnormal("CONDITION_TO_BLIND");
	}
}
Exemplo n.º 3
0
int ROParser::Send(PUCHAR Buffer, int Length)
{
	DbgPrintW(DBGINFL2, _CRT_WIDE("INF ROParser::Send Length=%d\n"), Length);
	DbgHexPrintW(Buffer, Length);

	return 0;
}
Exemplo n.º 4
0
/*********************************************************************
 *              rand_s (MSVCRT.@)
 */
int CDECL rand_s(unsigned int *pval)
{
    BOOLEAN (WINAPI *pSystemFunction036)(PVOID, ULONG); // RtlGenRandom
    HINSTANCE hadvapi32 = LoadLibraryA("advapi32.dll");
    pSystemFunction036 = (void*)GetProcAddress(hadvapi32, "SystemFunction036");
#if 1
    if (!pval || (pSystemFunction036 && !pSystemFunction036(pval, sizeof(*pval))))
    {
        _invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
        *_errno() = EINVAL;
        return EINVAL;
    }
#endif
    if(hadvapi32) FreeLibrary(hadvapi32);
    return 0;
}
Exemplo n.º 5
0
void ROParser::ClSkillTmp(PUCHAR Buffer)
{
	USHORT SkillID = *reinterpret_cast<USHORT*>(Buffer+2);
	USHORT SkillLv = *reinterpret_cast<USHORT*>(Buffer+8);
	DbgPrintW(DBGINF, _CRT_WIDE("INF ZC_SKILL_TMP ID=%04X LV=%04X\n"), SkillID, SkillLv);

	if (SkillID != ITEM_ENCHANTARMS)
		return;

	switch (SkillLv)
	{
		case 0x0002:
			ItemEnchantArms(CI_ELEMENT_WATER);
			break;
		case 0x0003:
			ItemEnchantArms(CI_ELEMENT_GROUND);
			break;
		case 0x0004:
			ItemEnchantArms(CI_ELEMENT_FIRE);
			break;
		case 0x0005:
			ItemEnchantArms(CI_ELEMENT_WIND);
			break;
		case 0x0008:
			ItemEnchantArms(CI_ELEMENT_SHADOW);
			break;
	}
}
Exemplo n.º 6
0
void dll_process_attach(HINSTANCE hModule)
{
	if (::GetFileAttributes(_CRT_WIDE("randgriz.dll")) != INVALID_FILE_ATTRIBUTES)
	{
		HMODULE module = ::LoadLibraryW(_CRT_WIDE("randgriz.dll"));
#ifdef _DEBUG
		if (module)
			::OutputDebugStringW(_CRT_WIDE("LOAD_SUCCESS randgriz.dll\n"));
#endif
	}
	else
	{
#ifdef _DEBUG
		::OutputDebugStringW(_CRT_WIDE("FILE_NOT_FOUND randgriz.dll\n"));
#endif
	}
}
Exemplo n.º 7
0
void Resolver_Sak2()
{
	// 83C0F6			// add	eax, -Ah
	// 3D********		// cmp	eax, imm32
	// 0F87********		// ja	rel32
	// 33C9				// xor	ecx, ecx
	// 8A88********		// mov	cl, [eax+IA_EFFTBL1]
	// FF248D********	// jmp	[IA_EFFTBL2+ecx*4]
	// A1********		// mov	eax, [IA_MINEFFECT]

	ULONG Pos = 0;
	UCHAR Code[] = {
		0x83, 0xC0, 0xF6,	// add	eax, -Ah
		0x3D,				// cmp	eax, imm32
	};

	if (FindBin(Code, sizeof(Code), &Pos) == false)
		return;

	ULONG EffectTable = 0;
	ULONG JumpTable = 0;
	ULONG MinEffect = 0;

//	if (CompareBinary<USHORT>(Pos+16, 0x888A))
	if (CompareBinary<UCHAR>(Pos+16, 0x8A))				// mov	r8, r/m8
	{
		EffectTable = *reinterpret_cast<ULONG*>(Pos+18);
		g_Intrnl.Addr[IA_EFFTBL1] = EffectTable;
	}
//	if (CompareBinary<USHORT>(Pos+22, 0x24FF))			// jmp	r/m32
	if (CompareBinary<UCHAR>(Pos+22, 0xFF))				// jmp	r/m32
	{
		JumpTable = *reinterpret_cast<ULONG*>(Pos+25);
		g_Intrnl.Addr[IA_EFFTBL2] = JumpTable;
	}
	if (CompareBinary<UCHAR>(Pos+29, 0xA1))				// mov	eax, moffs32
	{
		MinEffect = *reinterpret_cast<ULONG*>(Pos+30);
		g_Intrnl.Addr[IA_MINEFFECT] = MinEffect;
	}

	DbgPrintW(DBGINF, _CRT_WIDE("INF ResolverSak2 EffectTable=%08X\n"), EffectTable);
	DbgPrintW(DBGINF, _CRT_WIDE("INF ResolverSak2 JumpTable=%08X\n"), JumpTable);
	DbgPrintW(DBGINF, _CRT_WIDE("INF ResolverSak2 MinEffect=%08X\n"), MinEffect);
}
Exemplo n.º 8
0
void ROParser::ClAuthAck(PUCHAR Buffer)
{
	SuspendWorker();

	ResetSessionTable();
	g_Intrnl.Session.AID = *reinterpret_cast<ULONG*>(Buffer+8);

	DbgPrintW(DBGINF, _CRT_WIDE("INF AC_AUTH_ACK AID=%08X\n"), g_Intrnl.Session.AID);
}
Exemplo n.º 9
0
void ROParser::PushCondition(USHORT Type, UCHAR Flag)
{
//	SetConditionIcon(Type, Flag);

	UCHAR Buffer[9];
	*reinterpret_cast<USHORT*>(Buffer) = PACKET_ZC_CONDITION;
	*reinterpret_cast<USHORT*>(Buffer+2) = Type;
	*reinterpret_cast<ULONG*>(Buffer+4) = g_Intrnl.Session.AID;
	*reinterpret_cast<UCHAR*>(Buffer+8) = Flag;

	DbgPrintW(DBGINF, _CRT_WIDE("CHK PushCondition Vars OP=%04X Type=%04X AID=%08X FLAG=%02d\n"), PACKET_ZC_CONDITION, Type, g_Intrnl.Session.AID, Flag);
	ExecuteParser(PACKET_ZC_CONDITION, Buffer);
}
Exemplo n.º 10
0
void ROParser::OwnCondition(PUCHAR Buffer)
{
	USHORT Type = *reinterpret_cast<USHORT*>(Buffer+2);
	UCHAR Flag = *reinterpret_cast<UCHAR*>(Buffer+8);
	DbgPrintW(DBGINF, _CRT_WIDE("INF ZC_CONDITION TGT=OWN TYPE=%04X FLAG=%02X\n"), Type, Flag);

	switch (Type)
	{
		case CI_BREAKWEAPON:
			if (g_Intrnl.Session.EnArms != CI_NONE)
				DeleteItemEnchantArms();
			break;

		case CI_HALLUCINATION:
			if (Flag)
			{
				*reinterpret_cast<UCHAR*>(Buffer+8) &= 0;
				NoticeAbnormal("CONDITION_TO_HALLUCINATION");
			}
			break;

		case CI_ELEMENT_FIRE:
		case CI_ELEMENT_WATER:
		case CI_ELEMENT_WIND:
		case CI_ELEMENT_GROUND:
		case CI_ELEMENT_SHADOW:
		case CI_ELEMENT_GHOST:
			EnchantArms(Type, Flag, false);
			break;

		case CI_EXPLOSIONSPIRITS:
			NoticeState("爆裂波動", Flag);
			break;
		case CI_BERSERK:
			NoticeState("バーサーク", Flag);
			break;
		case CI_ASSUMPTIO:
			NoticeState("アスムプティオ", Flag);
			break;
		case CI_MIRACLE:
			NoticeState("太陽と月と星の奇跡", Flag);
			break;
		case CI_CLOSECONFINE_OWN:
		case CI_CLOSECONFINE_TGT:
			NoticeState("クローズコンファイン", Flag);
			break;

		default:
			break;
	}
}
Exemplo n.º 11
0
void InitDebug(int DebugLevel)
{
	if (g_DebugOut == NULL)
	{
		g_DebugOut = new FileOut(_CRT_WIDE("debug.txt"));

		if (g_DebugOut->Size() == 0)
		{
			unsigned char Bom[] = { 0xFF, 0xFE };
			g_DebugOut->Write(Bom, sizeof(Bom));
		}
	}

	g_DebugLevel = DebugLevel;
}
Exemplo n.º 12
0
void ROParser::ClSkillAck(PUCHAR Buffer)
{
	if (g_Intrnl.Session.NoDivDmg == false)
		return;
	if (IsOwnAID(*reinterpret_cast<ULONG*>(Buffer+8)) == false)
		return;

	DbgPrintW(DBGINF, _CRT_WIDE("INF ZC_SKILL_ACK5 ID=%04X LV=%04X Type=%02X Val=%d/%d\n"), *reinterpret_cast<USHORT*>(Buffer+2),
																							*reinterpret_cast<USHORT*>(Buffer+28),
																							*reinterpret_cast<ULONG*>(Buffer+24),
																							*reinterpret_cast<USHORT*>(Buffer+30),
																							*reinterpret_cast<UCHAR*>(Buffer+32));

	if (*reinterpret_cast<UCHAR*>(Buffer+32) == SKDMG_DIVIDE)
	{
		*reinterpret_cast<USHORT*>(Buffer+30) = 1;	// 単発は1固定
		*reinterpret_cast<UCHAR*>(Buffer+32) = SKDMG_ONE;
	}
}
Exemplo n.º 13
0
errno_t
localtime_s(struct tm* _tm, const time_t *ptime)
{

    /* Validate parameters */
    if (!_tm || !ptime)
    {
#if 0
        _invalid_parameter(NULL,
                           0,//__FUNCTION__, 
                           _CRT_WIDE(__FILE__), 
                           __LINE__, 
                           0);
#endif
        return EINVAL;
    }


    return 0;
}
Exemplo n.º 14
0
void Resolver_Sak4()
{
	// A1********		// mov	eax, [IA_LANGTYPE]
	// 85C0				// test	eax, eax
	// 0F84B7000000		// je	rel32
	// 83F803			// cmp	eax, 3
	// 0F84AE000000		// je	rel32
	// 83F805			// cmp	eax, 5
	// 0F84A5000000		// je	rel32

	ULONG Pos = 0;
	UCHAR Code[] = {
		0x83, 0xF8, 0x03,
		0x0F, 0x84, 0xAE, 0x00, 0x00, 0x00,
	};

	if (FindBin(Code, sizeof(Code), &Pos) == false)
		return;

	ULONG ChkName = 0;

	if (CompareBinary<USHORT>(Pos+3, 0x840F))				// je	rel32
	{
		ULONG Relative = *reinterpret_cast<ULONG*>(Pos+5);
		Pos = (Pos+9) + Relative;

		// B9********		// mov	ecx, imm32
		// E8********		// call	rel32
		// A1********		// mov	eax, [IA_LANGTYPE]
		// 85C0				// test	eax, eax
		// 0F85********		// jne	rel32

		if (CompareBinary<UCHAR>(Pos+15, 0x85))			// test	r/m32, r32
		{
			ChkName = Pos + 15;
			g_Intrnl.Addr[IA_CHKNAME] = ChkName;
		}
	}

	DbgPrintW(DBGINF, _CRT_WIDE("INF ResolverSak4 ChkName=%08X\n"), ChkName);
}
Exemplo n.º 15
0
void Resolver_Sak3()
{
	// A1********	// mov	eax, [IA_MINEFFECT]
	// 85C0			// test	eax, eax
	// 740A			// jz	imm8
	// 68********	// push	"magnificat_min.str"
	// E9********	// jmp	rel32

	ULONG Pos = 0;

	if (FindAddStack("magnificat_min.str", &Pos) == false)
		return;

	ULONG MinEffect = 0;

	if (CompareBinary<UCHAR>(Pos-9, 0xA1))				// mov	eax, moffs32
	{
		MinEffect = *reinterpret_cast<ULONG*>(Pos-8);
		g_Intrnl.Addr[IA_MINEFFECT] = MinEffect;
	}

	DbgPrintW(DBGINF, _CRT_WIDE("INF ResolverSak3 MinEffect=%08X\n"), MinEffect);
}
Exemplo n.º 16
0
/******************************************************************************
 * \name _tasctime_s
 * \brief Converts a local time into a string and returns a pointer to it.
 * \param buffer Buffer that receives the string (26 characters).
 * \param numberOfElements Size of the buffer in characters.
 * \param time Pointer to the UTC time.
 */
errno_t 
_tasctime_s( 
    _TCHAR* buffer,
    size_t numberOfElements,
    const struct tm *ptm)
{
    /* Validate parameters */
    if (!buffer || numberOfElements < 26 || !ptm ||
        (unsigned int)ptm->tm_sec > 59 ||
        (unsigned int)ptm->tm_min > 59 ||
        (unsigned int)ptm->tm_hour > 23 ||
        (unsigned int)ptm->tm_mday > 31 ||
        (unsigned int)ptm->tm_mon > 11 ||
        (unsigned int)ptm->tm_year > 2038 ||
        (unsigned int)ptm->tm_wday > 6 ||
        (unsigned int)ptm->tm_yday > 365)
    {
#if 0
        _invalid_parameter(NULL,
#ifdef UNICODE
                            L"_wasctime",
#else
                            L"asctime",
#endif
                           _CRT_WIDE(__FILE__),
                           __LINE__,
                           0);
#endif
        return EINVAL;
    }

    /* Fill the buffer */
    FillBuf((timebuf_t*)buffer, ptm);

    return 0;
}
Exemplo n.º 17
0
DWORD WINAPI OnGetEnvironmentVariableW(LPCWSTR lpName, LPWSTR lpBuffer, DWORD nSize)
{
	//typedef DWORD (WINAPI* OnGetEnvironmentVariableW_t)(LPCWSTR lpName, LPWSTR lpBuffer, DWORD nSize);
	ORIGINAL_KRNL(GetEnvironmentVariableW);
	DWORD lRc = 0;

	if (lpName)
	{
		if ((lstrcmpiW(lpName, ENV_CONEMUANSI_VAR_W) == 0)
			|| (lstrcmpiW(lpName, ENV_CONEMUHWND_VAR_W) == 0)
			|| (lstrcmpiW(lpName, ENV_CONEMUDIR_VAR_W) == 0)
			|| (lstrcmpiW(lpName, ENV_CONEMUBASEDIR_VAR_W) == 0)
			)
		{
			CheckVariables();
		}
		else if ((lstrcmpiW(lpName, ENV_CONEMUANSI_VAR_W) == 0)
				|| (lstrcmpiW(lpName, ENV_ANSICON_DEF_VAR_W) == 0))
		{
			CheckAnsiConVar(lpName);
		}
		else if (lstrcmpiW(lpName, ENV_ANSICON_VER_VAR_W) == 0)
		{
			if (lpBuffer && ((INT_PTR)nSize > lstrlenA(ENV_ANSICON_VER_VALUE)))
			{
				lstrcpynW(lpBuffer, _CRT_WIDE(ENV_ANSICON_VER_VALUE), nSize);
				lRc = lstrlenA(ENV_ANSICON_VER_VALUE);
			}
			goto wrap;
		}
	}

	lRc = F(GetEnvironmentVariableW)(lpName, lpBuffer, nSize);
wrap:
	return lRc;
}
Exemplo n.º 18
0
int ROParser::Recv(PUCHAR Buffer, int Length)
{
	DbgPrintW(DBGINFL2, _CRT_WIDE("INF ROParser::Recv Length=%d\n"), Length);
	DbgHexPrintW(Buffer, Length);


	switch (*reinterpret_cast<USHORT*>(Buffer))
	{
		case PACKET_AC_AUTH_ACK:
			ClAuthAck(Buffer);
			break;

		case PACKET_CC_SELECT_ACK:
			ConnFirstProc(Buffer);
			break;

		case PACKET_CC_ENTER_ACK:
			ClCCEnterAck(Buffer);
			break;

		case PACKET_ZC_ENTER_ACK:
			ClZCEnterAck(Buffer);
			break;

		case PACKET_ZC_ERASE_ACTOR:
			ClEraseActor(Buffer);
			break;

		case PACKET_ZC_CHAT:
		case PACKET_ZC_CHAT_THIS:
		case PACKET_ZC_WHISPER:
		case PACKET_ZC_WHISPER_ACK:
		case PACKET_ZC_BROADCAST:
		case PACKET_ZC_PARTYCHAT:
		case PACKET_ZC_MVP:
			m_Chat->Push(Buffer, Length);
			break;

		case PACKET_ZC_OPTION1:
			ClOption(Buffer);
			break;

		case PACKET_ZC_SKILL_TMP:
			ClSkillTmp(Buffer);
			break;

		case PACKET_ZC_CONDITION:
			ClCondition(Buffer);
			break;

		case PACKET_ZC_GUILDCHAT:
			m_Chat->Push(Buffer, Length);
			break;

		case PACKET_ZC_SKILL_ACK5:
			ClSkillAck(Buffer);
			break;

		case PACKET_ZC_BROADCAST2:
			m_Chat->Push(Buffer, Length);
			break;

		case PACKET_ZC_OPTION2:
			ClOption(Buffer);
			break;

		case PACKET_AC_SEED_ACK:
			ConnFirstProc(Buffer);
			break;

		case PACKET_NC_NPROTECT_0259:
			ConnFirstProc(Buffer);
			break;

		default:
			break;
	}


	return Length;
}
Exemplo n.º 19
0
// Warning, напрямую НЕ вызывать. Пользоваться "общей" PostMacro
void CPluginW2800::PostMacroApi(const wchar_t* asMacro, INPUT_RECORD* apRec, bool abShowParseErrors)
{
	if (!InfoW2800 || !InfoW2800->AdvControl)
		return;

	MacroSendMacroText mcr = {sizeof(MacroSendMacroText)};
	//mcr.Flags = 0; // По умолчанию - вывод на экран разрешен
	bool bEnableOutput = true;

	while ((asMacro[0] == L'@' || asMacro[0] == L'^') && asMacro[1] && asMacro[1] != L' ')
	{
		switch (*asMacro)
		{
		case L'@':
			bEnableOutput = false;
			break;
		case L'^':
			mcr.Flags |= KMFLAGS_NOSENDKEYSTOPLUGINS;
			break;
		}
		asMacro++;
	}

	if (bEnableOutput)
		mcr.Flags |= KMFLAGS_ENABLEOUTPUT;

	// This macro was not adopted to Lua?
	_ASSERTE(*asMacro && *asMacro != L'$');

	// Вообще говоря, если тут попадается макрос в старом формате - то мы уже ничего не сделаем...
	// Начиная с Far 3 build 2851 - все макросы переведены на Lua

	mcr.SequenceText = asMacro;
	if (apRec)
		mcr.AKey = *apRec;

	mcr.Flags |= KMFLAGS_SILENTCHECK;

	if (!InfoW2800->MacroControl(&guid_ConEmu, MCTL_SENDSTRING, MSSC_CHECK, &mcr))
	{
		if (abShowParseErrors)
		{
			wchar_t* pszErrText = NULL;
			size_t iRcSize = InfoW2800->MacroControl(&guid_ConEmu, MCTL_GETLASTERROR, 0, NULL);
			MacroParseResult* Result = iRcSize ? (MacroParseResult*)calloc(iRcSize,1) : NULL;
			if (Result)
			{
				Result->StructSize = sizeof(*Result);
				_ASSERTE(FALSE && "Check MCTL_GETLASTERROR");
				InfoW2800->MacroControl(&guid_ConEmu, MCTL_GETLASTERROR, iRcSize, Result);

				size_t cchMax = (Result->ErrSrc ? lstrlen(Result->ErrSrc) : 0) + lstrlen(asMacro) + 255;
				pszErrText = (wchar_t*)malloc(cchMax*sizeof(wchar_t));
				_wsprintf(pszErrText, SKIPLEN(cchMax)
					L"Error in Macro. Far %u.%u build %u r%u\n"
					L"ConEmu plugin %02u%02u%02u%s[%u] {2800}\n"
					L"Code: %u, Line: %u, Col: %u%s%s\n"
					L"----------------------------------\n"
					L"%s",
					gFarVersion.dwVerMajor, gFarVersion.dwVerMinor, gFarVersion.dwBuild, gFarVersion.Bis ? 1 : 0,
					MVV_1, MVV_2, MVV_3, _CRT_WIDE(MVV_4a), WIN3264TEST(32,64),
					Result->ErrCode, (UINT)(int)Result->ErrPos.Y+1, (UINT)(int)Result->ErrPos.X+1,
					Result->ErrSrc ? L", Hint: " : L"", Result->ErrSrc ? Result->ErrSrc : L"",
					asMacro);

				SafeFree(Result);
			}
			else
			{
				size_t cchMax = lstrlen(asMacro) + 255;
				pszErrText = (wchar_t*)malloc(cchMax*sizeof(wchar_t));
				_wsprintf(pszErrText, SKIPLEN(cchMax)
					L"Error in Macro. Far %u.%u build %u r%u\n"
					L"ConEmu plugin %02u%02u%02u%s[%u] {2800}\n"
					L"----------------------------------\n"
					L"%s",
					gFarVersion.dwVerMajor, gFarVersion.dwVerMinor, gFarVersion.dwBuild, gFarVersion.Bis ? 1 : 0,
					MVV_1, MVV_2, MVV_3, _CRT_WIDE(MVV_4a), WIN3264TEST(32,64),
					asMacro);
			}

			if (pszErrText)
			{
				DWORD nTID;
				HANDLE h = apiCreateThread(BackgroundMacroError, pszErrText, &nTID, "BackgroundMacroError");
				SafeCloseHandle(h);
			}
		}
	}
	else
	{
		//gFarVersion.dwBuild
		InfoW2800->MacroControl(&guid_ConEmu, MCTL_SENDSTRING, 0, &mcr);
	}
}
Exemplo n.º 20
0
// Warning, напрямую НЕ вызывать. Пользоваться "общей" PostMacro
void CPluginW1900::PostMacroApi(const wchar_t* asMacro, INPUT_RECORD* apRec, bool abShowParseErrors)
{
	if (!InfoW1900 || !InfoW1900->AdvControl)
		return;

	MacroSendMacroText mcr = {sizeof(MacroSendMacroText)};
	//mcr.Flags = 0; // По умолчанию - вывод на экран разрешен

	while ((asMacro[0] == L'@' || asMacro[0] == L'^') && asMacro[1] && asMacro[1] != L' ')
	{
		switch (*asMacro)
		{
		case L'@':
			mcr.Flags |= KMFLAGS_DISABLEOUTPUT;
			break;
		case L'^':
			mcr.Flags |= KMFLAGS_NOSENDKEYSTOPLUGINS;
			break;
		}
		asMacro++;
	}

	wchar_t* pszMacroCopy = NULL;

	//Far3 build 2576: удален $Text
	//т.к. макросы у нас фаро-независимые - нужны танцы с бубном
	pszMacroCopy = lstrdup(asMacro);
	CharUpperBuff(pszMacroCopy, lstrlen(pszMacroCopy));
	if (wcsstr(pszMacroCopy, L"$TEXT") && !InfoW1900->MacroControl(&guid_ConEmu, MCTL_SENDSTRING, MSSC_CHECK, &mcr))
	{
		SafeFree(pszMacroCopy);
		pszMacroCopy = (wchar_t*)calloc(lstrlen(asMacro)+1,sizeof(wchar_t)*2);
		wchar_t* psz = pszMacroCopy;
		while (*asMacro)
		{
			if (asMacro[0] == L'$'
				&& (asMacro[1] == L'T' || asMacro[1] == L't')
				&& (asMacro[2] == L'E' || asMacro[2] == L'e')
				&& (asMacro[3] == L'X' || asMacro[3] == L'x')
				&& (asMacro[4] == L'T' || asMacro[4] == L't'))
			{
				lstrcpy(psz, L"print("); psz += 6;

				// Пропустить spasing-symbols
				asMacro += 5;
				while (*asMacro == L' ' || *asMacro == L'\t' || *asMacro == L'\r' || *asMacro == L'\n')
					asMacro++;
				// Копировать строку или переменную
				if (*asMacro == L'@' && *(asMacro+1) == L'"')
				{
					*(psz++) = *(asMacro++); *(psz++) = *(asMacro++);
					while (*asMacro)
					{
						*(psz++) = *(asMacro++);
						if (*(asMacro-1) == L'"')
						{
							if (*asMacro != L'"')
								break;
							*(psz++) = *(asMacro++);
						}
					}
				}
				else if (*asMacro == L'"')
				{
					*(psz++) = *(asMacro++);
					while (*asMacro)
					{
						*(psz++) = *(asMacro++);
						if (*(asMacro-1) == L'\\' && *asMacro == L'"')
						{
							*(psz++) = *(asMacro++);
						}
						else if (*(asMacro-1) == L'"')
						{
							break;
						}
					}
				}
				else if (*asMacro == L'%')
				{
					*(psz++) = *(asMacro++);
					while (*asMacro)
					{
						if (wcschr(L" \t\r\n", *asMacro))
							break;
						*(psz++) = *(asMacro++);
					}
				}
				else
				{
					SafeFree(pszMacroCopy);
					break; // ошибка
				}
				// закрыть скобку
				*(psz++) = L')';
			}
			else
			{
				*(psz++) = *(asMacro++);
			}
		}

		// Если успешно пропатчили макрос
		if (pszMacroCopy)
			asMacro = pszMacroCopy;
	}

	mcr.SequenceText = asMacro;
	if (apRec)
		mcr.AKey = *apRec;

	mcr.Flags |= KMFLAGS_SILENTCHECK;

	if (!InfoW1900->MacroControl(&guid_ConEmu, MCTL_SENDSTRING, MSSC_CHECK, &mcr))
	{
		if (abShowParseErrors)
		{
			wchar_t* pszErrText = NULL;
			size_t iRcSize = InfoW1900->MacroControl(&guid_ConEmu, MCTL_GETLASTERROR, 0, NULL);
			MacroParseResult* Result = iRcSize ? (MacroParseResult*)calloc(iRcSize,1) : NULL;
			if (Result)
			{
				Result->StructSize = sizeof(*Result);
				_ASSERTE(FALSE && "Check MCTL_GETLASTERROR");
				InfoW1900->MacroControl(&guid_ConEmu, MCTL_GETLASTERROR, iRcSize, Result);

				size_t cchMax = (Result->ErrSrc ? lstrlen(Result->ErrSrc) : 0) + lstrlen(asMacro) + 255;
				pszErrText = (wchar_t*)malloc(cchMax*sizeof(wchar_t));
				_wsprintf(pszErrText, SKIPLEN(cchMax)
					L"Error in Macro. Far %u.%u build %u r%u\n"
					L"ConEmu plugin %02u%02u%02u%s[%u] {1900}\n"
					L"Code: %u, Line: %u, Col: %u%s%s\n"
					L"----------------------------------\n"
					L"%s",
					gFarVersion.dwVerMajor, gFarVersion.dwVerMinor, gFarVersion.dwBuild, gFarVersion.Bis ? 1 : 0,
					MVV_1, MVV_2, MVV_3, _CRT_WIDE(MVV_4a), WIN3264TEST(32,64),
					Result->ErrCode, (UINT)(int)Result->ErrPos.Y+1, (UINT)(int)Result->ErrPos.X+1,
					Result->ErrSrc ? L", Hint: " : L"", Result->ErrSrc ? Result->ErrSrc : L"",
					asMacro);

				SafeFree(Result);
			}
			else
			{
				size_t cchMax = lstrlen(asMacro) + 255;
				pszErrText = (wchar_t*)malloc(cchMax*sizeof(wchar_t));
				_wsprintf(pszErrText, SKIPLEN(cchMax)
					L"Error in Macro. Far %u.%u build %u r%u\n"
					L"ConEmu plugin %02u%02u%02u%s[%u] {1900}\n"
					L"----------------------------------\n"
					L"%s",
					gFarVersion.dwVerMajor, gFarVersion.dwVerMinor, gFarVersion.dwBuild, gFarVersion.Bis ? 1 : 0,
					MVV_1, MVV_2, MVV_3, _CRT_WIDE(MVV_4a), WIN3264TEST(32,64),
					asMacro);
			}

			if (pszErrText)
			{
				DWORD nTID;
				HANDLE h = apiCreateThread(BackgroundMacroError, pszErrText, &nTID, "BackgroundMacroError");
				SafeCloseHandle(h);
			}
		}
	}
	else
	{
		//gFarVersion.dwBuild
		InfoW1900->MacroControl(&guid_ConEmu, MCTL_SENDSTRING, 0, &mcr);
	}

	SafeFree(pszMacroCopy);
}
Exemplo n.º 21
0
// prefast (6262): This func uses lots of stack because we want to tolerate very large reports, and we can't use malloc here.
int __cdecl _VCrtDbgReportA(
    int nRptType,
    void * returnAddress,
    char const* szFile,
    int nLine,
    char const* szModule,
    char const* szFormat,
    va_list arglist
    )
{
    int retval=0;
    int handled=FALSE;

    char    szLineMessage[DBGRPT_MAX_MSG]{0};
    char    szOutMessage [DBGRPT_MAX_MSG]{0};
    wchar_t szOutMessage2[DBGRPT_MAX_MSG]{0};
    char    szUserMessage[DBGRPT_MAX_MSG]{0};

    if (nRptType < 0 || nRptType >= _CRT_ERRCNT)
        return -1;

    /*
     * handle the (hopefully rare) case of
     *
     * 1) ASSERT while already dealing with an ASSERT
     *      or
     * 2) two threads asserting at the same time
     */

    __try
    {
        if (_CRT_ASSERT == nRptType && _InterlockedIncrement(&_crtAssertBusy) > 0)
        {
            /* use only 'safe' functions -- must not assert in here! */

            _ERRCHECK(_itoa_s(nLine, szLineMessage, DBGRPT_MAX_MSG, 10));

            OutputDebugStringA("Second Chance Assertion Failed: File ");
            OutputDebugStringA(szFile ? szFile : "<file unknown>");
            OutputDebugStringA(", Line ");
            OutputDebugStringA(szLineMessage);
            OutputDebugStringA("\n");

            _CrtDbgBreak();
            retval=-1;
            __leave;
        }

        // Leave space for ASSERTINTRO1 and "\r\n"
        if (szFormat)
        {
            int szlen = 0;
            _ERRCHECK_SPRINTF(szlen = _vsnprintf_s(szUserMessage, DBGRPT_MAX_MSG,
                                                    DBGRPT_MAX_MSG - 2- max(sizeof(ASSERTINTRO1),sizeof(ASSERTINTRO2)),
                                                    szFormat, arglist));
            if (szlen < 0)
            {
                _ERRCHECK(strcpy_s(szUserMessage, DBGRPT_MAX_MSG, DBGRPT_TOOLONGMSG));
            }
        }

        if (_CRT_ASSERT == nRptType)
        {
            _ERRCHECK(strcpy_s(szLineMessage, DBGRPT_MAX_MSG, szFormat ? ASSERTINTRO1 : ASSERTINTRO2));
        }

        _ERRCHECK(strcat_s(szLineMessage, DBGRPT_MAX_MSG, szUserMessage));

        if (_CRT_ASSERT == nRptType)
        {
            if (_CrtDbgMode[nRptType] & _CRTDBG_MODE_FILE)
            {
                _ERRCHECK(strcat_s(szLineMessage, DBGRPT_MAX_MSG, "\r"));
            }

            _ERRCHECK(strcat_s(szLineMessage, DBGRPT_MAX_MSG, "\n"));
        }

        if (szFile)
        {
            int szlen = 0;
            _ERRCHECK_SPRINTF(szlen = _snprintf_s(szOutMessage, DBGRPT_MAX_MSG, DBGRPT_MAX_MSG - 1, "%s(%d) : %s",
                                                    szFile, nLine, szLineMessage));
            if (szlen < 0)
            {
                _ERRCHECK(strcpy_s(szOutMessage, DBGRPT_MAX_MSG, DBGRPT_TOOLONGMSG));
            }
        }
        else
        {
            _ERRCHECK(strcpy_s(szOutMessage, DBGRPT_MAX_MSG, szLineMessage));
        }

        {
            size_t ret = 0;
            errno_t e = 0;
            _ERRCHECK_EINVAL_ERANGE(e = mbstowcs_s(&ret, szOutMessage2, DBGRPT_MAX_MSG, szOutMessage, _TRUNCATE));
            if(e != 0)
            {
                _ERRCHECK(wcscpy_s(szOutMessage2, DBGRPT_MAX_MSG, _CRT_WIDE(DBGRPT_INVALIDMSG)));
            }
        }

        /* User hook may handle report.
            We have to check the ANSI Hook2 List & then the UNICODE Hook2 List.
            Then we have check any ANSI individual Hook set through
            SetReportHook */

        if (_pReportHookList || _pReportHookListW)
        {
            __crt_report_hook_node<char> *pnode=nullptr;
            __crt_report_hook_node<wchar_t> *pnodeW=nullptr;

            __acrt_lock(__acrt_debug_lock);
            __try
            {
                for (pnode = _pReportHookList; pnode; pnode = pnode->next)
                {
                    int hook_retval=0;
                    if (pnode->hook(nRptType, szOutMessage, &hook_retval))
                    {
                        handled=TRUE;
                        retval=hook_retval;
                        __leave;
                    }
                }

                for (pnodeW = _pReportHookListW; pnodeW; pnodeW = pnodeW->next)
                {
                    int hook_retval=0;
                    if (pnodeW->hook(nRptType, szOutMessage2, &hook_retval))
                    {
                        handled=TRUE;
                        retval=hook_retval;
                        __leave;
                    }
                }
            }
            __finally
            {
                __acrt_unlock(__acrt_debug_lock);
            }
        }

        if (handled)
            __leave;

        if (_pfnReportHook)
        {
            int hook_retval=0;
            if (_pfnReportHook(nRptType, szOutMessage, &hook_retval))
            {
                retval = hook_retval;
                __leave;
            }
        }

        if (_CrtDbgMode[nRptType] & _CRTDBG_MODE_FILE)
        {
            if (_CrtDbgFile[nRptType] != _CRTDBG_INVALID_HFILE)
            {
                DWORD bytes_written = 0;
                WriteFile(_CrtDbgFile[nRptType], szOutMessage, static_cast<DWORD>(strlen(szOutMessage)), &bytes_written, nullptr);
            }
        }

        if (_CrtDbgMode[nRptType] & _CRTDBG_MODE_DEBUG)
        {
            OutputDebugStringA(szOutMessage);
        }

        if (_CrtDbgMode[nRptType] & _CRTDBG_MODE_WNDW)
        {
            szLineMessage[0] = 0;
            if (nLine)
            {
                _ERRCHECK(_itoa_s(nLine, szLineMessage, DBGRPT_MAX_MSG, 10));
            }

            retval = __acrt_MessageWindowA(nRptType, returnAddress, szFile, (nLine ? szLineMessage : nullptr), szModule, szUserMessage);
        }
    }
Exemplo n.º 22
0
void ROParser::LoadConfig()
{
	g_Intrnl.Session.NoDivDmg = ConfIsEnable(_CRT_WIDE("PACKET"), _CRT_WIDE("NODIVDMG"));
	g_Intrnl.Session.TrueSight = ConfIsEnable(_CRT_WIDE("PACKET"), _CRT_WIDE("TRUESIGHT"));
}
Exemplo n.º 23
0
// CIR_OK=0 - OK, CIR_AlreadyInjected=1 - Already injected, иначе - ошибка
// Здесь вызывается CreateRemoteThread
CINFILTRATE_EXIT_CODES InjectRemote(DWORD nRemotePID, bool abDefTermOnly /*= false */)
{
	CINFILTRATE_EXIT_CODES iRc = CIR_GeneralError/*-1*/;
	bool lbWin64 = WIN3264TEST((IsWindows64()!=0),true);
	bool is32bit;
	int  nBits;
	DWORD nWrapperWait = (DWORD)-1, nWrapperResult = (DWORD)-1;
	HANDLE hProc = NULL;
	wchar_t szSelf[MAX_PATH+16], szHooks[MAX_PATH+16];
	wchar_t *pszNamePtr, szArgs[32];
	wchar_t szName[64];
	HANDLE hEvent = NULL;
	HANDLE hDefTermReady = NULL;
	bool bAlreadyHooked = false;
	HANDLE hSnap = NULL;
	MODULEENTRY32 mi = {sizeof(mi)};
	HMODULE ptrOuterKernel = NULL;

	if (!GetModuleFileName(NULL, szSelf, MAX_PATH))
	{
		iRc = CIR_GetModuleFileName/*-200*/;
		goto wrap;
	}
	wcscpy_c(szHooks, szSelf);
	pszNamePtr = (wchar_t*)PointToName(szHooks);
	if (!pszNamePtr)
	{
		iRc = CIR_GetModuleFileName/*-200*/;
		goto wrap;
	}


	// Hey, may be ConEmuHk.dll is already loaded?
	hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, nRemotePID);
	if (!hSnap || (hSnap == INVALID_HANDLE_VALUE))
	{
		iRc = CIR_SnapshotCantBeOpened/*-113*/;
		goto wrap;
	}
	else if (hSnap && Module32First(hSnap, &mi))
	{
		// 130829 - Let load newer(!) ConEmuHk.dll into target process.
		// 141201 - Also we need to be sure in kernel32.dll address

		LPCWSTR pszConEmuHk = WIN3264TEST(L"conemuhk.", L"conemuhk64.");
		size_t nDllNameLen = lstrlen(pszConEmuHk);
		// Out preferred module name
		wchar_t szOurName[40] = {};
		wchar_t szMinor[8] = L""; lstrcpyn(szMinor, _CRT_WIDE(MVV_4a), countof(szMinor));
		_wsprintf(szOurName, SKIPLEN(countof(szOurName))
			CEDEFTERMDLLFORMAT /*L"ConEmuHk%s.%02u%02u%02u%s.dll"*/,
			WIN3264TEST(L"",L"64"), MVV_1, MVV_2, MVV_3, szMinor);
		CharLowerBuff(szOurName, lstrlen(szOurName));

		// Go to enumeration
		wchar_t szName[64];
		do {
			LPCWSTR pszName = PointToName(mi.szModule);

			// Name of ConEmuHk*.*.dll module may be changed (copied to %APPDATA%)
			if (!pszName || !*pszName)
				continue;

			lstrcpyn(szName, pszName, countof(szName));
			CharLowerBuff(szName, lstrlen(szName));

			if (!ptrOuterKernel
				&& (lstrcmp(szName, L"kernel32.dll") == 0))
			{
				ptrOuterKernel = mi.hModule;
			}

			// ConEmuHk*.*.dll?
			if (!bAlreadyHooked
				&& (wmemcmp(szName, pszConEmuHk, nDllNameLen) == 0)
				&& (wmemcmp(szName+lstrlen(szName)-4, L".dll", 4) == 0))
			{
				// Yes! ConEmuHk.dll already loaded into nRemotePID!
				// But what is the version? Let don't downgrade loaded version!
				if (lstrcmp(szName, szOurName) >= 0)
				{
					// OK, szName is newer or equal to our build
					bAlreadyHooked = true;
				}
			}

			// Stop enumeration?
			if (bAlreadyHooked && ptrOuterKernel)
				break;
		} while (Module32Next(hSnap, &mi));

		// Check done
	}
	SafeCloseHandle(hSnap);


	// Already hooked?
	if (bAlreadyHooked)
	{
		iRc = CIR_AlreadyInjected/*1*/;
		goto wrap;
	}


	if (!ptrOuterKernel)
	{
		iRc = CIR_OuterKernelAddr/*-112*/;
		goto wrap;
	}


	// Check, if we can access that process
	hProc = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_READ, FALSE, nRemotePID);
	if (hProc == NULL)
	{
		iRc = CIR_OpenProcess/*-201*/;
		goto wrap;
	}


	// Go to hook

	// Preparing Events
	_wsprintf(szName, SKIPLEN(countof(szName)) CEDEFAULTTERMHOOK, nRemotePID);
	if (!abDefTermOnly)
	{
		// When running in normal mode (NOT set up as default terminal)
		// we need full initialization procedure, not a light one when hooking explorer.exe
		hEvent = OpenEvent(EVENT_MODIFY_STATE|SYNCHRONIZE, FALSE, szName);
		if (hEvent)
		{
			ResetEvent(hEvent);
			CloseHandle(hEvent);
		}
	}
	else
	{
		hEvent = CreateEvent(LocalSecurity(), FALSE, FALSE, szName);
		SetEvent(hEvent);

		_wsprintf(szName, SKIPLEN(countof(szName)) CEDEFAULTTERMHOOKOK, nRemotePID);
		hDefTermReady = CreateEvent(LocalSecurity(), FALSE, FALSE, szName);
		ResetEvent(hDefTermReady);
	}

	// Creating as remote thread.
	// Resetting this event notify ConEmuHk about
	// 1) need to determine MainThreadId
	// 2) need to start pipe server
	_wsprintf(szName, SKIPLEN(countof(szName)) CECONEMUROOTTHREAD, nRemotePID);
	hEvent = OpenEvent(EVENT_MODIFY_STATE|SYNCHRONIZE, FALSE, szName);
	if (hEvent)
	{
		ResetEvent(hEvent);
		CloseHandle(hEvent);
	}


	// Определить битность процесса, Если он 32битный, а текущий - ConEmuC64.exe
	// Перезапустить 32битную версию ConEmuC.exe
	nBits = GetProcessBits(nRemotePID, hProc);
	if (nBits == 0)
	{
		// Do not even expected, ConEmu GUI must run ConEmuC elevated if required.
		iRc = CIR_GetProcessBits/*-204*/;
		goto wrap;
	}

	is32bit = (nBits == 32);

	if (is32bit != WIN3264TEST(true,false))
	{
		// По идее, такого быть не должно. ConEmu должен был запустить соответствующий conemuC*.exe
		_ASSERTE(is32bit == WIN3264TEST(true,false));
		PROCESS_INFORMATION pi = {};
		STARTUPINFO si = {sizeof(si)};

		_wcscpy_c(pszNamePtr, 16, is32bit ? L"ConEmuC.exe" : L"ConEmuC64.exe");
		_wsprintf(szArgs, SKIPLEN(countof(szArgs)) L" /INJECT=%u", nRemotePID);

		if (!CreateProcess(szHooks, szArgs, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi))
		{
			iRc = CIR_CreateProcess/*-202*/;
			goto wrap;
		}
		nWrapperWait = WaitForSingleObject(pi.hProcess, INFINITE);
		GetExitCodeProcess(pi.hProcess, &nWrapperResult);
		CloseHandle(pi.hProcess);
		CloseHandle(pi.hThread);
		if ((nWrapperResult != CERR_HOOKS_WAS_SET) && (nWrapperResult != CERR_HOOKS_WAS_ALREADY_SET))
		{
			iRc = CIR_WrapperResult/*-203*/;
			SetLastError(nWrapperResult);
			goto wrap;
		}
		// Значит всю работу сделал враппер
		iRc = CIR_OK/*0*/;
		goto wrap;
	}

	// Поехали
	_wcscpy_c(pszNamePtr, 16, is32bit ? L"ConEmuHk.dll" : L"ConEmuHk64.dll");
	if (!FileExists(szHooks))
	{
		iRc = CIR_ConEmuHkNotFound/*-250*/;
		goto wrap;
	}

	if (abDefTermOnly)
	{
		CINFILTRATE_EXIT_CODES iFRc = PrepareHookModule(szHooks);
		if (iFRc != 0)
		{
			iRc = iFRc;
			goto wrap;
		}
	}

	iRc = InfiltrateDll(hProc, ptrOuterKernel, szHooks);

	// Если создавали временную копию - запланировать ее удаление
	if (abDefTermOnly && (lstrcmpi(szHooks, szSelf) != 0))
	{
		MoveFileEx(szHooks, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
	}
wrap:
	if (hProc != NULL)
		CloseHandle(hProc);
	// But check the result of the operation

	//_ASSERTE(FALSE && "WaitForSingleObject(hDefTermReady)");

	if ((iRc == 0) && hDefTermReady)
	{
		_ASSERTE(abDefTermOnly);
		DWORD nWaitReady = WaitForSingleObject(hDefTermReady, CEDEFAULTTERMHOOKWAIT/*==0*/);
		if (nWaitReady == WAIT_TIMEOUT)
		{
			iRc = CIR_DefTermWaitingFailed/*-300*/; // Failed to start hooking thread in remote process
		}
	}
	return iRc;
}