26.08.2013 Views

366.7 KB - Evernote

366.7 KB - Evernote

366.7 KB - Evernote

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

If the stack is not writable, ProbeForWrite raises an exception, which is handled by<br />

nt!_except_handler4. I suppose it aborts the process, but I did not analyze it.<br />

The _CONTEXT structure is then filled with the user mode context taken from _KTRAP_FRAME.<br />

nt!KiInitializeUserApc actually reserves some more room on the user mode stack, below the<br />

_CONTEXT structure, where it will store the following data before leaving: SystemArgument2,<br />

SystemArgument1, NormalContext, pNormalRoutine (listed in decreasing addresses order).<br />

To keep things consistent, nt!KiInitializeUserApc updates the user mode esp into _KTRAP_FRAME<br />

so that it points at the beginning of the allocated data. This way it is as if the new data had been<br />

pushed on the stack by user mode code.<br />

Afterwards, it sets the ring 3 eip stored inside _KTRAP_FRAME to the address of the user mode<br />

function ntdll!KiUserApcDispatcher and leaves, returning to nt!KiDeliverApc.<br />

It is important to note that the now we have two values for the ring 3 eip: one inside<br />

_KTRAP_FRAME, which points to ntdll!KiUserApcDispatcher, the other, inside the _CONTEXT on the<br />

user mode stack, which has the original user mode eip.<br />

The eip copy inside _KTRAP_FRAME is the one which matters when execution goes back from<br />

kernel mode to user mode, so the thread will resume ring 3 execution inside<br />

ntdll!KiUserApcDispatcher. The _CONTEXT left on the user mode stack will be used by<br />

ntdll!KiUserApcDispatcher to resume the original user mode context later, after the NormalRoutine<br />

has been called.<br />

The picture below shows the user mode stack after nt!KiInitializeUserApc has run:<br />

padding<br />

8 free bytes<br />

_CONTEXT<br />

SystemArgument2<br />

SystemArgument1<br />

NormalContext<br />

NormalRoutine<br />

The padding is added to align the rest of the stack to 4 bytes boundaries.<br />

nt!KiInitializeUserApc returns to nt!KiDeliverApc, which in turns return to the SSD. The SSD then<br />

resumes user mode execution, causing ntdll!KiUserApcDispatcher to be called.<br />

29<br />

Original user<br />

mode esp<br />

Final user mode<br />

esp

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!