2016-09-18 4 views
-2

시작 주소를 첫 번째 매개 변수로, 크기를 초로 취하고 런타임에 메모리의 해당 범위를 xor로 지정하는 함수가 필요합니다. 어떻게해야합니까?C에서 메모리의 XOR 바이트는 어떻게됩니까?

void XorMemory(DWORD StartAddress, DWORD dwSize) 
{ 
    DWORD *Start = &StartAddress; 
    DWORD size = StartAddress + dwSize; 
    DWORD *End = &size; 

    while(*Start < *End) 
    { 
     *Start++ ^= 0x83; 
    } 

} 

그러나이 작업을 반대해야 할 때 그것은 실패

내 순진한 접근이 있었다. 그것을 고치는 방법?

+1

"실패했습니다." * 무엇이 실패합니까? 'DWORD StartAddress'는 주소가 아니며 값입니다. 문제를 나타내는 [Minimal, Complete, Verifiable example] (http://stackoverflow.com/help/mcve)도 호출 코드를 보여주십시오. –

+0

'StartAddress'를 사용하고,'StartAddress'를 사용하고,'& size'를 사용하는 명백한 잘못된 메소드 외에도 각 * byte * 또는'DWORD' 시퀀스를 xor하려고합니까?, 코드는 후자를 의미합니다 , 그러나 그것은 기억의 단지 1/4가 실제로 가려지기 때문에 꽤 한심한 xor-masking 일 것입니다. – WhozCraig

+1

귀하의 정보는 암호화가 아닙니다. 이 사실을 이미 알고 있다면 제목을 다시 쓰는 것이 좋습니다. –

답변

0
void EncryptDecrypt(DWORD StartAddress, DWORD dwSize) 
{ 
    BYTE * t = (BYTE *)StartAddress; 
    for (DWORD i = 0; i < dwSize; i++) 
     t[i] ^= 0x83; 
} 

는하지만 DWORDStartAddress을 정의하는 것은 좋은 생각이 아니다. BYTE * 또는 심지어 void *이 더 좋습니다.

+0

표준 타입'unsigned char'의 문제점은 무엇입니까? 그건 정확히 1 바이트입니다. 독점적 인 유형을 사용하는 이유는 일반적으로 나쁜 설계입니다. 그리고 캐스트는 정의되지 않은 동작을 호출합니다. – Olaf

+0

'WinDef.h '와 다른 것들은'typedef unsigned char BYTE;'를 가지고 있지만,'unsigned char'를 사용하면 이식성에 한 걸음 다가 서 있습니다. – chux

+0

@Olaf'unsigned char'에 동의하지만'DWORD'가 정의되면'BYTE'도 정의되어 있다고 가정합니다 (아마도 Win32 프로젝트). – i486

관련 문제