Skip to content

Commit ac9cd48

Browse files
committed
CHB:ARM: save cfg info
1 parent 5dfac12 commit ac9cd48

File tree

8 files changed

+107
-4
lines changed

8 files changed

+107
-4
lines changed

CodeHawk/CHB/bchanalyze/bCHFileIO.ml

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ open BCHMIPSDictionary
5959
(* bchlibarm32 *)
6060
open BCHARMAssemblyInstructions
6161
open BCHARMDictionary
62+
open BCHARMLoopStructure
6263

6364
(* bchlibpower32 *)
6465
open BCHPowerAssemblyInstructions
@@ -92,6 +93,7 @@ let get_bch_root (info:string):xml_element_int =
9293
end
9394

9495

96+
(* applies to x86 only *)
9597
let save_functions_list () =
9698
let filename = get_functions_filename () in
9799
let doc = xmlDocument () in
@@ -125,6 +127,67 @@ let save_functions_list () =
125127
end
126128

127129

130+
let save_arm_functions_list () =
131+
let filename = get_functions_filename () in
132+
let doc = xmlDocument () in
133+
let root = get_bch_root "functions" in
134+
let ffNode = xmlElement "functions" in
135+
let subnodes = ref [] in
136+
begin
137+
BCHARMAssemblyFunctions.arm_assembly_functions#itera (fun faddr f ->
138+
let fNode = xmlElement "fn" in
139+
let jtc = f#get_jumptable_count in
140+
let (translation, lc, ld, ujc) =
141+
try
142+
begin
143+
BCHTranslateARMToCHIF.translate_arm_assembly_function f;
144+
record_arm_loop_levels faddr;
145+
("ok",
146+
get_arm_loop_count_from_table f,
147+
get_arm_loop_depth_from_table f,
148+
(-1))
149+
end
150+
with
151+
| BCH_failure p ->
152+
let finfo = BCHFunctionInfo.get_function_info faddr in
153+
let ujc = finfo#get_unknown_jumps_count in
154+
(CHPrettyUtil.pretty_to_string p, (-1), (-1), ujc) in
155+
let set = fNode#setAttribute in
156+
let seti = fNode#setIntAttribute in
157+
let setx t x = set t x#to_hex_string in
158+
begin
159+
(if functions_data#has_function_name faddr then
160+
let name = (functions_data#get_function faddr)#get_function_name in
161+
let name =
162+
if has_control_characters name then
163+
"__xx__" ^ (hex_string name)
164+
else
165+
name in
166+
set "name" name);
167+
setx "va" faddr;
168+
seti "ic" f#get_instruction_count;
169+
seti "bc" f#get_block_count;
170+
(if jtc > 0 then seti "jtc" jtc);
171+
(if translation = "ok" then
172+
begin
173+
(if lc > 0 then seti "lc" lc);
174+
(if ld > 0 then seti "ld" ld);
175+
end
176+
else
177+
begin
178+
set "tr" "x";
179+
seti "ujc" ujc
180+
end);
181+
subnodes := fNode :: !subnodes
182+
end);
183+
ffNode#appendChildren !subnodes;
184+
doc#setNode root;
185+
root#appendChildren [ffNode];
186+
file_output#saveFile filename doc#toPretty
187+
end
188+
189+
190+
128191
let save_global_state () =
129192
let filename = get_global_state_filename () in
130193
let doc = xmlDocument () in

CodeHawk/CHB/bchanalyze/bCHFileIO.mli

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,12 @@ open BCHLibTypes
3636
(* bchlibx86 *)
3737
open BCHLibx86Types
3838

39-
39+
(** save function cfg info (x86 only) *)
4040
val save_functions_list: unit -> unit
41+
42+
(** save function cfg info for arm functions *)
43+
val save_arm_functions_list: unit -> unit
44+
4145
val save_global_state: unit -> unit
4246
val save_system_info: unit -> unit
4347
val save_resultmetrics: xml_element_int -> unit

CodeHawk/CHB/bchcmdline/bCHXBinaryAnalyzer.ml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ let export_directory = ref ""
107107
let savecfgs = ref false
108108
let save_xml = ref false (* save disassembly status in xml *)
109109
let save_asm = ref false
110+
let save_asm_cfg_info = ref false (* save functions list with cfg info in xml *)
110111
let set_datablocks = ref false (* only supported for arm *)
111112
let construct_all_functions = ref false
112113

@@ -204,6 +205,8 @@ let speclist =
204205
"save disassembly status in xml for bulk evaluation");
205206
("-save_asm", Arg.Unit (fun () -> save_asm := true),
206207
"save assembly listing in the analysis directory");
208+
("-save_asm_cfg_info", Arg.Unit (fun () -> save_asm_cfg_info := true),
209+
"save list of functions with cfg info to xml file (may be slow)");
207210
("-construct_all_functions",
208211
Arg.Unit (fun () -> construct_all_functions := true),
209212
"construct all functions even if analyzing only a few of them");
@@ -588,6 +591,11 @@ let main () =
588591
(get_duplicate_coverage_filename ())
589592
(STR (BCHARMAssemblyFunctions.arm_assembly_functions#duplicates_to_string));
590593
pr_timing [STR "duplicates listing saved"];
594+
(if !save_asm_cfg_info then
595+
begin
596+
save_arm_functions_list ();
597+
pr_timing [STR "function cfg info saved"]
598+
end);
591599
save_system_info ();
592600
pr_timing [STR "system_info saved"];
593601
save_arm_dictionary ();

CodeHawk/CHB/bchlibarm32/bCHARMAssemblyFunction.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ object (self)
106106

107107
method get_block_count = List.length blocks
108108

109+
method get_jumptable_count = List.length self#get_jumptables
110+
109111
method get_not_valid_instr_count =
110112
let c = ref 0 in
111113
let _ =

CodeHawk/CHB/bchlibarm32/bCHARMAssemblyFunctions.ml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -915,14 +915,20 @@ let get_arm_disassembly_metrics () =
915915
let loaded_imports = [] in
916916
let imports = imported_imports @ loaded_imports in
917917
let numunknown = !arm_assembly_instructions#get_num_unknown_instructions in
918+
let jumptables =
919+
List.fold_left (fun acc (va, _) ->
920+
if arm_assembly_functions#includes_instruction_address va then
921+
acc + 1
922+
else
923+
acc) 0 !arm_assembly_instructions#get_jumptables in
918924
{ dm_unknown_instrs = numunknown;
919925
dm_instrs = instrs;
920926
dm_functions = arm_assembly_functions#get_num_functions;
921927
dm_coverage = coverage;
922928
dm_pcoverage = 100.0 *. (float_of_int coverage) /. (float_of_int instrs) ;
923929
dm_overlap = overlap;
924930
dm_alloverlap = alloverlap;
925-
dm_jumptables = List.length system_info#get_jumptables;
931+
dm_jumptables = jumptables;
926932
dm_datablocks = List.length system_info#get_data_blocks;
927933
dm_imports = imports;
928934
dm_so_imports = system_info#dmso_metrics;

CodeHawk/CHB/bchlibarm32/bCHARMAssemblyInstructions.ml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ open CHXmlDocument
3737
(* bchlib *)
3838
open BCHBasicTypes
3939
open BCHByteUtilities
40+
open BCHConstantDefinitions
4041
open BCHDataBlock
4142
open BCHDoubleword
4243
open BCHFunctionData
@@ -702,6 +703,15 @@ object (self)
702703
^ " Faddr:<"
703704
^ v#to_hex_string
704705
^ ">"
706+
else if has_symbolic_address_name v then
707+
let name = get_symbolic_address_name v in
708+
" "
709+
^ (fixed_length_string addr 10)
710+
^ " Sym:<"
711+
^ v#to_hex_string
712+
^ ":"
713+
^ name
714+
^ ">"
705715
else if elf_header#is_code_address v then
706716
" "
707717
^ (fixed_length_string addr 10)

CodeHawk/CHB/bchlibarm32/bCHARMTypes.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1813,6 +1813,7 @@ class type arm_assembly_function_int =
18131813
method get_function_md5: string
18141814
method get_instruction_count: int
18151815
method get_block_count: int
1816+
method get_jumptable_count: int
18161817
method get_not_valid_instr_count: int
18171818
method get_true_conditional_return: arm_assembly_block_int option
18181819

CodeHawk/CHB/bchlibarm32/bCHConstructARMFunction.ml

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,22 @@ let get_successors
254254
if !arm_assembly_instructions#is_code_address addr then
255255
[addr]
256256
else
257-
[])
257+
let floc = get_floc_by_address faddr instr#get_address in
258+
begin
259+
floc#f#set_unknown_jumptarget instr#get_address#to_hexstring;
260+
[]
261+
end)
258262
[]
259263
(numerical_to_doubleword tgt)
260264
| _ -> [])
261265

262266
(* no information available, give up *)
263-
| Branch _ | BranchExchange _ -> []
267+
| Branch _ | BranchExchange _ ->
268+
let floc = get_floc_by_address faddr instr#get_address in
269+
begin
270+
floc#f#set_unknown_jumptarget instr#get_address#to_hex_string;
271+
[]
272+
end
264273

265274
| _ -> next () in
266275

0 commit comments

Comments
 (0)