SOの誰かが、関数を「隠す」方法を尋ねる質問を投稿しました。これが私の答えでした:
#include <stdio.h>
#include <stdlib.h>
int encrypt(void)
{
char *text="Hello World";
asm("push text");
asm("call printf");
return 0;
}
int main(int argc, char *argv[])
{
volatile unsigned char *i=encrypt;
while(*i!=0x00)
*i++^=0xBE;
return EXIT_SUCCESS;
}
しかし、問題があります:
encode.c:関数 `main'内: encode.c:13:警告:互換性のないポインタ型からの初期化 C:\ DOCUME〜1 \ Aviral \ LOCALS〜1 \ Temp / ccYaOZhn.o:encode.c:(。text + 0xf):「テキスト」への未定義の参照 C:\ DOCUME〜1 \ Aviral \ LOCALS〜1 \ Temp / ccYaOZhn.o:encode.c:(。text + 0x14):`printf'への未定義の参照 collect2:ldが1つの終了ステータスを返しました
私の最初の質問は、なぜインラインアセンブリが失敗するのかということです...それを行う正しい方法は何でしょうか?他のこと-「ret」または「retn」のコードは0x00です、そうです...それがリターンに達するまで私のコードxorのもの...それでなぜそれはSEGFAULTingなのですか?