1 """
2 Win32 Platform Module
3 """
4
5 import os
6 import sys
7 import struct
8 import traceback
9 import platform
10
11 import PE
12
13 import vstruct
14 import vstruct.builder as vs_builder
15 import vstruct.defs.win32 as vs_win32
16 import vstruct.defs.windows as vs_windows
17
18 import vtrace
19 import vtrace.archs.i386 as v_i386
20 import vtrace.archs.amd64 as v_amd64
21 import vtrace.platforms.base as v_base
22
23 import envi
24 import envi.bits as e_bits
25 import envi.memory as e_mem
26 import envi.resolver as e_resolv
27 import envi.archs.i386 as e_i386
28 import envi.archs.amd64 as e_amd64
29
30 from ctypes import *
31
32
33 platdir = os.path.dirname(__file__)
34
35 kernel32 = None
36 dbghelp = None
37 psapi = None
38 ntdll = None
39 advapi32 = None
40
41 IsWow64Process = None
42
43
44
45
46 LPVOID = c_size_t
47 HANDLE = LPVOID
48 SIZE_T = LPVOID
49 QWORD = c_ulonglong
50 DWORD = c_ulong
51 WORD = c_ushort
52 BOOL = c_ulong
53 BYTE = c_ubyte
54 NULL = 0
55
56 INFINITE = 0xffffffff
57 EXCEPTION_MAXIMUM_PARAMETERS = 15
58
59
60 EXCEPTION_DEBUG_EVENT =1
61 CREATE_THREAD_DEBUG_EVENT =2
62 CREATE_PROCESS_DEBUG_EVENT =3
63 EXIT_THREAD_DEBUG_EVENT =4
64 EXIT_PROCESS_DEBUG_EVENT =5
65 LOAD_DLL_DEBUG_EVENT =6
66 UNLOAD_DLL_DEBUG_EVENT =7
67 OUTPUT_DEBUG_STRING_EVENT =8
68 RIP_EVENT =9
69
70
71 SYMFLAG_VALUEPRESENT = 0x00000001
72 SYMFLAG_REGISTER = 0x00000008
73 SYMFLAG_REGREL = 0x00000010
74 SYMFLAG_FRAMEREL = 0x00000020
75 SYMFLAG_PARAMETER = 0x00000040
76 SYMFLAG_LOCAL = 0x00000080
77 SYMFLAG_CONSTANT = 0x00000100
78 SYMFLAG_EXPORT = 0x00000200
79 SYMFLAG_FORWARDER = 0x00000400
80 SYMFLAG_FUNCTION = 0x00000800
81 SYMFLAG_VIRTUAL = 0x00001000
82 SYMFLAG_THUNK = 0x00002000
83 SYMFLAG_TLSREL = 0x00004000
84
85
86 SYMOPT_CASE_INSENSITIVE = 0x00000001
87 SYMOPT_UNDNAME = 0x00000002
88 SYMOPT_DEFERRED_LOADS = 0x00000004
89 SYMOPT_NO_CPP = 0x00000008
90 SYMOPT_LOAD_LINES = 0x00000010
91 SYMOPT_OMAP_FIND_NEAREST = 0x00000020
92 SYMOPT_LOAD_ANYTHING = 0x00000040
93 SYMOPT_IGNORE_CVREC = 0x00000080
94 SYMOPT_NO_UNQUALIFIED_LOADS = 0x00000100
95 SYMOPT_FAIL_CRITICAL_ERRORS = 0x00000200
96 SYMOPT_EXACT_SYMBOLS = 0x00000400
97 SYMOPT_ALLOW_ABSOLUTE_SYMBOLS = 0x00000800
98 SYMOPT_IGNORE_NT_SYMPATH = 0x00001000
99 SYMOPT_INCLUDE_32BIT_MODULES = 0x00002000
100 SYMOPT_PUBLICS_ONLY = 0x00004000
101 SYMOPT_NO_PUBLICS = 0x00008000
102 SYMOPT_AUTO_PUBLICS = 0x00010000
103 SYMOPT_NO_IMAGE_SEARCH = 0x00020000
104 SYMOPT_SECURE = 0x00040000
105 SYMOPT_NO_PROMPTS = 0x00080000
106 SYMOPT_OVERWRITE = 0x00100000
107 SYMOPT_DEBUG = 0x80000000
108
109
110 EXCEPTION_WAIT_0 = 0x00000000L
111 EXCEPTION_ABANDONED_WAIT_0 = 0x00000080L
112 EXCEPTION_USER_APC = 0x000000C0L
113 EXCEPTION_TIMEOUT = 0x00000102L
114 EXCEPTION_PENDING = 0x00000103L
115 DBG_EXCEPTION_HANDLED = 0x00010001L
116 DBG_CONTINUE = 0x00010002L
117 EXCEPTION_SEGMENT_NOTIFICATION = 0x40000005L
118 DBG_TERMINATE_THREAD = 0x40010003L
119 DBG_TERMINATE_PROCESS = 0x40010004L
120 DBG_CONTROL_C = 0x40010005L
121 DBG_CONTROL_BREAK = 0x40010008L
122 DBG_COMMAND_EXCEPTION = 0x40010009L
123 EXCEPTION_GUARD_PAGE_VIOLATION = 0x80000001L
124 EXCEPTION_DATATYPE_MISALIGNMENT = 0x80000002L
125 EXCEPTION_BREAKPOINT = 0x80000003L
126 EXCEPTION_SINGLE_STEP = 0x80000004L
127 DBG_EXCEPTION_NOT_HANDLED = 0x80010001L
128 EXCEPTION_ACCESS_VIOLATION = 0xC0000005L
129 EXCEPTION_IN_PAGE_ERROR = 0xC0000006L
130 EXCEPTION_INVALID_HANDLE = 0xC0000008L
131 EXCEPTION_NO_MEMORY = 0xC0000017L
132 EXCEPTION_ILLEGAL_INSTRUCTION = 0xC000001DL
133 EXCEPTION_NONCONTINUABLE_EXCEPTION = 0xC0000025L
134 EXCEPTION_INVALID_DISPOSITION = 0xC0000026L
135 EXCEPTION_ARRAY_BOUNDS_EXCEEDED = 0xC000008CL
136 EXCEPTION_FLOAT_DENORMAL_OPERAND = 0xC000008DL
137 EXCEPTION_FLOAT_DIVIDE_BY_ZERO = 0xC000008EL
138 EXCEPTION_FLOAT_INEXACT_RESULT = 0xC000008FL
139 EXCEPTION_FLOAT_INVALID_OPERATION = 0xC0000090L
140 EXCEPTION_FLOAT_OVERFLOW = 0xC0000091L
141 EXCEPTION_FLOAT_STACK_CHECK = 0xC0000092L
142 EXCEPTION_FLOAT_UNDERFLOW = 0xC0000093L
143 EXCEPTION_INTEGER_DIVIDE_BY_ZERO = 0xC0000094L
144 EXCEPTION_INTEGER_OVERFLOW = 0xC0000095L
145 EXCEPTION_PRIVILEGED_INSTRUCTION = 0xC0000096L
146 EXCEPTION_STACK_OVERFLOW = 0xC00000FDL
147 EXCEPTION_CONTROL_C_EXIT = 0xC000013AL
148 EXCEPTION_FLOAT_MULTIPLE_FAULTS = 0xC00002B4L
149 EXCEPTION_FLOAT_MULTIPLE_TRAPS = 0xC00002B5L
150 EXCEPTION_REG_NAT_CONSUMPTION = 0xC00002C9L
151
152
153 CONTEXT_i386 = 0x00010000
154 CONTEXT_i486 = 0x00010000
155 CONTEXT_AMD64 = 0x00100000
156
157 CONTEXT_CONTROL = 0x00000001L
158 CONTEXT_INTEGER = 0x00000002L
159 CONTEXT_SEGMENTS = 0x00000004L
160 CONTEXT_FLOATING_POINT = 0x00000008L
161 CONTEXT_DEBUG_REGISTERS = 0x00000010L
162 CONTEXT_EXTENDED_REGISTERS = 0x00000020L
163 CONTEXT_FULL = (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
164 CONTEXT_ALL = (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS)
165
166
167
168 THREAD_ALL_ACCESS = 0x001f03ff
169 PROCESS_ALL_ACCESS = 0x001f0fff
170
171
172 PAGE_NOACCESS = 0x01
173 PAGE_READONLY = 0x02
174 PAGE_READWRITE = 0x04
175 PAGE_WRITECOPY = 0x08
176 PAGE_EXECUTE = 0x10
177 PAGE_EXECUTE_READ = 0x20
178 PAGE_EXECUTE_READWRITE = 0x40
179 PAGE_EXECUTE_WRITECOPY = 0x80
180 PAGE_GUARD = 0x100
181 PAGE_NOCACHE = 0x200
182 PAGE_WRITECOMBINE = 0x400
183
184
185 perm_lookup = {
186 PAGE_NOACCESS:0,
187 PAGE_READONLY:e_mem.MM_READ,
188 PAGE_READWRITE: e_mem.MM_READ | e_mem.MM_WRITE,
189 PAGE_WRITECOPY: e_mem.MM_READ | e_mem.MM_WRITE,
190 PAGE_EXECUTE: e_mem.MM_EXEC,
191 PAGE_EXECUTE_READ: e_mem.MM_EXEC | e_mem.MM_READ,
192 PAGE_EXECUTE_READWRITE: e_mem.MM_EXEC | e_mem.MM_READ | e_mem.MM_WRITE,
193 PAGE_EXECUTE_WRITECOPY: e_mem.MM_EXEC | e_mem.MM_READ | e_mem.MM_WRITE,
194 }
195
196
197 perm_rev_lookup = {
198 0:PAGE_NOACCESS,
199 e_mem.MM_READ:PAGE_READONLY,
200 e_mem.MM_READ|e_mem.MM_WRITE:PAGE_READWRITE,
201 e_mem.MM_EXEC:PAGE_EXECUTE,
202 e_mem.MM_EXEC|e_mem.MM_READ:PAGE_EXECUTE_READ,
203 e_mem.MM_EXEC|e_mem.MM_READ|e_mem.MM_WRITE:PAGE_EXECUTE_READWRITE,
204 }
205
206
207 MEM_COMMIT = 0x1000
208 MEM_FREE = 0x10000
209 MEM_RESERVE = 0x2000
210
211
212 MEM_IMAGE = 0x1000000
213 MEM_MAPPED = 0x40000
214 MEM_PRIVATE = 0x20000
215
216
217 DEBUG_ONLY_THIS_PROCESS = 0x02
218
219 MAX_PATH=260
220
221 -class MSR(Structure):
222 _fields_ = [
223 ('msr', DWORD),
224 ('value', QWORD),
225 ]
226
227
228 SysDbgQueryModuleInformation = 0
229 SysDbgQueryTraceInformation = 1
230 SysDbgSetTracepoint = 2
231 SysDbgSetSpecialCall = 3
232 SysDbgClearSpecialCalls = 4
233 SysDbgQuerySpecialCalls = 5
234 SysDbgBreakPoint = 6
235 SysDbgQueryVersion = 7
236 SysDbgReadVirtual = 8
237 SysDbgWriteVirtual = 9
238 SysDbgReadPhysical = 10
239 SysDbgWritePhysical = 11
240 SysDbgReadControlSpace = 12
241 SysDbgWriteControlSpace = 13
242 SysDbgReadIoSpace = 14
243 SysDbgWriteIoSpace = 15
244 SysDbgReadMsr = 16
245 SysDbgWriteMsr = 17
246 SysDbgReadBusData = 18
247 SysDbgWriteBusData = 19
248 SysDbgCheckLowMemory = 20
249 SysDbgEnableKernelDebugger = 21
250 SysDbgDisableKernelDebugger = 22
251 SysDbgGetAutoKdEnable = 23
252 SysDbgSetAutoKdEnable = 24
253 SysDbgGetPrintBufferSize = 25
254 SysDbgSetPrintBufferSize = 26
255 SysDbgGetKdUmExceptionEnable = 27
256 SysDbgSetKdUmExceptionEnable = 28
257 SysDbgGetTriageDump = 29
258 SysDbgGetKdBlockEnable = 30
259 SysDbgSetKdBlockEnable = 31
260 SysDbgRegisterForUmBreakInfo = 32
261 SysDbgGetUmBreakPid = 33
262 SysDbgClearUmBreakPid = 34
263 SysDbgGetUmAttachPid = 35
264 SysDbgClearUmAttachPid = 36
265
266 -def wrmsr(msrid, value):
275
288
289 SC_MANAGER_ALL_ACCESS = 0xF003F
290 SC_MANAGER_CREATE_SERVICE = 0x0002
291 SC_MANAGER_CONNECT = 0x0001
292 SC_MANAGER_ENUMERATE_SERVICE = 0x0004
293 SC_MANAGER_LOCK = 0x0008
294 SC_MANAGER_MODIFY_BOOT_CONFIG = 0x0020
295 SC_MANAGER_QUERY_LOCK_STATUS = 0x0010
296
297 SC_ENUM_PROCESS_INFO = 0
298
299 SERVICE_WIN32 = 0x30
300
301 SERVICE_ACTIVE = 0x01
302 SERVICE_INNACTIVE = 0x02
303 SERVICE_STATE_ALL = 0x03
306 _fields_ = [
307 ('dwServiceType', DWORD),
308 ('dwCurrentState', DWORD),
309 ('dwControlsAccepted', DWORD),
310 ('dwWin32ExitCode', DWORD),
311 ('dwServiceSpecificExitCode',DWORD),
312 ('dwCheckPoint', DWORD),
313 ('dwWaitHint', DWORD),
314 ('dwProcessId', DWORD),
315 ('dwServiceFlags', DWORD)
316 ]
317
324
326 _fields_ = [
327 ("ExceptionCode", DWORD),
328 ("ExceptionFlags", DWORD),
329 ("ExceptionRecord", LPVOID),
330 ("ExceptionAddress", LPVOID),
331 ("NumberParameters", c_ulong),
332 ("ExceptionInformation", LPVOID * EXCEPTION_MAXIMUM_PARAMETERS)
333 ]
334
340
342 _fields_ = [
343 ("Thread", HANDLE),
344 ("ThreadLocalBase", LPVOID),
345 ("StartAddress", LPVOID)
346 ]
347
349 _fields_ = [
350 ("File", HANDLE),
351 ("Process", HANDLE),
352 ("Thread", HANDLE),
353 ("BaseOfImage", LPVOID),
354 ("DebugInfoFileOffset", c_ulong),
355 ("DebugInfoSize", c_ulong),
356 ("ThreadLocalBase", LPVOID),
357 ("StartAddress", LPVOID),
358 ("ImageName", LPVOID),
359 ("Unicode", c_short),
360 ]
361
364
367
369 _fields_ = [
370 ("File", HANDLE),
371 ("BaseOfDll", LPVOID),
372 ("DebugInfoFileOffset", c_ulong),
373 ("DebugInfoSize", c_ulong),
374 ("ImageName", LPVOID),
375 ("Unicode", c_ushort),
376 ]
378 _fields_ = [
379 ("BaseOfDll", LPVOID),
380 ]
382 _fields_ = [
383 ("DebugStringData", LPVOID),
384 ("Unicode", c_ushort),
385 ("DebugStringLength", c_ushort),
386 ]
388 _fields_ = [
389 ("Error", c_ulong),
390 ("Type", c_ulong),
391 ]
392
394 _fields_ = [ ("Exception",EXCEPTION_DEBUG_INFO),
395 ("CreateThread", CREATE_THREAD_DEBUG_INFO),
396 ("CreateProcessInfo", CREATE_PROCESS_DEBUG_INFO),
397 ("ExitThread", EXIT_THREAD_DEBUG_INFO),
398 ("ExitProcess", EXIT_PROCESS_DEBUG_INFO),
399 ("LoadDll", LOAD_DLL_DEBUG_INFO),
400 ("UnloadDll", UNLOAD_DLL_DEBUG_INFO),
401 ("DebugString", OUTPUT_DEBUG_STRING_INFO),
402 ("RipInfo", RIP_INFO)]
403
405 _fields_ = [
406 ("DebugEventCode", c_ulong),
407 ("ProcessId", c_ulong),
408 ("ThreadId", c_ulong),
409 ("u", DBG_EVENT_UNION),
410 ]
411
413 _fields_ = [("ControlWord", c_ulong),
414 ("StatusWord", c_ulong),
415 ("TagWord", c_ulong),
416 ("ErrorOffset", c_ulong),
417 ("ErrorSelector", c_ulong),
418 ("DataOffset", c_ulong),
419 ("DataSelector", c_ulong),
420 ("RegisterSave", c_byte*80),
421 ("Cr0NpxState", c_ulong),
422 ]
423
424 -class CONTEXTx64(Structure):
425 _fields_ = [
426
427 ("P1Home",c_ulonglong),
428 ("P2Home",c_ulonglong),
429 ("P3Home",c_ulonglong),
430 ("P4Home",c_ulonglong),
431 ("P5Home",c_ulonglong),
432 ("P6Home",c_ulonglong),
433
434 ("ContextFlags", DWORD),
435 ("MxCsr",DWORD),
436
437 ("cs",WORD),
438 ("ds",WORD),
439 ("es",WORD),
440 ("fs", WORD),
441 ("gs",WORD),
442 ("ss",WORD),
443 ("eflags",DWORD),
444
445 ("debug0",c_ulonglong),
446 ("debug1",c_ulonglong),
447 ("debug2",c_ulonglong),
448 ("debug3",c_ulonglong),
449 ("debug6",c_ulonglong),
450 ("debug7",c_ulonglong),
451
452 ("rax",c_ulonglong),
453 ("rcx",c_ulonglong),
454 ("rdx",c_ulonglong),
455 ("rbx",c_ulonglong),
456 ("rsp",c_ulonglong),
457 ("rbp",c_ulonglong),
458 ("rsi",c_ulonglong),
459 ("rdi",c_ulonglong),
460 ("r8",c_ulonglong),
461 ("r9",c_ulonglong),
462 ("r10",c_ulonglong),
463 ("r11",c_ulonglong),
464 ("r12",c_ulonglong),
465 ("r13",c_ulonglong),
466 ("r14",c_ulonglong),
467 ("r15",c_ulonglong),
468 ("rip",c_ulonglong),
469
470 ("foo",c_ulonglong*200),
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504 ]
505
506 - def regPostProcess(self):
508
509
510 -class M128A(Structure):
511 _fields_ = [
512 ('Low', c_ulonglong),
513 ('High', c_ulonglong),
514 ]
515
517 _fields_ = [
518 ('Header', M128A * 2),
519 ('Legacy', M128A * 8),
520 ('_xmm0', M128A),
521 ('_xmm1', M128A),
522 ('_xmm2', M128A),
523 ('_xmm3', M128A),
524 ('_xmm4', M128A),
525 ('_xmm5', M128A),
526 ('_xmm6', M128A),
527 ('_xmm7', M128A),
528 ("Pad", c_byte * 224),
529 ]
530
531 -class CONTEXTx86(Structure):
532 _fields_ = [ ("ContextFlags", c_ulong),
533 ("debug0", c_ulong),
534 ("debug1", c_ulong),
535 ("debug2", c_ulong),
536 ("debug3", c_ulong),
537 ("debug6", c_ulong),
538 ("debug7", c_ulong),
539 ("FloatSave", FloatSavex86),
540 ("gs", c_ulong),
541 ("fs", c_ulong),
542 ("es", c_ulong),
543 ("ds", c_ulong),
544 ("edi", c_ulong),
545 ("esi", c_ulong),
546 ("ebx", c_ulong),
547 ("edx", c_ulong),
548 ("ecx", c_ulong),
549 ("eax", c_ulong),
550 ("ebp", c_ulong),
551 ("eip", c_ulong),
552 ("cs", c_ulong),
553 ("eflags", c_ulong),
554 ("esp", c_ulong),
555 ("ss", c_ulong),
556
557
558 ('Extension', ExtendedXmmx86),
559
560
561
562
563
564
565
566
567
568
569
570 ]
571
572 - def regPostProcess(self):
573 self.xmm0 = (self.Extension._xmm0.High << 8) + self.Extension._xmm0.Low
574 self.xmm1 = (self.Extension._xmm1.High << 8) + self.Extension._xmm1.Low
575 self.xmm2 = (self.Extension._xmm2.High << 8) + self.Extension._xmm2.Low
576 self.xmm3 = (self.Extension._xmm3.High << 8) + self.Extension._xmm3.Low
577 self.xmm4 = (self.Extension._xmm4.High << 8) + self.Extension._xmm4.Low
578 self.xmm5 = (self.Extension._xmm5.High << 8) + self.Extension._xmm5.Low
579 self.xmm6 = (self.Extension._xmm6.High << 8) + self.Extension._xmm6.Low
580 self.xmm7 = (self.Extension._xmm7.High << 8) + self.Extension._xmm7.Low
581
592
594 """
595 Passed into CreateProcess
596 """
597 _fields_ = [
598 ("db", c_ulong),
599 ("Reserved", c_char_p),
600 ("Desktop", c_char_p),
601 ("Title", c_char_p),
602 ("X", c_ulong),
603 ("Y", c_ulong),
604 ("XSize", c_ulong),
605 ("YSize", c_ulong),
606 ("XCountChars", c_ulong),
607 ("YCountChars", c_ulong),
608 ("FillAttribute", c_ulong),
609 ("Flags", c_ulong),
610 ("ShowWindow", c_ushort),
611 ("Reserved2", c_ushort),
612 ("Reserved3", LPVOID),
613 ("StdInput", c_ulong),
614 ("StdOutput", c_ulong),
615 ("StdError", c_ulong),
616 ]
617
625
627 _fields_ = [
628 ("SizeOfStruct", c_ulong),
629 ("TypeIndex", c_ulong),
630 ("Reserved1", c_ulonglong),
631 ("Reserved2", c_ulonglong),
632 ("Index", c_ulong),
633 ("Size", c_ulong),
634 ("ModBase", c_ulonglong),
635 ("Flags", c_ulong),
636 ("Value", c_ulonglong),
637 ("Address", c_ulonglong),
638 ("Register", c_ulong),
639 ("Scope", c_ulong),
640 ("Tag", c_ulong),
641 ("NameLen", c_ulong),
642 ("MaxNameLen", c_ulong),
643 ("Name", c_char * 2000),
644 ]
645
647 _fields_ = [
648 ("SizeOfStruct", c_ulong),
649 ("BaseOfImage", c_ulonglong),
650 ("ImageSize", c_ulong),
651 ("TimeDateStamp", c_ulong),
652 ("CheckSum", c_ulong),
653 ("NumSyms", c_ulong),
654 ("SymType", c_ulong),
655 ("ModuleName", c_char*32),
656 ("ImageName", c_char*256),
657 ("LoadedImageName", c_char*256),
658 ("LoadedPdbName", c_char*256),
659 ("CvSig", c_ulong),
660 ("CvData", c_char*(MAX_PATH*3)),
661 ("PdbSig", c_ulong),
662 ("PdbSig70", c_char * 16),
663 ("PdbAge", c_ulong),
664 ("PdbUnmatched", c_ulong),
665 ("DbgUnmatched", c_ulong),
666 ("LineNumbers", c_ulong),
667 ("GlobalSymbols", c_ulong),
668 ("TypeInfo", c_ulong),
669 ]
670
672 _fields_ = [
673 ('InstructionOffset', QWORD),
674 ('ReturnOffset', QWORD),
675 ('FrameOffset', QWORD),
676 ('StackOffset', QWORD),
677 ('BackingStoreOffset', QWORD),
678 ('FuncTableEntry', QWORD),
679 ('Params', QWORD*4),
680 ('Reserved', QWORD*5),
681 ('Virtual', BOOL),
682 ('Reserved2', DWORD),
683 ]
684
685 IMAGE_DIRECTORY_ENTRY_EXPORT =0
686 IMAGE_DIRECTORY_ENTRY_IMPORT =1
687 IMAGE_DIRECTORY_ENTRY_RESOURCE =2
688 IMAGE_DIRECTORY_ENTRY_EXCEPTION =3
689 IMAGE_DIRECTORY_ENTRY_SECURITY =4
690 IMAGE_DIRECTORY_ENTRY_BASERELOC =5
691 IMAGE_DIRECTORY_ENTRY_DEBUG =6
692 IMAGE_DIRECTORY_ENTRY_COPYRIGHT =7
693 IMAGE_DIRECTORY_ENTRY_ARCHITECTURE =7
694 IMAGE_DIRECTORY_ENTRY_GLOBALPTR =8
695 IMAGE_DIRECTORY_ENTRY_TLS =9
696 IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG =10
697 IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT =11
698 IMAGE_DIRECTORY_ENTRY_IAT =12
699 IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT =13
700 IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR =14
701
702 IMAGE_DEBUG_TYPE_UNKNOWN =0
703 IMAGE_DEBUG_TYPE_COFF =1
704 IMAGE_DEBUG_TYPE_CODEVIEW =2
705 IMAGE_DEBUG_TYPE_FPO =3
706 IMAGE_DEBUG_TYPE_MISC =4
707 IMAGE_DEBUG_TYPE_EXCEPTION =5
708 IMAGE_DEBUG_TYPE_FIXUP =6
709 IMAGE_DEBUG_TYPE_OMAP_TO_SRC =7
710 IMAGE_DEBUG_TYPE_OMAP_FROM_SRC =8
711 IMAGE_DEBUG_TYPE_BORLAND =9
712 IMAGE_DEBUG_TYPE_RESERVED10 =10
713 IMAGE_DEBUG_TYPE_CLSID =11
714
715 SSRVOPT_CALLBACK = 0x0001
716 SSRVOPT_DWORD = 0x0002
717 SSRVOPT_DWORDPTR = 0x0004
718 SSRVOPT_GUIDPTR = 0x0008
719 SSRVOPT_OLDGUIDPTR = 0x0010
720 SSRVOPT_UNATTENDED = 0x0020
721 SSRVOPT_NOCOPY = 0x0040
722 SSRVOPT_PARENTWIN = 0x0080
723 SSRVOPT_PARAMTYPE = 0x0100
724 SSRVOPT_SECURE = 0x0200
725 SSRVOPT_TRACE = 0x0400
726 SSRVOPT_SETCONTEXT = 0x0800
727 SSRVOPT_PROXY = 0x1000
728 SSRVOPT_DOWNSTREAM_STORE = 0x2000
729
730 TI_GET_SYMTAG = 0
731 TI_GET_SYMNAME = 1
732 TI_GET_LENGTH = 2
733 TI_GET_TYPE = 3
734 TI_GET_TYPEID = 4
735 TI_GET_BASETYPE = 5
736 TI_GET_ARRAYINDEXTYPEID = 6
737 TI_FINDCHILDREN = 7
738 TI_GET_DATAKIND = 8
739 TI_GET_ADDRESSOFFSET = 9
740 TI_GET_OFFSET = 10
741 TI_GET_VALUE = 11
742 TI_GET_COUNT = 12
743 TI_GET_CHILDRENCOUNT = 13
744 TI_GET_BITPOSITION = 14
745 TI_GET_VIRTUALBASECLASS = 15
746 TI_GET_VIRTUALTABLESHAPEID = 16
747 TI_GET_VIRTUALBASEPOINTEROFFSET = 17
748 TI_GET_CLASSPARENTID = 18
749 TI_GET_NESTED = 19
750 TI_GET_SYMINDEX = 20
751 TI_GET_LEXICALPARENT = 21
752 TI_GET_ADDRESS = 22
753 TI_GET_THISADJUST = 23
754 TI_GET_UDTKIND = 24
755 TI_IS_EQUIV_TO = 25
756 TI_GET_CALLING_CONVENTION = 26
757
758 SymTagNull = 0
759 SymTagExe = 1
760 SymTagCompiland = 2
761 SymTagCompilandDetails = 3
762 SymTagCompilandEnv = 4
763 SymTagFunction = 5
764 SymTagBlock = 6
765 SymTagData = 7
766 SymTagAnnotation = 8
767 SymTagLabel = 9
768 SymTagPublicSymbol = 10
769 SymTagUDT = 11
770 SymTagEnum = 12
771 SymTagFunctionType = 13
772 SymTagPointerType = 14
773 SymTagArrayType = 15
774 SymTagBaseType = 16
775 SymTagTypedef = 17
776 SymTagBaseClass = 18
777 SymTagFriend = 19
778 SymTagFunctionArgType = 20
779 SymTagFuncDebugStart = 21
780 SymTagFuncDebugEnd = 22
781 SymTagUsingNamespace = 23
782 SymTagVTableShape = 24
783 SymTagVTable = 25
784 SymTagCustom = 26
785 SymTagThunk = 27
786 SymTagCustomType = 28
787 SymTagManagedType = 29
788 SymTagDimension = 30
789 SymTagMax = 31
792 _fields_ = [
793 ("Characteristics", c_ulong),
794 ("TimeDateStamp", c_ulong),
795 ("MajorVersion", c_ushort),
796 ("MinorVersion", c_ushort),
797 ("Type", c_ulong),
798 ("SizeOfData", c_ulong),
799 ("AddressOfRawData", c_ulong),
800 ("PointerToRawData", c_ulong),
801 ]
802
803 NT_LIST_HANDLES = 16
804
805 ACCESS_MASK = DWORD
807 _fields_ = [
808 ('ProcessID' , c_ulong),
809 ('HandleType' , c_byte),
810 ('Flags' , c_byte),
811 ('HandleNumber' , c_ushort),
812 ('KernelAddress' , LPVOID),
813 ('GrantedAccess' , ACCESS_MASK),
814 ]
815 PSYSTEM_HANDLE = POINTER(SYSTEM_HANDLE)
816
817
818 ObjectBasicInformation = 0
819 ObjectNameInformation = 1
820 ObjectTypeInformation = 2
821 ObjectAllTypesInformation = 3
822 ObjectHandleInformation = 4
823
824
825 ProcessBasicInformation = 0
826 ProcessDebugPort = 7
827 ProcessWow64Information = 26
828
829 ProcessImageFileName = 27
830 ProcessExecuteFlags = 34
833 _fields_ = (
834 ("Length",c_ushort),
835 ("MaximumLength", c_ushort),
836 ("Buffer", c_wchar_p)
837 )
838 PUNICODE_STRING = POINTER(UNICODE_STRING)
845
846 object_type_map = {
847 "File":vtrace.FD_FILE,
848 "Directory":vtrace.FD_FILE,
849 "Event":vtrace.FD_EVENT,
850 "KeyedEvent":vtrace.FD_EVENT,
851 "Mutant":vtrace.FD_LOCK,
852 "Semaphore":vtrace.FD_LOCK,
853 "Key":vtrace.FD_REGKEY,
854 "Port":vtrace.FD_UNKNOWN,
855 "Section":vtrace.FD_UNKNOWN,
856 "IoCompletion":vtrace.FD_UNKNOWN,
857 "Desktop":vtrace.FD_UNKNOWN,
858 "WindowStation":vtrace.FD_UNKNOWN,
859 }
860
861 -class LUID(Structure):
862 _fields_ = (
863 ("LowPart", c_ulong),
864 ("HighPart", c_ulong)
865 )
866
868
869 _fields_ = (
870 ("PrivilegeCount", c_ulong),
871 ("Privilege", LUID),
872 ("PrivilegeAttribute", c_ulong)
873 )
874
875
876
877 if sys.platform == "win32":
878
879 kernel32 = windll.kernel32
880
881 kernel32.OpenProcess.argtypes = [DWORD, BOOL, DWORD]
882 kernel32.OpenProcess.restype = HANDLE
883 kernel32.CreateProcessA.argtypes = [LPVOID, c_char_p, LPVOID, LPVOID, c_uint, DWORD, LPVOID, LPVOID, LPVOID, LPVOID]
884 kernel32.ReadProcessMemory.argtypes = [HANDLE, LPVOID, LPVOID, SIZE_T, LPVOID]
885 kernel32.WriteProcessMemory.argtypes = [HANDLE, LPVOID, c_char_p, SIZE_T, LPVOID]
886 kernel32.GetThreadContext.argtypes = [HANDLE, LPVOID]
887 kernel32.SetThreadContext.argtypes = [HANDLE, LPVOID]
888 kernel32.CreateRemoteThread.argtypes = [HANDLE, LPVOID, SIZE_T, LPVOID, LPVOID, DWORD, LPVOID]
889 kernel32.SuspendThread.argtypes = [HANDLE,]
890 kernel32.ResumeThread.argtypes = [HANDLE,]
891 kernel32.VirtualQueryEx.argtypes = [HANDLE, LPVOID, LPVOID, SIZE_T]
892 kernel32.DebugBreakProcess.argtypes = [HANDLE,]
893 kernel32.CloseHandle.argtypes = [HANDLE,]
894 kernel32.GetLogicalDriveStringsA.argtypes = [DWORD, LPVOID]
895 kernel32.TerminateProcess.argtypes = [HANDLE, DWORD]
896 kernel32.VirtualProtectEx.argtypes = [HANDLE, LPVOID, SIZE_T, DWORD, LPVOID]
897 kernel32.VirtualAllocEx.argtypes = [HANDLE, LPVOID, SIZE_T, DWORD, DWORD]
898 kernel32.VirtualFreeEx.argtypes = [HANDLE, LPVOID, SIZE_T, DWORD]
899 kernel32.DuplicateHandle.argtypes = [HANDLE, HANDLE, HANDLE, LPVOID, DWORD, DWORD, DWORD]
900 kernel32.SetEvent.argtypes = [HANDLE, ]
901
902 IsWow64Process = getattr(kernel32, 'IsWow64Process', None)
903 if IsWow64Process != None:
904 IsWow64Process.argtypes = [HANDLE, LPVOID]
905
906
907
908 psapi = windll.psapi
909 psapi.GetModuleFileNameExW.argtypes = [HANDLE, HANDLE, LPVOID, DWORD]
910 psapi.GetMappedFileNameW.argtypes = [HANDLE, LPVOID, LPVOID, DWORD]
911
912 ntdll = windll.ntdll
913 ntdll.NtQuerySystemInformation.argtypes = [DWORD, LPVOID, DWORD, LPVOID]
914 ntdll.NtQueryObject.argtypes = [HANDLE, DWORD, c_void_p, DWORD, LPVOID]
915 ntdll.NtQueryInformationProcess.argtypes = [HANDLE, DWORD, c_void_p, DWORD, LPVOID]
916 ntdll.NtSystemDebugControl.restype = SIZE_T
917
918
919 try:
920
921 SYMCALLBACK = WINFUNCTYPE(BOOL, POINTER(SYMBOL_INFO), c_ulong, LPVOID)
922 PDBCALLBACK = WINFUNCTYPE(BOOL, c_char_p, LPVOID)
923
924 arch_name = envi.getCurrentArch()
925 symsrv = windll.LoadLibrary(os.path.join(platdir, "windll", arch_name, "symsrv.dll"))
926 dbghelp = windll.LoadLibrary(os.path.join(platdir, "windll", arch_name, "dbghelp.dll"))
927 dbghelp.SymInitialize.argtypes = [HANDLE, c_char_p, BOOL]
928 dbghelp.SymInitialize.restype = BOOL
929 dbghelp.SymSetOptions.argtypes = [DWORD]
930 dbghelp.SymSetOptions.restype = DWORD
931 dbghelp.SymCleanup.argtypes = [HANDLE]
932 dbghelp.SymCleanup.restype = BOOL
933 dbghelp.SymLoadModule64.argtypes = [HANDLE, HANDLE, c_char_p, c_char_p, QWORD, DWORD]
934 dbghelp.SymLoadModule64.restype = QWORD
935 dbghelp.SymGetModuleInfo64.argtypes = [HANDLE, QWORD, POINTER(IMAGEHLP_MODULE64)]
936 dbghelp.SymSetContext.restype = BOOL
937 dbghelp.SymSetContext.argtypes = [ HANDLE, POINTER(IMAGEHLP_STACK_FRAME), LPVOID ]
938 dbghelp.SymGetModuleInfo64.restype = BOOL
939 dbghelp.SymEnumSymbols.argtypes = [HANDLE, QWORD, c_char_p, SYMCALLBACK, LPVOID]
940 dbghelp.SymEnumSymbols.restype = BOOL
941 dbghelp.SymEnumTypes.argtypes = [HANDLE, QWORD, SYMCALLBACK, LPVOID]
942 dbghelp.SymEnumTypes.restype = BOOL
943 dbghelp.SymGetTypeInfo.argtypes = [HANDLE, QWORD, DWORD, DWORD, c_void_p]
944 dbghelp.SymGetTypeInfo.restype = BOOL
945 dbghelp.SymFromAddr.argtypes = [HANDLE, QWORD, POINTER(QWORD), POINTER(SYMBOL_INFO) ]
946
947 except Exception, e:
948 print "WARNING: Failed to import dbghelp/symsrv: %s" % e
949
950 advapi32 = windll.advapi32
951 advapi32.LookupPrivilegeValueA.argtypes = [LPVOID, c_char_p, LPVOID]
952 advapi32.OpenProcessToken.argtypes = [HANDLE, DWORD, HANDLE]
953 advapi32.AdjustTokenPrivileges.argtypes = [HANDLE, DWORD, LPVOID, DWORD, LPVOID, LPVOID]
954 advapi32.OpenSCManagerA.argtypes = [ LPVOID, LPVOID, DWORD ]
955 advapi32.OpenSCManagerA.restype = HANDLE
956 advapi32.EnumServicesStatusExW.argtypes = [ HANDLE,
957 LPVOID,
958 DWORD,
959 DWORD,
960 LPVOID,
961 DWORD,
962 LPVOID,
963 LPVOID,
964 LPVOID,
965 LPVOID ]
966 advapi32.EnumServicesStatusExW.restype = BOOL
967 advapi32.CloseServiceHandle.argtypes = [ HANDLE, ]
968 advapi32.CloseServiceHandle.restype = BOOL
969 advapi32.GetTokenInformation.argtypes = [HANDLE, DWORD, LPVOID, DWORD, LPVOID]
970 advapi32.GetTokenInformation.restype = BOOL
974 '''
975 Get a list of (pid, servicename, displayname) tuples for the
976 currently running services.
977 '''
978
979 ret = []
980 scmh = advapi32.OpenSCManagerA(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE)
981
982 try:
983 dwSvcSize = DWORD(0)
984 dwSvcCount = DWORD(0)
985
986 advapi32.EnumServicesStatusExW( scmh,
987 SC_ENUM_PROCESS_INFO,
988 SERVICE_WIN32,
989 SERVICE_ACTIVE,
990 NULL,
991 0,
992 addressof(dwSvcSize),
993 addressof(dwSvcCount),
994 NULL,
995 NULL)
996
997 buf = create_string_buffer(dwSvcSize.value)
998
999
1000
1001
1002 advapi32.EnumServicesStatusExW( scmh,
1003 SC_ENUM_PROCESS_INFO,
1004 SERVICE_WIN32,
1005 SERVICE_ACTIVE,
1006 addressof(buf),
1007 dwSvcSize.value,
1008 addressof(dwSvcSize),
1009 addressof(dwSvcCount),
1010 NULL,
1011 NULL)
1012
1013
1014 p = cast(buf, POINTER(ENUM_SERVICE_STATUS_PROCESS))
1015
1016 for i in xrange(dwSvcCount.value):
1017 pid = p[i].ServiceStatusProcess.dwProcessId
1018 name = p[i].lpServiceName
1019 descr = p[i].lpDisplayName
1020 ret.append((pid, name, descr))
1021
1022 finally:
1023 advapi32.CloseServiceHandle(scmh)
1024
1025 return ret
1026
1027 x = '''
1028 BOOL WINAPI EnumServicesStatusEx(
1029 __in SC_HANDLE hSCManager,
1030 __in SC_ENUM_TYPE InfoLevel,
1031 __in DWORD dwServiceType,
1032 __in DWORD dwServiceState,
1033 __out_opt LPBYTE lpServices,
1034 __in DWORD cbBufSize,
1035 __out LPDWORD pcbBytesNeeded,
1036 __out LPDWORD lpServicesReturned,
1037 __inout_opt LPDWORD lpResumeHandle,
1038 __in_opt LPCTSTR pszGroupName
1039 );
1040 '''
1041
1042 SE_PRIVILEGE_ENABLED = 0x00000002
1043 TOKEN_ADJUST_PRIVILEGES = 0x00000020
1044 TOKEN_QUERY = 0x00000008
1045 dbgprivdone = False
1046
1047
1048 TokenUser = 1
1049 TokenGroups = 2
1050 TokenPrivileges = 3
1051 TokenOwner = 4
1052 TokenPrimaryGroup = 5
1053 TokenDefaultDacl = 6
1054 TokenSource = 7
1055 TokenType = 8
1056 TokenImpersonationLevel = 9
1057 TokenStatistics = 10
1058 TokenRestrictedSids = 11
1059 TokenSessionId = 12
1060 TokenGroupsAndPrivileges = 13
1061 TokenSessionReference = 14
1062 TokenSandBoxInert = 15
1063 TokenAuditPolicy = 16
1064 TokenOrigin = 17
1065 TokenElevationType = 18
1066 TokenLinkedToken = 19
1067 TokenElevation = 20
1068 TokenHasRestrictions = 21
1069 TokenAccessInformation = 22
1070 TokenVirtualizationAllowed = 23
1071 TokenVirtualizationEnabled = 24
1072 TokenIntegrityLevel = 25
1073 TokenUIAccess = 26
1074 TokenMandatoryPolicy = 27
1075 TokenLogonSid = 28
1076 MaxTokenInfoClass = 29
1077
1078
1079 TokenElevationTypeDefault = 1
1080 TokenElevationTypeFull = 2
1081 TokenElevationTypeLimited = 3
1084
1085 token = HANDLE(0)
1086 etype = DWORD(0)
1087 outsize = DWORD(0)
1088 if not advapi32.OpenProcessToken(handle, TOKEN_QUERY, addressof(token)):
1089 raise Exception('Invalid Process Handle: %d' % handle)
1090
1091 advapi32.GetTokenInformation(token, TokenElevationType, addressof(etype), 4, addressof(outsize))
1092
1093 return etype.value
1094
1095 if __name__ == '__main__':
1096 print getTokenElevationType()
1121
1129 return SYSTEM_HANDLE_INFORMATION()
1130
1132 class TI_FINDCHILDREN_PARAMS(Structure):
1133 _fields_ = [ ('Count', c_ulong), ('Start', c_ulong), ("Children",c_ulong * count),]
1134 tif = TI_FINDCHILDREN_PARAMS()
1135 tif.Count = count
1136 return tif
1137
1140
1142
1143 buf = create_unicode_buffer(1024)
1144 psapi.GetModuleFileNameExW(phandle, mhandle, addressof(buf), 1024)
1145 return buf.value
1146
1147 av_einfo_perms = [e_mem.MM_READ, e_mem.MM_WRITE, None, None, None, None, None, None, e_mem.MM_EXEC]
1150
1151 """
1152 A mixin to handle all non-arch specific win32 stuff.
1153 """
1154
1156
1157 self.casesens = False
1158
1159 self.phandle = None
1160 self.thandles = {}
1161 self.win32threads = {}
1162 self.dosdevs = []
1163 self.flushcache = False
1164 self.faultaddr = None
1165 global dbgprivdone
1166 if not dbgprivdone:
1167 dbgprivdone = getDebugPrivileges()
1168
1169 self._is_wow64 = False
1170 self._step_suspends = set()
1171
1172
1173
1174 self.enableAutoContinue(vtrace.NOTIFY_ATTACH)
1175
1176 self.setupDosDeviceMaps()
1177
1178
1179 self.setMeta('Format','pe')
1180
1181
1182 rel,ver,csd,ptype = platform.win32_ver()
1183 self.setMeta("WindowsRelease",rel)
1184 self.setMeta("WindowsVersion", ver)
1185 self.setMeta("WindowsCsd", csd)
1186 self.setMeta("WindowsProcessorType", ptype)
1187
1188
1189 self.initMode('BlockStep', False, 'Single step to branch entry points')
1190
1191
1192
1193 nt = vs_windows.getCurrentDef('ntdll')
1194 if nt != None:
1195 self.vsbuilder.addVStructNamespace('ntdll', nt)
1196
1197
1198 self.vsbuilder.addVStructNamespace('win32', vs_win32)
1199
1200
1201 self.fireTracerThread()
1202
1220
1223
1225 """
1226 Duplicate the handle (who's id is in the currently attached
1227 target process) and return our own copy.
1228 """
1229 hret = c_uint(0)
1230 kernel32.DuplicateHandle(self.phandle, handle,
1231 kernel32.GetCurrentProcess(), addressof(hret),
1232 0, False, 2)
1233 return hret.value
1234
1236
1237 retSiz = c_uint(0)
1238 buf = create_string_buffer(100)
1239
1240
1241 if wait:
1242 if kernel32.WaitForSingleObject(handle, 150) == EXCEPTION_TIMEOUT:
1243 return "_TIMEOUT_"
1244
1245 x = ntdll.NtQueryObject(handle, itype,
1246 buf, sizeof(buf), addressof(retSiz))
1247 if x != 0:
1248 return 'Error 0x%.8x' % (e_bits.unsigned(x, self.psize))
1249
1250 realbuf = create_string_buffer(retSiz.value)
1251
1252 if ntdll.NtQueryObject(handle, itype,
1253 realbuf, sizeof(realbuf), addressof(retSiz)) == 0:
1254
1255 uString = cast(realbuf, PUNICODE_STRING).contents
1256 return uString.Buffer
1257 return "Unknown"
1258
1273
1274
1276 self.dosdevs = []
1277 dname = (c_char * 512)()
1278 size = kernel32.GetLogicalDriveStringsA(512, addressof(dname))
1279 devs = dname.raw[:size-1].split("\x00")
1280 for dev in devs:
1281 dosname = "%s:" % dev[0]
1282 kernel32.QueryDosDeviceA("%s:" % dev[0], pointer(dname), 512)
1283 self.dosdevs.append( (dosname, dname.value) )
1284
1287
1288 @v_base.threadwrap
1304
1314
1315 @v_base.threadwrap
1319
1320 @v_base.threadwrap
1333
1340
1348
1356
1357 @v_base.threadwrap
1367
1381
1382 @v_base.threadwrap
1415
1423
1428
1454
1455 @v_base.threadwrap
1461
1464
1613
1614
1615
1616
1618 self.requireAttached()
1619 fname = (c_wchar * 512)()
1620 x = psapi.GetMappedFileNameW(self.phandle, address, addressof(fname), 512)
1621 if not x:
1622 return ""
1623 name = fname.value
1624 for dosname, devname in self.dosdevs:
1625 if name.startswith(devname):
1626 return name.replace(devname, dosname)
1627 return name
1628
1649
1652
1656
1660
1666
1674
1676 pe = PE.peFromMemoryObject(self, baseaddr)
1677 for rva, ord, name in pe.getExports():
1678 self.addSymbol(e_resolv.Symbol(name, baseaddr+rva, 0, normname))
1679
1680 @v_base.threadwrap
1696
1697 @v_base.threadwrap
1713
1715 '''
1716 Expose the getServicesList via the trace for remote...
1717 '''
1718 return getServicesList()
1719
1722
1723
1724
1725 -class Windowsi386Trace(
1726 vtrace.Trace,
1727 WindowsMixin,
1728 v_i386.i386Mixin,
1729 v_base.TracerBase,
1730 ):
1745
1746 -class WindowsAmd64Trace(
1747 vtrace.Trace,
1748 WindowsMixin,
1749 v_amd64.Amd64Mixin,
1750 v_base.TracerBase,
1751 ):
1763
1764 reserved = {
1765 'None': True,
1766 'True': True,
1767 'False': True,
1768 }
1769
1770 VT_EMPTY = 0
1771 VT_NULL = 1
1772 VT_I2 = 2
1773 VT_I4 = 3
1774 VT_R4 = 4
1775 VT_R8 = 5
1776 VT_CY = 6
1777 VT_DATE = 7
1778 VT_BSTR = 8
1779 VT_DISPATCH = 9
1780 VT_ERROR = 10
1781 VT_BOOL = 11
1782 VT_VARIANT = 12
1783 VT_UNKNOWN = 13
1784 VT_I1 = 16
1785 VT_UI1 = 17
1786 VT_UI2 = 18
1787 VT_UI4 = 19
1788 VT_INT = 20
1789 VT_UINT = 21
1792 _fields_ = [
1793 ('ui1', c_uint8),
1794 ('ui2', c_uint16),
1795 ('ui4', c_uint32),
1796 ('i1', c_int8),
1797 ('i2', c_int16),
1798 ('i4', c_int32),
1799 ('pad', BYTE*32),
1800 ]
1801
1803 _fields_ = [
1804 ('vt', WORD),
1805 ('res1', WORD),
1806 ('res2', WORD),
1807 ('res3', WORD),
1808 ('u', VARIANT_guts),
1809 ]
1810
1812
1813 - def __init__(self, phandle, filename, loadbase, sympath=None):
1814 self.phandle = phandle
1815 self.filename = filename
1816 self.loadbase = loadbase
1817 self.sympath = sympath
1818 self.symbols = []
1819 self.symopts = (SYMOPT_UNDNAME | SYMOPT_NO_PROMPTS | SYMOPT_NO_CPP)
1820 self._sym_types = {}
1821 self._sym_enums = {}
1822 self._sym_locals = {}
1823
1825
1826 for n,t in info.__class__._fields_:
1827 print n,repr(getattr(info, n))
1828
1830 x = dbghelp.SymGetTypeInfo(self.phandle, self.loadbase,
1831 tindex, tinfo, tparam)
1832 if x == 0:
1833 return False
1834 return True
1835
1837 n = c_wchar_p()
1838 self.symGetTypeInfo(typeid, TI_GET_SYMNAME, pointer(n))
1839 val = n.value
1840
1841 if val != None:
1842 val = val.strip('_')
1843 if val == '<unnamed-tag>' or val == 'unnamed':
1844 val = '_unnamed_%d' % typeid
1845
1846 return val
1847
1852
1857
1862
1867
1884
1891
1896
1901
1903
1904 if kidname and kidname[0].isdigit():
1905 kidname = '_%s' % kidname
1906
1907 if reserved.get(kidname):
1908 kidname = '_%s' % kidname
1909
1910 return kidname
1911
1922
1978
1988
2004
2013
2015 si = SYMBOL_INFO()
2016 si.SizeOfStruct = sizeof(si) - 2000
2017 si.MaxNameLen = 2000
2018 disp = QWORD()
2019 dbghelp.SymFromAddr(self.phandle, address, pointer(disp), pointer(si))
2020 return si
2021
2023
2024 dbghelp.SymInitialize(self.phandle, self.sympath, False)
2025 dbghelp.SymSetOptions(self.symopts)
2026
2027 x = dbghelp.SymLoadModule64(self.phandle,
2028 0,
2029 self.filename,
2030 None,
2031 self.loadbase,
2032 os.path.getsize(self.filename))
2033
2034
2035
2036
2037
2038
2039
2040
2042 dbghelp.SymCleanup(self.phandle)
2043
2050
2072
2092
2100
2101
2102
2104
2105 funcflags = (SYMFLAG_FUNCTION | SYMFLAG_EXPORT)
2106
2107 for name, addr, size, flags in self.symbols:
2108 symclass = e_resolv.Symbol
2109 if flags & funcflags:
2110 symclass = e_resolv.FunctionSymbol
2111 sym = symclass(name, addr, size, normname)
2112 trace.addSymbol(sym)
2113
2114 t = self._sym_types.values()
2115 e = self._sym_enums.values()
2116
2117
2118 if len(t):
2119 builder = vs_builder.VStructBuilder(defs=t, enums=e)
2120 trace.vsbuilder.addVStructNamespace(normname, builder)
2121