Bonjour,

J'essaye de savoir comment fonctionne le mécanisme d'exception.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
void myruntime()
{
00401000  push        ebp  
00401001  mov         ebp,esp 
00401003  push        0FFFFFFFEh 
00401005  push        offset ___rtc_tzz+68h (402208h) 
0040100A  push        offset _except_handler4 (401695h) 
0040100F  mov         eax,dword ptr fs:[00000000h] 
00401015  push        eax  
00401016  sub         esp,8 
00401019  push        ebx  
0040101A  push        esi  
0040101B  push        edi  
0040101C  mov         eax,dword ptr [___security_cookie (403000h)] 
00401021  xor         dword ptr [ebp-8],eax 
00401024  xor         eax,ebp 
00401026  push        eax  
00401027  lea         eax,[ebp-10h] 
0040102A  mov         dword ptr fs:[00000000h],eax 
00401030  mov         dword ptr [ebp-18h],esp 
	__try
00401033  mov         dword ptr [ebp-4],0 
	{
		*p=5; //provoque exception car p = NULL
0040103A  mov         eax,dword ptr [p (403370h)] 
0040103F  mov         byte ptr [eax],5 
	}
00401042  jmp         $LN6+11h (40105Bh) 
	__except(1)
00401044  mov         eax,1 
$LN9:
00401049  ret              
$LN6:
0040104A  mov         esp,dword ptr [ebp-18h] 
	{
		printf("Exception\n");
0040104D  push        offset string "Exception\n" (4020E4h) 
00401052  call        dword ptr [__imp__printf (40209Ch)] 
00401058  add         esp,4 
	}
0040105B  mov         dword ptr [ebp-4],0FFFFFFFEh 
 
}
00401062  mov         ecx,dword ptr [ebp-10h] 
00401065  mov         dword ptr fs:[0],ecx 
0040106C  pop         ecx  
0040106D  pop         edi  
0040106E  pop         esi  
0040106F  pop         ebx  
00401070  mov         esp,ebp 
00401072  pop         ebp  
00401073  ret
Comment fait le prog pour retrouver l'adresse 0x40104a quand il y a exception ?


Source original :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "stdafx.h"
#include <stdio.h>
 
char *p=NULL;
 
void myruntime()
{
	__try
	{
		*p=5; //provoque exception car p = NULL
	}
	__except(1)
	{
		printf("Exception\n");
	}
 
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
	_asm int 3 //call debugger host
	myruntime();
	return 0;
}
Merci ;