File size: 4,197 Bytes
8df6da4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# Invocation: gdb -x gdb-extract-def

# extract-state /path/to/foo.bin /path/to/foo.fixture
define extract-state
  file $arg0

  # Disables logging to stdout - only log to file
  set logging redirect on

  set logging file $arg1
  set logging overwrite on
  set logging on

  run

  printf "---BEGIN JSON---\n"
  printf "[\n"
  printf "    %d,\n", $eax
  printf "    %d,\n", $ecx
  printf "    %d,\n", $edx
  printf "    %d,\n", $ebx
  printf "    %d,\n", $esp
  printf "    %d,\n", $ebp
  printf "    %d,\n", $esi
  printf "    %d,\n", $edi
  printf "\n"

  printf "    %d,\n", $eip
  printf "\n"

  # For fpu registers, check the tag register first. If the tag index is
  # invalid and you try to access to corresponding register, gdb exits with an
  # error.
  set $top = $fstat >> 11 & 7
  if ($ftag >> (2 * (($top + 0) & 7)) & 3) != 2
    printf "    %.100e,\n", $st0
  else
    printf "    \"invalid\",\n"
  end
  if ($ftag >> (2 * (($top + 1) & 7)) & 3) != 2
    printf "    %.100e,\n", $st1
  else
    printf "    \"invalid\",\n"
  end
  if ($ftag >> (2 * (($top + 2) & 7)) & 3) != 2
    printf "    %.100e,\n", $st2
  else
    printf "    \"invalid\",\n"
  end
  if ($ftag >> (2 * (($top + 3) & 7)) & 3) != 2
    printf "    %.100e,\n", $st3
  else
    printf "    \"invalid\",\n"
  end
  if ($ftag >> (2 * (($top + 4) & 7)) & 3) != 2
    printf "    %.100e,\n", $st4
  else
    printf "    \"invalid\",\n"
  end
  if ($ftag >> (2 * (($top + 5) & 7)) & 3) != 2
    printf "    %.100e,\n", $st5
  else
    printf "    \"invalid\",\n"
  end
  if ($ftag >> (2 * (($top + 6) & 7)) & 3) != 2
    printf "    %.100e,\n", $st6
  else
    printf "    \"invalid\",\n"
  end
  if ($ftag >> (2 * (($top + 7) & 7)) & 3) != 2
    printf "    %.100e,\n", $st7
  else
    printf "    \"invalid\",\n"
  end
  printf "\n"

  printf "    %d,\n", $mm0.v2_int32[0]
  printf "    %d,\n", $mm0.v2_int32[1]
  printf "    %d,\n", $mm1.v2_int32[0]
  printf "    %d,\n", $mm1.v2_int32[1]
  printf "    %d,\n", $mm2.v2_int32[0]
  printf "    %d,\n", $mm2.v2_int32[1]
  printf "    %d,\n", $mm3.v2_int32[0]
  printf "    %d,\n", $mm3.v2_int32[1]
  printf "    %d,\n", $mm4.v2_int32[0]
  printf "    %d,\n", $mm4.v2_int32[1]
  printf "    %d,\n", $mm5.v2_int32[0]
  printf "    %d,\n", $mm5.v2_int32[1]
  printf "    %d,\n", $mm6.v2_int32[0]
  printf "    %d,\n", $mm6.v2_int32[1]
  printf "    %d,\n", $mm7.v2_int32[0]
  printf "    %d,\n", $mm7.v2_int32[1]
  printf "\n"

  printf "    %d,\n", $xmm0.v4_int32[0]
  printf "    %d,\n", $xmm0.v4_int32[1]
  printf "    %d,\n", $xmm0.v4_int32[2]
  printf "    %d,\n", $xmm0.v4_int32[3]
  printf "    %d,\n", $xmm1.v4_int32[0]
  printf "    %d,\n", $xmm1.v4_int32[1]
  printf "    %d,\n", $xmm1.v4_int32[2]
  printf "    %d,\n", $xmm1.v4_int32[3]
  printf "    %d,\n", $xmm2.v4_int32[0]
  printf "    %d,\n", $xmm2.v4_int32[1]
  printf "    %d,\n", $xmm2.v4_int32[2]
  printf "    %d,\n", $xmm2.v4_int32[3]
  printf "    %d,\n", $xmm3.v4_int32[0]
  printf "    %d,\n", $xmm3.v4_int32[1]
  printf "    %d,\n", $xmm3.v4_int32[2]
  printf "    %d,\n", $xmm3.v4_int32[3]
  printf "    %d,\n", $xmm4.v4_int32[0]
  printf "    %d,\n", $xmm4.v4_int32[1]
  printf "    %d,\n", $xmm4.v4_int32[2]
  printf "    %d,\n", $xmm4.v4_int32[3]
  printf "    %d,\n", $xmm5.v4_int32[0]
  printf "    %d,\n", $xmm5.v4_int32[1]
  printf "    %d,\n", $xmm5.v4_int32[2]
  printf "    %d,\n", $xmm5.v4_int32[3]
  printf "    %d,\n", $xmm6.v4_int32[0]
  printf "    %d,\n", $xmm6.v4_int32[1]
  printf "    %d,\n", $xmm6.v4_int32[2]
  printf "    %d,\n", $xmm6.v4_int32[3]
  printf "    %d,\n", $xmm7.v4_int32[0]
  printf "    %d,\n", $xmm7.v4_int32[1]
  printf "    %d,\n", $xmm7.v4_int32[2]
  printf "    %d,\n", $xmm7.v4_int32[3]
  printf "\n"


  set $addr=0x100000
  while($addr < 0x102000)
     printf "    %d, %d, %d, %d, %d, %d, %d, %d,\n", *(int*)($addr+0), *(int*)($addr+4), *(int*)($addr+8), *(int*)($addr+12), *(int*)($addr+16), *(int*)($addr+20), *(int*)($addr+24), *(int*)($addr+28)
     set $addr=$addr+32
  end
  printf "\n"

  printf "    %d,\n", $eflags
  printf "    %d,\n", $ftag
  printf "    %d\n", $fstat

  printf "]\n"
  printf "---END JSON---\n"

  set logging off

end