Module type_generator
source code
This module generates types automatically by disassembling code.
Generally Rekall prefers to use publicly available debugging information for
building profiles for the different operating systems supported. However, in
many cases, the symbols we need are not publicly available.
We can, in theory distribute hand written profiles, for each OS version but this
has a number of disadvantages:
- It is very time intensive to prepare hand written profiles for each version of
the operating system.
- It is not possible for us to test all possible versions (The Rekall profile
repository has currently hundreds of windows kernel builds - we would need to
maintain the profiles for each of these versions, and add new profiles each
time a hotfix is released.
- We also need to document how we arrive at these offsets in order for others to
verify our finding. It is important for a forensic application to be as
transparent as possible without "magic numbers" in code.
An additional requirement is that the disassembly process be data driven. This
way we can update the exact algorithm within the Rekall profile repository if an
error or bug is discovered without needing to update all current users of the
tool.
How does it work?
=================
The DynamicProfile profile is loaded from the profile repository as normal. Like
in a regular profile, the profile is defined by a json object. A DynamicProfile
however, contains an additional section $DYNAMIC_STRUCT, which will be compiled
into overlays.
{
"$METADATA": {
.....
}
"$DYNAMIC_STRUCT": {
"_TCP_LISTENER": {
"Owner": [
["Disassembler", {
"start": "tcpip.sys!_TcpCovetNetBufferList",
"rule": [
"MOV EAX, [ESI+$out]",
"TEST EAX, EAX",
"PUSH EAX",
"CALL DWORD *__imp__PsGetProcessId",
],
target="unsigned int"
}]
]
}
}
}
Author:
Michael Cohen <scudette@gmail.com>
|
DynamicParser
A dynamic profile processor base class.
|
|
Disassembler
A constant generator deriving values based on the disassembler.
|
|
DynamicProfile
A Dynamic profile which parses its overlays from $DYNAMIC_STRUCT.
|
|
GenerateOverlay(session,
dynamic_definition)
Parse the definition and generate an overlay from it. |
source code
|
|