私はPINを初めて使うので、簡単な説明があります。私は、WindowsでのPINの返品に関するルーチンアドレスに困惑しています。私は私のポイントを説明するための最小のテストプログラムを作成しました。Intel PINルーチンの検索:LinuxとWindowsの比較
私は現在PIN 2.14を使用しています。私が調べたアプリケーションは、Windows上で無効になっているASLRを持つDebugビルドです。
まず空のメソッドを呼び出し、メソッドのアドレスを出力し、このシンプルなアプリケーションを検討:
#include "stdio.h"
class Test {
public:
void method() {}
};
void main() {
Test t;
t.method();
printf("Test::method = 0x%p\n", &Test::method);
}
次ピンツールプログラムのメインルーチンを分解し、テストのアドレスを出力します::方法:
をpush rbp
mov rbp, rsp
push r13
push r12
push rbx
sub rsp, 0x18
lea rax, ptr [rbp-0x21]
mov rdi, rax
call 0x400820
mov r12d, 0x400820
mov r13d, 0x0
mov rcx, r12
mov rbx, r13
mov rax, r12
mov rdx, r13
mov rax, rdx
mov rsi, rcx
mov rdx, rax
mov edi, 0x4008b4
mov eax, 0x0
call 0x4006a0
mov eax, 0x0
add rsp, 0x18
pop rbx
pop r12
pop r13
pop rbp
ret
_ZN4Test6methodEv detected by PIN resides at 0x0x400820.
Test::method = 0x0x400820
:
のUbuntu 14.04.3 x64のVMプリント上のテストアプリケーションに対してこのPINツールを実行します
呼び出しターゲットt.method()、およびPINによって取得された関数アドレスとアプリケーションの出力は、Test ::メソッドがアドレス0x0x400820に存在することを示します。
私のWindows 10のx64マシン上の出力は次のようになります。
push rdi
sub rsp, 0x40
mov rdi, rsp
mov ecx, 0x10
mov eax, 0xcccccccc
rep stosd dword ptr [rdi]
lea rcx, ptr [rsp+0x24]
call 0x14000104b
lea rdx, ptr [rip-0x2b]
lea rcx, ptr [rip+0x74ca3]
call 0x1400013f0
xor eax, eax
mov edi, eax
mov rcx, rsp
lea rdx, ptr [rip+0x74cf0]
call 0x1400015f0
mov eax, edi
add rsp, 0x40
pop rdi
ret
Test::method detected by PIN resides at 0x0000000140001120.
Test::method = 0x000000014000104B
解体中のアプリケーションの出力やコール・ターゲットが同じ値を示しています。ただし、PINによって返されるルーチンアドレスは異なります。
私はこの動作について非常に困惑しています。これを説明する方法はありますか?
ありがとうございました!それは両方の関数ポインタ、呼び出しの対象だけでなく、PINによって返されたルーチンのアドレスが有効であったとメソッドを呼び出すことになったことが明らかになったしばらくのプロービング後
: