2016-09-18 6 views
-2

私は最初のパラメータとして最初のパラメータをとり、サイズを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'はアドレスではなく、値です。問題を示す[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)も呼び出しコードを表示してください。 –

+0

'StartAddress'と'&size'の狂気の両方を渡して使用する明白な間違ったメソッドのほかに、それぞれの* byte *や 'DWORD'sのシーケンスを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; 
} 

しかし、DWORDとしてStartAddressを定義するために、良いアイデアではありません。 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

関連する問題