1414import golanganalyzerextension .function .FileLine ;
1515import golanganalyzerextension .function .GolangFunction ;
1616import golanganalyzerextension .gobinary .GolangBinary ;
17+ import golanganalyzerextension .gobinary .exceptions .BinaryAccessException ;
1718import golanganalyzerextension .log .Logger ;
1819import golanganalyzerextension .service .GolangAnalyzerExtensionService ;
1920
@@ -102,39 +103,42 @@ private boolean init_file_name_list() {
102103 }
103104
104105 int pointer_size =go_bin .get_pointer_size ();
105- Address gopclntab_base =go_bin .get_gopclntab_base ();
106- func_num =go_bin .get_address_value (gopclntab_base , 8 , pointer_size );
107- file_name_list =new ArrayList <>();
108- if (is_go116 ) {
109- return true ;
110- }
111- Address func_list_base =go_bin .get_address (gopclntab_base , 8 +pointer_size );
112- if (func_list_base ==null ) {
106+ Address gopclntab_base =go_bin .get_gopclntab_base ().orElse (null );
107+ if (gopclntab_base ==null ) {
113108 return false ;
114109 }
115110
116- long file_name_table_offset =go_bin .get_address_value (func_list_base , func_num *pointer_size *2 +pointer_size , pointer_size );
117- Address file_name_table =go_bin .get_address (gopclntab_base , file_name_table_offset );
118- long file_name_table_size =go_bin .get_address_value (file_name_table , 4 );
119- if (file_name_table ==null || file_name_table_size ==0 ) {
120- return false ;
121- }
111+ try {
112+ func_num =go_bin .get_address_value (gopclntab_base , 8 , pointer_size );
113+ file_name_list =new ArrayList <>();
114+ if (is_go116 ) {
115+ return true ;
116+ }
117+ Address func_list_base =go_bin .get_address (gopclntab_base , 8 +pointer_size );
122118
123- for (int i =1 ;i <file_name_table_size ;i ++) {
124- long file_name_offset =go_bin .get_address_value (file_name_table , 4 *i ,4 );
125- if (file_name_offset ==0 ) {
119+ long file_name_table_offset =go_bin .get_address_value (func_list_base , func_num *pointer_size *2 +pointer_size , pointer_size );
120+ Address file_name_table =go_bin .get_address (gopclntab_base , file_name_table_offset );
121+ long file_name_table_size =go_bin .get_address_value (file_name_table , 4 );
122+ if (file_name_table_size ==0 ) {
126123 return false ;
127124 }
128- Address file_name_addr =go_bin .get_address (gopclntab_base , file_name_offset );
129- if (file_name_addr ==null ) {
130- return false ;
125+
126+ for (int i =1 ;i <file_name_table_size ;i ++) {
127+ long file_name_offset =go_bin .get_address_value (file_name_table , 4 *i ,4 );
128+ if (file_name_offset ==0 ) {
129+ return false ;
130+ }
131+ Address file_name_addr =go_bin .get_address (gopclntab_base , file_name_offset );
132+ file_name_list .add (go_bin .create_string_data (file_name_addr ).orElse (String .format ("not_found_%x" , file_name_addr .getOffset ())));
131133 }
132- file_name_list .add (go_bin .create_string_data (file_name_addr ).orElse (String .format ("not_found_%x" , file_name_addr .getOffset ())));
133- }
134134
135- service .store_filename_list (file_name_list );
135+ service .store_filename_list (file_name_list );
136136
137- return true ;
137+ return true ;
138+ } catch (BinaryAccessException e ) {
139+ Logger .append_message (String .format ("Failed to init file name list: pcheader_addr=%s, message=%s" , gopclntab_base , e .getMessage ()));
140+ return false ;
141+ }
138142 }
139143
140144 private boolean init_functions () {
@@ -148,38 +152,54 @@ private boolean init_functions() {
148152 }
149153
150154 int pointer_size =go_bin .get_pointer_size ();
151- Address gopclntab_base =go_bin .get_gopclntab_base ();
152- gofunc_list =new ArrayList <>();
153- Address func_list_base =null ;
154- if (is_go118 ) {
155- func_list_base =go_bin .get_address (gopclntab_base , go_bin .get_address_value (gopclntab_base , 8 +pointer_size *7 , pointer_size ));
156- }else if (is_go116 ) {
157- func_list_base =go_bin .get_address (gopclntab_base , go_bin .get_address_value (gopclntab_base , 8 +pointer_size *6 , pointer_size ));
158- }else {
159- func_list_base =go_bin .get_address (gopclntab_base , 8 +pointer_size );
160- }
161- if (func_list_base ==null ) {
155+ Address gopclntab_base =go_bin .get_gopclntab_base ().orElse (null );
156+ if (gopclntab_base ==null ) {
162157 return false ;
163158 }
164159
165- for (int i =0 ; i <func_num ; i ++) {
166- long func_addr_value =go_bin .get_address_value (func_list_base , i *(is_go118 ?4 :pointer_size )*2 , is_go118 ?4 :pointer_size );
160+ gofunc_list =new ArrayList <>();
161+ Address func_list_base ;
162+ try {
167163 if (is_go118 ) {
168- func_addr_value +=go_bin .get_address_value (gopclntab_base , 8 +pointer_size *2 , pointer_size );
169- }
170- long func_info_offset =go_bin .get_address_value (func_list_base , i *(is_go118 ?4 :pointer_size )*2 +(is_go118 ?4 :pointer_size ), is_go118 ?4 :pointer_size );
171- Address func_info_addr =null ;
172- if (is_go116 ) {
173- func_info_addr =go_bin .get_address (func_list_base , func_info_offset );
164+ func_list_base =go_bin .get_address (gopclntab_base , go_bin .get_address_value (gopclntab_base , 8 +pointer_size *7 , pointer_size ));
165+ }else if (is_go116 ) {
166+ func_list_base =go_bin .get_address (gopclntab_base , go_bin .get_address_value (gopclntab_base , 8 +pointer_size *6 , pointer_size ));
174167 }else {
175- func_info_addr =go_bin .get_address (gopclntab_base , func_info_offset );
168+ func_list_base =go_bin .get_address (gopclntab_base , 8 + pointer_size );
176169 }
170+ } catch (BinaryAccessException e ) {
171+ Logger .append_message (String .format ("Failed to init funcs: pcheader_addr=%s, message=%s" , gopclntab_base , e .getMessage ()));
172+ return false ;
173+ }
177174
178- long func_entry_value =go_bin .get_address_value (func_info_addr , is_go118 ?4 :pointer_size );
179- long func_end_value =go_bin .get_address_value (func_list_base , i *(is_go118 ?4 :pointer_size )*2 +(is_go118 ?4 :pointer_size )*2 , is_go118 ?4 :pointer_size );
180- if (is_go118 ) {
181- func_entry_value +=go_bin .get_address_value (gopclntab_base , 8 +pointer_size *2 , pointer_size );
182- func_end_value +=go_bin .get_address_value (gopclntab_base , 8 +pointer_size *2 , pointer_size );
175+ for (int i =0 ; i <func_num ; i ++) {
176+ long func_addr_value ;
177+ long func_info_offset ;
178+ Address func_info_addr ;
179+ long func_entry_value ;
180+ long func_end_value ;
181+ try {
182+ func_addr_value =go_bin .get_address_value (func_list_base , i *(is_go118 ?4 :pointer_size )*2 , is_go118 ?4 :pointer_size );
183+ if (is_go118 ) {
184+ func_addr_value +=go_bin .get_address_value (gopclntab_base , 8 +pointer_size *2 , pointer_size );
185+ }
186+ func_info_offset =go_bin .get_address_value (func_list_base , i *(is_go118 ?4 :pointer_size )*2 +(is_go118 ?4 :pointer_size ), is_go118 ?4 :pointer_size );
187+
188+ if (is_go116 ) {
189+ func_info_addr =go_bin .get_address (func_list_base , func_info_offset );
190+ }else {
191+ func_info_addr =go_bin .get_address (gopclntab_base , func_info_offset );
192+ }
193+
194+ func_entry_value =go_bin .get_address_value (func_info_addr , is_go118 ?4 :pointer_size );
195+ func_end_value =go_bin .get_address_value (func_list_base , i *(is_go118 ?4 :pointer_size )*2 +(is_go118 ?4 :pointer_size )*2 , is_go118 ?4 :pointer_size );
196+ if (is_go118 ) {
197+ func_entry_value +=go_bin .get_address_value (gopclntab_base , 8 +pointer_size *2 , pointer_size );
198+ func_end_value +=go_bin .get_address_value (gopclntab_base , 8 +pointer_size *2 , pointer_size );
199+ }
200+ } catch (BinaryAccessException e ) {
201+ Logger .append_message (String .format ("Failed to init func: pcheader_addr=%s, func_list_base=%s, i=%d, message=%s" , gopclntab_base , func_list_base , i , e .getMessage ()));
202+ return false ;
183203 }
184204
185205 if (func_addr_value ==0 || func_info_offset ==0 || func_entry_value ==0 ) {
@@ -249,17 +269,25 @@ private void modify_func_param(GolangFunction gofunc) {
249269
250270 private void add_func_info_comment (GolangFunction gofunc ) {
251271 String comment ="Name: " +gofunc .get_func_name ()+"\n " ;
252- comment +=String .format ("Start: %x\n " , gofunc .get_func_addr ().getOffset ());
253- comment +=String .format ("End: %x" , gofunc .get_func_addr ().add (gofunc .get_func_size ()).getOffset ());
254- go_bin .set_comment (gofunc .get_func_addr (), ghidra .program .model .listing .CodeUnit .PLATE_COMMENT , comment );
272+ comment +=String .format ("Start: %s\n " , gofunc .get_func_addr ());
273+ try {
274+ comment +=String .format ("End: %s" , go_bin .get_address (gofunc .get_func_addr (), gofunc .get_func_size ()));
275+ go_bin .set_comment (gofunc .get_func_addr (), ghidra .program .model .listing .CodeUnit .PLATE_COMMENT , comment );
276+ } catch (BinaryAccessException e ) {
277+ Logger .append_message (String .format ("Failed to add func comment: addr=%s, name=%s, message=%s" , gofunc .get_func_addr (), gofunc .get_func_name (), e .getMessage ()));
278+ }
255279 }
256280
257281 private void add_file_line_comment (GolangFunction gofunc ) {
258282 Address addr =gofunc .get_func_addr ();
259283 Map <Integer , FileLine > comment_map =gofunc .get_file_line_comment_map ();
260284
261285 for (Integer key : comment_map .keySet ()) {
262- go_bin .set_comment (go_bin .get_address (addr , key ), ghidra .program .model .listing .CodeUnit .PRE_COMMENT , comment_map .get (key ).toString ());
286+ try {
287+ go_bin .set_comment (go_bin .get_address (addr , key ), ghidra .program .model .listing .CodeUnit .PRE_COMMENT , comment_map .get (key ).toString ());
288+ } catch (BinaryAccessException e ) {
289+ Logger .append_message (String .format ("Failed to add file line comment: addr=%s, name=%s, message=%s" , gofunc .get_func_addr (), gofunc .get_func_name (), e .getMessage ()));
290+ }
263291 }
264292 }
265293}
0 commit comments