-
Notifications
You must be signed in to change notification settings - Fork 141
/
Copy pathgo_parser.py
56 lines (44 loc) · 1.46 KB
/
go_parser.py
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
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
go_parser.py:
IDA Plugin for Golang Executable file parsing.
'''
__author__ = "JiaYu"
__license__ = "MIT"
__version__ = "1.0"
__email__ = ["[email protected]"]
import idautils, idc, idaapi
import sys
sys.setrecursionlimit(10000)
idaapi.require("common")
idaapi.require("strings")
idaapi.require("pclntbl")
idaapi.require("moduledata")
idaapi.require("types_builder")
idaapi.require("itab")
def main():
# find and parsefirfst moduledata
firstmoddata_addr, magic_number = moduledata.find_first_moduledata_addr()
common._debug("Parsing firstmoduledata object...")
firstmoddata = moduledata.ModuleData(firstmoddata_addr, magic_number)
firstmoddata.parse()
# parse pclntab(functions/srcfiles and function pointers)
common._debug("Parsing pcln table...")
if magic_number == common.MAGIC_112:
pclntab = pclntbl.Pclntbl(firstmoddata.pclntbl_addr, magic_number)
else:
pclntab = pclntbl.Pclntbl(firstmoddata.pcheader_addr, magic_number)
pclntab.parse()
common.get_goversion()
common._info(f"pclntbl addr: {firstmoddata.pclntbl_addr:#x}\n")
# parse strings
parse_str_cnt = strings.parse_strings()
common._info(f"Parsed [{parse_str_cnt}] strings\n")
# parse data types
type_parser = types_builder.TypesParser(firstmoddata)
type_parser.build_all_types()
# parse itabs
itab.parse_itab(firstmoddata, type_parser)
if __name__ == '__main__':
main()