66
77import ghidra .app .util .importer .MessageLog ;
88import ghidra .program .model .address .Address ;
9- import ghidra .program .model .data .ArrayDataType ;
10- import ghidra .program .model .data .ByteDataType ;
119import ghidra .program .model .data .DataType ;
1210import ghidra .program .model .data .PointerDataType ;
1311import ghidra .program .model .lang .Register ;
@@ -149,11 +147,12 @@ boolean check_memcopy(Function func) {
149147 MEMCPY_FUNC_STAGE stage =MEMCPY_FUNC_STAGE .GET_SRC ;
150148 Register dst_reg =null ;
151149 Register src_reg =null ;
150+ DataType inner_datatype =null ;
152151 String tmp_reg1 ="TMP" ;
153152 String tmp_reg2 ="TMP" ;
154153 int size =0 ;
155154 while (inst !=null ) {
156- if (inst . toString (). toUpperCase (). contains ( "RET" ) || inst . toString (). equals ( "add pc,lr,#0x0" )) {
155+ if (is_ret_inst ( inst )) {
157156 break ;
158157 }
159158
@@ -179,10 +178,10 @@ boolean check_memcopy(Function func) {
179178 if (op2 .length <2 ) {
180179 return false ;
181180 }
182- if (!(op1 [0 ] instanceof Register ) || ! compare_register (( Register ) op1 [ 0 ], program . getRegister ( "r0" )) ) {
181+ if (!(op1 [0 ] instanceof Register )) {
183182 return false ;
184183 }
185- if (!(op2 [0 ] instanceof Register ) || ! compare_register (( Register ) op2 [ 0 ], program . getRegister ( "r1" )) ) {
184+ if (!(op2 [0 ] instanceof Register )) {
186185 return false ;
187186 }
188187 if (!(op2 [1 ] instanceof Scalar )) {
@@ -199,13 +198,13 @@ boolean check_memcopy(Function func) {
199198 if (op3 .length <1 ) {
200199 return false ;
201200 }
202- if (!(op1 [0 ] instanceof Register ) || ! compare_register (( Register ) op1 [ 0 ], program . getRegister ( "x26" )) ) {
201+ if (!(op1 [0 ] instanceof Register )) {
203202 return false ;
204203 }
205- if (!(op2 [0 ] instanceof Register ) || ! compare_register (( Register ) op2 [ 0 ], program . getRegister ( "x27" )) ) {
204+ if (!(op2 [0 ] instanceof Register )) {
206205 return false ;
207206 }
208- if (!(op3 [0 ] instanceof Register ) || ! compare_register (( Register ) op3 [ 0 ], program . getRegister ( "x20" )) ) {
207+ if (!(op3 [0 ] instanceof Register )) {
209208 return false ;
210209 }
211210 src_reg =(Register )op3 [0 ];
@@ -235,7 +234,14 @@ boolean check_memcopy(Function func) {
235234 if (!op2 [0 ].toString ().equals (tmp_reg1 )) {
236235 return false ;
237236 }
238- dst_reg =(Register )op1 [0 ];
237+ if (dst_reg ==null ) {
238+ dst_reg =(Register )op1 [0 ];
239+ if (op2 [0 ].toString ().contains ("XMM" )) {
240+ inner_datatype =get_unsigned_number_datatype (4 );
241+ }else {
242+ inner_datatype =get_unsigned_number_datatype (((Register )op2 [0 ]).getBitLength ()/8 );
243+ }
244+ }
239245 stage =MEMCPY_FUNC_STAGE .ADD_DST ;
240246 }else if (mnemonic .equals ("str" )) {
241247 if (op2 .length <2 ) {
@@ -244,13 +250,16 @@ boolean check_memcopy(Function func) {
244250 if (!(op1 [0 ] instanceof Register ) || !compare_register ((Register )op1 [0 ], program .getRegister (tmp_reg1 ))) {
245251 return false ;
246252 }
247- if (!(op2 [0 ] instanceof Register ) || ! compare_register (( Register ) op2 [ 0 ], program . getRegister ( "r2" )) ) {
253+ if (!(op2 [0 ] instanceof Register )) {
248254 return false ;
249255 }
250256 if (!(op2 [1 ] instanceof Scalar )) {
251257 return false ;
252258 }
253- dst_reg =(Register )op2 [0 ];
259+ if (dst_reg ==null ) {
260+ dst_reg =(Register )op2 [0 ];
261+ inner_datatype =get_unsigned_number_datatype (((Register )op1 [0 ]).getBitLength ()/8 );
262+ }
254263 size +=Integer .decode (op2 [1 ].toString ());
255264 stage =MEMCPY_FUNC_STAGE .GET_SRC ;
256265 }else if (mnemonic .equals ("stp" )) {
@@ -267,10 +276,13 @@ boolean check_memcopy(Function func) {
267276 if (!(op2 [0 ] instanceof Register ) || !compare_register ((Register )op2 [0 ], program .getRegister (tmp_reg2 ))) {
268277 return false ;
269278 }
270- if (!(op3 [0 ] instanceof Register ) || ! compare_register (( Register ) op3 [ 0 ], program . getRegister ( "x21" )) ) {
279+ if (!(op3 [0 ] instanceof Register )) {
271280 return false ;
272281 }
273- dst_reg =(Register )op3 [0 ];
282+ if (dst_reg ==null ) {
283+ dst_reg =(Register )op3 [0 ];
284+ inner_datatype =get_unsigned_number_datatype (((Register )op1 [0 ]).getBitLength ()/8 );
285+ }
274286 if (op3 .length >=2 && op3 [1 ] instanceof Scalar ) {
275287 size +=Integer .decode (op3 [1 ].toString ());
276288 }else {
@@ -300,17 +312,14 @@ boolean check_memcopy(Function func) {
300312
301313 List <Parameter > params =new ArrayList <>();
302314 try {
303- if (dst_reg ==null ) {
315+ if (dst_reg ==null || inner_datatype == null ) {
304316 return false ;
305317 }
306318
307- DataType data_type =new ByteDataType ();
308- ArrayDataType array_datatype =new ArrayDataType (data_type , size , data_type .getLength ());
309- params .add (new ParameterImpl (String .format ("param_%d" , 1 ), new PointerDataType (array_datatype , pointer_size ), dst_reg , func .getProgram (), SourceType .USER_DEFINED ));
319+ params .add (new ParameterImpl (String .format ("param_%d" , 1 ), new PointerDataType (inner_datatype , pointer_size ), dst_reg , func .getProgram (), SourceType .USER_DEFINED ));
310320
311321 if (src_reg !=null ) {
312- array_datatype =new ArrayDataType (data_type , src_reg .getBitLength ()/8 , data_type .getLength ());
313- params .add (new ParameterImpl (String .format ("param_%d" , 2 ), new PointerDataType (array_datatype , pointer_size ), src_reg , func .getProgram (), SourceType .USER_DEFINED ));
322+ params .add (new ParameterImpl (String .format ("param_%d" , 2 ), new PointerDataType (inner_datatype , pointer_size ), src_reg , func .getProgram (), SourceType .USER_DEFINED ));
314323 }
315324 } catch (InvalidInputException e ) {
316325 }
@@ -324,10 +333,11 @@ boolean check_memset(Function func) {
324333 Instruction inst =program_listing .getInstructionAt (func .getEntryPoint ());
325334 Register dst_reg =null ;
326335 Register src_reg =null ;
336+ DataType inner_datatype =null ;
327337 int start =-1 ;
328338 int size =0 ;
329339 while (inst !=null ) {
330- if (inst . toString (). toUpperCase (). contains ( "RET" ) || inst . toString (). equals ( "add pc,lr,#0x0" )) {
340+ if (is_ret_inst ( inst )) {
331341 break ;
332342 }
333343
@@ -340,9 +350,12 @@ boolean check_memset(Function func) {
340350 if (!(op1 [1 ] instanceof Register ) || !compare_register ((Register )op1 [1 ], program .getRegister ("DI" ))) {
341351 return false ;
342352 }
343- start =0 ;
344- dst_reg =(Register )op1 [1 ];
345- src_reg =program .getRegister ("EAX" );
353+ if (start <0 ) {
354+ start =0 ;
355+ dst_reg =(Register )op1 [1 ];
356+ src_reg =program .getRegister ("EAX" );
357+ inner_datatype =get_unsigned_number_datatype (src_reg .getBitLength ()/8 );
358+ }
346359 size +=4 ;
347360 inst =inst .getNext ();
348361 continue ;
@@ -358,6 +371,14 @@ boolean check_memset(Function func) {
358371 if (!(op1 [0 ] instanceof Register ) || !compare_register ((Register )op1 [0 ], program .getRegister ("DI" ))) {
359372 return false ;
360373 }
374+ if (!(op2 [0 ] instanceof Register ) || !op2 [0 ].toString ().contains ("XMM" )) {
375+ return false ;
376+ }
377+ if (start <0 ) {
378+ dst_reg =(Register )op1 [0 ];
379+ src_reg =(Register )op2 [0 ];
380+ inner_datatype =get_unsigned_number_datatype (4 );
381+ }
361382 if (op1 .length <2 ) {
362383 if (start <0 ) {
363384 start =0 ;
@@ -370,11 +391,6 @@ boolean check_memset(Function func) {
370391 start =Integer .decode (op1 [1 ].toString ());
371392 }
372393 }
373- if (!(op2 [0 ] instanceof Register ) || !op2 [0 ].toString ().contains ("XMM" )) {
374- return false ;
375- }
376- dst_reg =(Register )op1 [0 ];
377- src_reg =(Register )op2 [0 ];
378394 }else if (mnemonic .equals ("LEA" )) {
379395 if (op2 .length <2 ) {
380396 return false ;
@@ -393,20 +409,21 @@ boolean check_memset(Function func) {
393409 if (op2 .length <2 ) {
394410 return false ;
395411 }
396- if (!(op1 [0 ] instanceof Register ) || ! compare_register (( Register ) op1 [ 0 ], program . getRegister ( "r0" )) ) {
412+ if (!(op1 [0 ] instanceof Register )) {
397413 return false ;
398414 }
399- if (!(op2 [0 ] instanceof Register ) || ! compare_register (( Register ) op2 [ 0 ], program . getRegister ( "r1" )) ) {
415+ if (!(op2 [0 ] instanceof Register )) {
400416 return false ;
401417 }
402418 if (!(op2 [1 ] instanceof Scalar )) {
403419 return false ;
404420 }
405421 if (start <0 ) {
406422 start =0 ;
423+ dst_reg =(Register )op2 [0 ];
424+ src_reg =(Register )op1 [0 ];
425+ inner_datatype =get_unsigned_number_datatype (src_reg .getBitLength ()/8 );
407426 }
408- dst_reg =(Register )op2 [0 ];
409- src_reg =(Register )op1 [0 ];
410427 size +=Integer .decode (op2 [1 ].toString ());
411428 }else if (mnemonic .equals ("stp" )) {
412429 if (inst .getNumOperands ()<3 ) {
@@ -422,13 +439,14 @@ boolean check_memset(Function func) {
422439 if (!(op2 [0 ] instanceof Register ) || !compare_register ((Register )op2 [0 ], program .getRegister ("xzr" ))) {
423440 return false ;
424441 }
425- if (!(op3 [0 ] instanceof Register ) || ! compare_register (( Register ) op3 [ 0 ], program . getRegister ( "x20" )) ) {
442+ if (!(op3 [0 ] instanceof Register )) {
426443 return false ;
427444 }
428445 if (start <0 ) {
429446 start =0 ;
447+ dst_reg =(Register )op3 [0 ];
448+ inner_datatype =get_unsigned_number_datatype (((Register )op1 [0 ]).getBitLength ()/8 );
430449 }
431- dst_reg =(Register )op3 [0 ];
432450 if (op3 .length >=2 && op3 [1 ] instanceof Scalar ) {
433451 size +=Integer .decode (op3 [1 ].toString ());
434452 }else {
@@ -446,17 +464,14 @@ boolean check_memset(Function func) {
446464
447465 List <Parameter > params =new ArrayList <>();
448466 try {
449- if (dst_reg ==null ) {
467+ if (dst_reg ==null || inner_datatype == null ) {
450468 return false ;
451469 }
452470
453- DataType data_type =new ByteDataType ();
454- ArrayDataType array_datatype =new ArrayDataType (data_type , size , data_type .getLength ());
455- params .add (new ParameterImpl (String .format ("param_%d" , 1 ), new PointerDataType (array_datatype , pointer_size ), dst_reg , func .getProgram (), SourceType .USER_DEFINED ));
471+ params .add (new ParameterImpl (String .format ("param_%d" , 1 ), new PointerDataType (inner_datatype , pointer_size ), dst_reg , func .getProgram (), SourceType .USER_DEFINED ));
456472
457473 if (src_reg !=null ) {
458- array_datatype =new ArrayDataType (data_type , src_reg .getBitLength ()/8 , data_type .getLength ());
459- params .add (new ParameterImpl (String .format ("param_%d" , 2 ), new PointerDataType (array_datatype , pointer_size ), src_reg , func .getProgram (), SourceType .USER_DEFINED ));
474+ params .add (new ParameterImpl (String .format ("param_%d" , 2 ), get_unsigned_number_datatype (src_reg .getBitLength ()/8 ), src_reg , func .getProgram (), SourceType .USER_DEFINED ));
460475 }
461476 } catch (InvalidInputException e ) {
462477 }
0 commit comments