マシンコードを実行しようとしたときに実行時にクラッシュする理由を理解するのに助けが必要です。コードが "3"と "result =%li"の間でクラッシュします。マシンコード実行時のランタイムエラーが不明確
注:すべてのコードがエラーチェックされているものとします。私はこれを読んでいる人々のためにエラーチェックコードを削除しました。
マシンスペック:私は実行しています
Windows 10 Home 64-bit
Intel(R) Core(TM) i7-4712MQ
コード:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main(int argc, char** argv) {
printf("Loading code\n");
LPVOID m = VirtualAlloc(NULL, 16, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
printf("1\n");
unsigned char code[] = {
//return x+2;
0x55, //push %rbp
0xe5, 0x89, 0x48, //mov %rsp,%rbp
0xc8, 0x89, //movl %ecx,%eax
0x02, 0xc0, 0x83, //add $0x2,%eax
0xc9, //leaveq
0xc3, //retq
0x90 //nop
};
memcpy(m, code, sizeof(code));
printf("2\n");
PDWORD trash;
VirtualProtect(m, 16, PAGE_EXECUTE_READ, trash);
printf("3\n");
long int (*addTwo)(long int) = m;
long int answer = addTwo(2);
printf("result = %li\n", answer);
VirtualFree(m, 0, MEM_RELEASE);
return 0;
}
'VirtualProtect'の戻り値を確認してください。それは成功しましたか? ( 'VirtualAlloc'からの戻り値もチェックするべきですが、うまくいけば' memcpy'がクラッシュしているはずです) 'VirtualProtect'が成功した場合は、デバッガをアセンブリモードで起動し、 'addTwo'の宣言にブレークポイントを置きます。 – user3386109
私はここで人々のためにすべてのチェックコードを削除しました。 @ user3386109 Windowsにネイティブデバッガがあるか、gdbをインストールする必要がありますか?読みやすさと理解を容易にするため – tiffanyButterfly95
:公理に従ってください:* 1行につき1つのステートメント、ステートメントごとに1つの変数宣言。 'unsigned char code [] 'はデータを.tataセクションに配置し、.textセクションには配置せず、.dataセクションのアイテムは実行できません – user3629249