2016-05-21 10 views
-4

マシンコードを実行しようとしたときに実行時にクラッシュする理由を理解するのに助けが必要です。コードが "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; 
} 
+1

'VirtualProtect'の戻り値を確認してください。それは成功しましたか? ( 'VirtualAlloc'からの戻り値もチェックするべきですが、うまくいけば' memcpy'がクラッシュしているはずです) 'VirtualProtect'が成功した場合は、デバッガをアセンブリモードで起動し、 'addTwo'の宣言にブレークポイントを置きます。 – user3386109

+0

私はここで人々のためにすべてのチェックコードを削除しました。 @ user3386109 Windowsにネイティブデバッガがあるか、gdbをインストールする必要がありますか?読みやすさと理解を容易にするため – tiffanyButterfly95

+0

:公理に従ってください:* 1行につき1つのステートメント、ステートメントごとに1つの変数宣言。 'unsigned char code [] 'はデータを.tataセクションに配置し、.textセクションには配置せず、.dataセクションのアイテムは実行できません – user3629249

答えて

0

あなたが自動変数を格納するため、スタック上のメモリを使用しているようだ:

0x10, 0x4d, 0x89,   //mov %ecx,0x10(%rbp) 
0x10, 0x45, 0x8b,   //mov 0x10(%rbp),%eax 

が、あなたのオフセットが間違っています。0x10%rpbに追加すると、結果のアドレスポイントがprevioになります私たちはフレームをスタックする。ローカル変数をポイントするには、BPから引き算する必要があります。さらに、このためにスタックを使用する必要もなく、movl %ecx, %eaxを実行するだけで済みます。

+0

私はコードを調整しましたが、私はまだ同じ場所でクラッシュしています。 – tiffanyButterfly95

関連する問題