1 #define WIN32_LEAN_AND_MEAN
13 static unsigned int nRandBytes
;
15 static int initrand(void)
17 unsigned int nRandMax
;
18 unsigned int nRandMaxBits
;
23 for(nRandMaxBits
= 0; nRandMax
!= 0; nRandMax
>>= 1, ++ nRandMaxBits
);
25 nRandBytes
= nRandMaxBits
/ CHAR_BIT
;
27 assert(nRandBytes
!= 0);
29 srand((unsigned)(time(&tLoc
) & UINT_MAX
));
34 static void randbytes(void * p
, size_t n
)
40 b
= (unsigned char *)p
;
42 for(i
= 0; i
< n
; ++ i
)
44 if(i
% nRandBytes
== 0)
47 b
[i
] = (unsigned char)(r
& UCHAR_MAX
);
52 static ULONG
randULONG(void)
55 randbytes(&n
, sizeof(n
));
60 #define ZWC_SEGMENT_BITS (0xFFFF)
61 #define ZWC_EFLAGS_BITS (0x3C0CD5)
64 static jmp_buf jmpbuf
;
65 static CONTEXT continueContext
;
67 extern void continuePoint(void);
68 extern void check(CONTEXT
*);
69 extern LONG NTAPI
ZwContinue(IN CONTEXT
*, IN BOOLEAN
);
71 void check(CONTEXT
* actualContext
)
74 assert(actualContext
->ContextFlags
== CONTEXT_FULL
);
76 /* Random data segments */
79 (actualContext
->SegGs
& ZWC_SEGMENT_BITS
) ==
80 (continueContext
.SegGs
& ZWC_SEGMENT_BITS
)
85 (actualContext
->SegFs
& ZWC_SEGMENT_BITS
) ==
86 (continueContext
.SegFs
& ZWC_SEGMENT_BITS
)
91 (actualContext
->SegEs
& ZWC_SEGMENT_BITS
) ==
92 (continueContext
.SegEs
& ZWC_SEGMENT_BITS
)
97 (actualContext
->SegDs
& ZWC_SEGMENT_BITS
) ==
98 (continueContext
.SegDs
& ZWC_SEGMENT_BITS
)
101 /* Integer registers */
102 assert(actualContext
->Edi
== continueContext
.Edi
);
103 assert(actualContext
->Esi
== continueContext
.Esi
);
104 assert(actualContext
->Ebx
== continueContext
.Ebx
);
105 printf("%s %lX : %lX\n", "Edx", actualContext
->Edx
, continueContext
.Edx
);
106 //assert(actualContext->Edx == continueContext.Edx);
107 assert(actualContext
->Ecx
== continueContext
.Ecx
);
108 assert(actualContext
->Eax
== continueContext
.Eax
);
110 /* Control registers and segments */
111 assert(actualContext
->Ebp
== continueContext
.Ebp
);
112 assert(actualContext
->Eip
== continueContext
.Eip
);
116 (actualContext
->SegCs
& ZWC_SEGMENT_BITS
) ==
117 (continueContext
.SegCs
& ZWC_SEGMENT_BITS
)
122 (actualContext
->EFlags
& ZWC_EFLAGS_BITS
) ==
123 (continueContext
.EFlags
& ZWC_EFLAGS_BITS
)
126 assert(actualContext
->Esp
== continueContext
.Esp
);
130 (actualContext
->SegSs
& ZWC_SEGMENT_BITS
) ==
131 (continueContext
.SegSs
& ZWC_SEGMENT_BITS
)
143 if(setjmp(jmpbuf
) == 0)
147 continueContext
.ContextFlags
= CONTEXT_FULL
;
148 GetThreadContext(GetCurrentThread(), &continueContext
);
151 continueContext
.ContextFlags
= CONTEXT_FULL
;
153 /* Fill the integer registers with random values */
154 continueContext
.Edi
= randULONG();
155 continueContext
.Esi
= randULONG();
156 continueContext
.Ebx
= randULONG();
157 continueContext
.Edx
= randULONG();
158 continueContext
.Ecx
= randULONG();
159 continueContext
.Eax
= randULONG();
160 continueContext
.Ebp
= randULONG();
162 /* Randomize all the allowed flags (determined experimentally with WinDbg) */
163 continueContext
.EFlags
= randULONG() & 0x3C0CD5;
165 /* Randomize the stack pointer as much as possible */
166 continueContext
.Esp
=
167 (ULONG
)(((ULONG_PTR
)&bogus
) & 0xFFFFFFFF) +
169 (randULONG() & 0xF) * 4;
171 /* continuePoint() is implemented in assembler */
172 continueContext
.Eip
= (ULONG
)((ULONG_PTR
)continuePoint
& 0xFFFFFFF);
174 /* Can't do a lot about segments */
177 ZwContinue(&continueContext
, FALSE
);