2017-09-06 26 views
1

QT를 처음 사용하고 암호화 된 기능을 만들려고합니다. 는 당신이 C/C++로 할 수 있습니다 전체 :런타임에 암호 해독 기능을 사용하고 QT C++

  • 하는
  • 함수 페이지는 rwx에게
  • 암호화을 작동하려면 포인터를 가지고 그것 (I 암호화와 같은 프로그램에 해독 예를 들어)
  • 암호를 해독하고

C의 간단한 코드는 다음과 같이 거의 일어날 실행

,321 0

QT에서 이러한 예제를 실행하려고하면 런타임 오류가 발생합니다.

void TestFunction() 
{ 
    QMessageBox::information(0, "Test", "msgbox test encrypted func"); 
} 
void FunctionStub() { return; } 

void XorBlock(DWORD dwStartAddress, DWORD dwSize) 
{ 
    char * addr = (char *)dwStartAddress; 
    for (int i = 0; i< dwSize; i++) 
    { 
     addr[i] ^= 0xff;    // here i get seg. fault 
    } 
} 

DWORD GetFuncSize(DWORD* Function, DWORD* StubFunction) 
{ 
    DWORD dwFunctionSize = 0, dwOldProtect; 
    DWORD *fnA = NULL, *fnB = NULL; 

    fnA = (DWORD *)Function; 
    fnB = (DWORD *)StubFunction; 
    dwFunctionSize = (fnB - fnA); 
    VirtualProtect(fnA, dwFunctionSize, PAGE_EXECUTE_READWRITE, &dwOldProtect); // Need to modify our privileges to the memory 

    QMessageBox::information(0, "Test", "change func to read write execute "); 
    return dwFunctionSize; 
} 




void check_enc_function() 
{ 

    DWORD dwFuncSize = GetFuncSize((DWORD*)&TestFunction, (DWORD*)&FunctionStub); 
    QMessageBox::information(0, "Test", "use func"); 
    TestFunction(); 
    XorBlock((DWORD)&TestFunction, dwFuncSize); // XOR encrypt the function -> @@@ i get seg fault in here @@@ 
    QMessageBox::information(0, "Test", "after enc"); 


    TestFunction(); // If you try to run the encrypted function you will get Access Violation Exception. 

    XorBlock((DWORD)&TestFunction, dwFuncSize); // XOR decrypt the function 
    QMessageBox::information(0, "Test", "after dec"); 
    TestFunction(); // Fine here 

    getchar(); 
} 

왜 이런 일이 있어야 : 여기

은 QT의 코드인가? QT는 표준 C++처럼 정밀도처럼 동작해야합니다 ...

post Scriptum.

흥미롭게도 중요한 기능을 암호화 된 상태로 유지하는 가장 합법적 인 방법은 무엇입니까 (암호화되는 이유는 DRM입니까?).

합법적으로 나는 안티 바이러스가 나를 방어하기 때문에 실수로 나를 바이러스로 표시하지 않는다는 것을 의미합니다.

PS2

나는 말, 나는 클라이언트가 서버에서 실행하는 데 필요한 기능을 요청하고 서버가 경우에 전송하는 서버 클라이언트 스키마를 구축 할 것입니다 (네트워크를 통해 암호화 기능을 전달하는 경우 승인 됨) 어떻게 함수가 붕괴되지 않도록 기호를 정렬 할 수 있습니까?

PS3 QT에서 나는 DEP와 ASLR 방어 해제 할 수있는 방법

?

답변

2

예는 내 시스템에 정의되지 않은 동작입니다 요코

감사 (내 생각에 나는 PS 2. 내가 그들을 취소해야 실행할 수 있도록). 코드에서

첫 번째와 주요 문제는 다음과 같습니다

void TestFunction() { /* ... */ } 
void FunctionStub() { return; } 

당신은 컴파일러가 패딩없이 TestFunctionFunctionStub을 넣어 것으로 가정합니다. 귀하의 예를 컴파일하고 내 경우에는 FunctionStubTestFunction 위의 부정 dwFunctionSize 결과입니다.

dwFunctionSize = (fnB - fnA); 

TestFunction located at @ 0xa11d90 
FunctionStub located at @ 0xa11b50 
dwFunctionSize = -0x240 

또한 XorBlock에

addr[i] ^= 0xff; 

는 아무것도하지 않고있다.

XOR에 대한 메모리 위치에 XorBlock을 쓰고 전체 TestFunction을 쓰고 싶다고 가정합니다. 나는 당신의 예에서 어떤 Qt는 별을 볼 수

void XorBlock(DWORD dwStartAddress, DWORD dwSize) 
{ 
    DWORD dwEndAddress = dwStartAddress + dwSize; 
    for(DWORD i = dwStartAddress; i < dwEndAddress; i++) { 
     // ... 
    } 
} 
1

:

은 당신이 뭔가를 할 수 있습니다. Qt 함수 호출이라 할지라도 그냥 호출 일뿐입니다. 그래서 두 예제 모두에서 정의되지 않은 동작이 있지만 두 번째 충돌 만 발생한다고 생각합니다.

컴파일러와 링커가 기능 순서를 유지할 이유가 없습니다. 예를 들어 GCC에서는 각 함수의 코드 섹션을 지정할 수 있습니다. 그래서 당신은 cpp에서 재정렬하지 않고 실행 파일에서 재정렬 할 수있다.

저는 컴파일러가 작동하도록 컴파일러가 필요하다고 생각합니다.