간이 VM 혼동 프로 그래 밍-C 언어 소스 사용

(1)본 고 는 예 사 롭 지 않 은 혼동,즉 VMP 와 유사 한 방법 을 제시 하지만 본 고 는 VMP 와 유사 한 자동 도 구 를 제공 하지 않 는 다.
(2)본 방법 은 주로 핵심 알고리즘 구역 의 핵심 암호 화 함수 의 혼동 에 사용 된다.
(3)그러나 본 방법 은 관련 보조 개발 도구 가 없 기 때문에 어 셈 블 리 방식 을 사용 해 야 한다.
우선,우 리 는 두 편의 코드 를 써 서 스 택 기반 가상 머 신 을 실현 합 니 다.
 
#pragma once

//             ,                  
//        ,      
enum CV_ENUM
{
	vMark,
	vAdd1,
	vPushStr,
	vGotoIfN,
	vPushInt,
	vPushVst,
	vSub1,
	vEnd,
	vCmpIntSt,
	vGoto,
	vPushChar,
	vLoadChar,
	vSaveChar,
	vCalcMod,
	vCalcXorChar,
};


#define vSt(x) (x) //        
#define vMark(x) (x) //      

enum cVmDType
{
	vxtInteger,
	vxtString,
	vxtReal,
	vxtQword,
};

struct cVmData
{
	cVmDType vxxxType;
	int      vxxxSLen;
	union
	{
		__int64  asInteger;
		wchar_t* asString;
		double   asReal;
		DWORD64  asQword;
	};
};

#define ERR_OUT_OF_INDEX 1
#define ERR_POP_EMPTY_STACK 2
#define ERR_PUSH_FULL_STACK 3
#define ERR_SEH_EXEC_INST 4
#define ERR_UNSUPPORT_INST 5

BOOL CvMachine_ExcuteCode(DWORD_PTR* pCodePtr, int cVmMaxMark, int* m_MarkTable, int cVmMaxStack, cVmData* m_stack, int& IN OUT m_StTop, int & OUT nErr, int& OUT nErrPos);
BOOL CvMachine_ScanMark(DWORD_PTR* pCodePtr, int cVmMaxMark, int* m_MarkTable, int& OUT nErr, int& OUT nErrPos);
bool CvM_ExecuteOnInstruct(int Code, DWORD_PTR* pParams, bool& OUT bEnd, bool& OUT bNeedJump, int& OUT nJumpOffset, int& OUT exceptionErr, int* m_MarkTable, int cVmMaxStack, cVmData* m_stack, int& IN OUT m_StTop);
cVmData& CvM_ref_stack(DWORD_PTR nFromBottom, int cVmMaxStack, cVmData* m_stack);
cVmData CvM_pop(int& IN OUT m_StTop, cVmData* m_stack);
void CvM_push_v(cVmData& cv, int& IN OUT m_StTop, int cVmMaxStack, cVmData* m_stack);
void CvM_push_int(__int64 V, int& IN OUT m_StTop, int cVmMaxStack, cVmData* m_stack);
void CvM_push_str(wchar_t* pStr, int Len, int& IN OUT m_StTop, int cVmMaxStack, cVmData* m_stack);


template
class CvMachine//      ,      
{
public:
	CvMachine()
	{
		m_StTop = -1;
	}
	~CvMachine() {}

	BOOL ExcuteCode(DWORD_PTR* pCodePtr, int& OUT nErrCode, int& OUT nErrPos)
	{
		return CvMachine_ExcuteCode(pCodePtr, cVmMaxMark, m_MarkTable, cVmMaxStack, m_stack, m_StTop, nErrCode, nErrPos);
	}

private:
	cVmData      m_stack[cVmMaxStack];//64      1KB,128=2KB
	int          m_StTop;//            ,      
	int          m_MarkTable[cVmMaxMark];//         
};

다음은 예 입 니 다.이 가상 컴퓨터 를 기반 으로 하 는 다른 함수 나 함 수 를 실현 하 는 것 을 의미 합 니 다.이렇게 하면 IDA 역 컴 파일 을 통 해 코드 를 볼 수 없습니다.
BOOL VxxStringXOR(WCHAR* pText, int lenTxt, WCHAR* pKey, int lenKey)
{
	BOOL bRet = 0;
	//   CodingVM            
	//for(i = 0; i < lenKey; i++)
	//{
	//	pText[i]=pText[i]^pKey[i%lenKey];
	//}
	DWORD_PTR vxxCode[] =
	{
		//     ,  ,  0        
		vPushStr, (DWORD_PTR)pText, lenTxt,  //v0 Input
		vPushStr, (DWORD_PTR)pKey, lenKey,   //v1 Key
		vPushInt,  lenTxt,        //v2 lenTxt
		vPushInt,  lenKey,        //v3 lenKey
		vEnd,
	};

	static DWORD_PTR vxxCode2[] =
	{
		vPushInt,  0,             //v4 I
		//        
		vMark,     0,//     
		vPushVst,  vSt(4),
		vLoadChar, vSt(0),       //T[i]   
		//calc I%KeyLen
		vPushVst,  vSt(4),
		vPushVst,  vSt(3),
		vCalcMod,
		vLoadChar, vSt(1),       //K[KL%I]   
		vCalcXorChar, //top = xor ret
		vPushVst,  vSt(4),
		vSaveChar, vSt(0),
		vCmpIntSt, vSt(4), vSt(2),
		vGotoIfN, (DWORD_PTR)(-1), 1,
		vAdd1,     vSt(4),
		vGoto,     0,
		vMark,     1,
		//   
		//       ,            
		vEnd,
	};
	CvMachine machine;

	if(machine.ExcuteCode(vxxCode))
	{
		if(machine.ExcuteCode(vxxCode2))
		{
			bRet = TRUE;
		}
	}

	return bRet;
}

이 가상 명령 을 수행 하 는 코드 를 어떻게 실현 하 는 지 에 대해 서 는 이 글 을 이해 할 수 있 는 것 은 모두 스스로 실현 할 수 있 고 여 기 는 더 이상 쓰 지 않 습 니 다.

좋은 웹페이지 즐겨찾기