간이 VM 혼동 프로 그래 밍-C 언어 소스 사용
(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;
}
이 가상 명령 을 수행 하 는 코드 를 어떻게 실현 하 는 지 에 대해 서 는 이 글 을 이해 할 수 있 는 것 은 모두 스스로 실현 할 수 있 고 여 기 는 더 이상 쓰 지 않 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.