Skip to content

Commit e77446f

Browse files
Fix arg datatypes of hardcode func
1 parent fae73b0 commit e77446f

File tree

3 files changed

+148
-63
lines changed

3 files changed

+148
-63
lines changed

src/main/java/golanganalyzerextension/FunctionModifier.java

Lines changed: 55 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66

77
import ghidra.app.util.importer.MessageLog;
88
import ghidra.program.model.address.Address;
9-
import ghidra.program.model.data.ArrayDataType;
10-
import ghidra.program.model.data.ByteDataType;
119
import ghidra.program.model.data.DataType;
1210
import ghidra.program.model.data.PointerDataType;
1311
import 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
}

src/main/java/golanganalyzerextension/GolangBinary.java

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,30 @@
44
import ghidra.app.util.importer.MessageLog;
55
import ghidra.program.model.address.Address;
66
import ghidra.program.model.address.AddressOutOfBoundsException;
7+
import ghidra.program.model.data.ByteDataType;
8+
import ghidra.program.model.data.DataType;
79
import ghidra.program.model.data.DataTypeConflictException;
10+
import ghidra.program.model.data.Integer16DataType;
11+
import ghidra.program.model.data.Integer3DataType;
12+
import ghidra.program.model.data.Integer5DataType;
13+
import ghidra.program.model.data.Integer6DataType;
14+
import ghidra.program.model.data.Integer7DataType;
15+
import ghidra.program.model.data.IntegerDataType;
16+
import ghidra.program.model.data.LongLongDataType;
17+
import ghidra.program.model.data.ShortDataType;
18+
import ghidra.program.model.data.SignedByteDataType;
819
import ghidra.program.model.data.StringDataType;
20+
import ghidra.program.model.data.UnsignedInteger16DataType;
21+
import ghidra.program.model.data.UnsignedInteger3DataType;
22+
import ghidra.program.model.data.UnsignedInteger5DataType;
23+
import ghidra.program.model.data.UnsignedInteger6DataType;
24+
import ghidra.program.model.data.UnsignedInteger7DataType;
25+
import ghidra.program.model.data.UnsignedIntegerDataType;
26+
import ghidra.program.model.data.UnsignedLongLongDataType;
27+
import ghidra.program.model.data.UnsignedShortDataType;
928
import ghidra.program.model.lang.Register;
1029
import ghidra.program.model.listing.Data;
30+
import ghidra.program.model.listing.Instruction;
1131
import ghidra.program.model.listing.Listing;
1232
import ghidra.program.model.listing.Program;
1333
import ghidra.program.model.mem.Memory;
@@ -106,9 +126,71 @@ long get_address_value(Address address, int size) {
106126
}
107127

108128
boolean compare_register(Register cmp1, Register cmp2) {
129+
if(cmp1==null || cmp2==null) {
130+
return false;
131+
}
109132
return cmp1.getBaseRegister().equals(cmp2.getBaseRegister());
110133
}
111134

135+
DataType get_unsigned_number_datatype(int size) {
136+
if(size==1) {
137+
return new ByteDataType();
138+
}else if(size==2) {
139+
return new UnsignedShortDataType();
140+
}else if(size==3) {
141+
return new UnsignedInteger3DataType();
142+
}else if(size==4) {
143+
return new UnsignedIntegerDataType();
144+
}else if(size==5) {
145+
return new UnsignedInteger5DataType();
146+
}else if(size==6) {
147+
return new UnsignedInteger6DataType();
148+
}else if(size==7) {
149+
return new UnsignedInteger7DataType();
150+
}else if(size==8) {
151+
return new UnsignedLongLongDataType();
152+
}else if(size==16) {
153+
return new UnsignedInteger16DataType();
154+
}else if(pointer_size==8) {
155+
return new UnsignedLongLongDataType();
156+
}else {
157+
return new UnsignedIntegerDataType();
158+
}
159+
}
160+
161+
DataType get_signed_number_datatype(int size) {
162+
if(size==1) {
163+
return new SignedByteDataType();
164+
}else if(size==2) {
165+
return new ShortDataType();
166+
}else if(size==3) {
167+
return new Integer3DataType();
168+
}else if(size==4) {
169+
return new IntegerDataType();
170+
}else if(size==5) {
171+
return new Integer5DataType();
172+
}else if(size==6) {
173+
return new Integer6DataType();
174+
}else if(size==7) {
175+
return new Integer7DataType();
176+
}else if(size==8) {
177+
return new LongLongDataType();
178+
}else if(size==16) {
179+
return new Integer16DataType();
180+
}else if(pointer_size==8) {
181+
return new LongLongDataType();
182+
}else {
183+
return new IntegerDataType();
184+
}
185+
}
186+
187+
boolean is_ret_inst(Instruction inst) {
188+
if(inst.toString().toUpperCase().contains("RET") || inst.toString().toLowerCase().equals("add pc,lr,#0x0")) {
189+
return true;
190+
}
191+
return false;
192+
}
193+
112194
String read_string(Address address, int size) {
113195
try {
114196
byte[] bytes=new byte[size];

src/main/java/golanganalyzerextension/StructureManager.java

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -611,39 +611,27 @@ boolean analyze_type(Address type_base_addr, long offset, boolean is_go16) {
611611
if(basic_info.kind==Kind.Bool) {
612612
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, new BooleanDataType()));
613613
}else if(basic_info.kind==Kind.Int) {
614-
if(pointer_size==8) {
615-
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, new LongLongDataType()));
616-
}else {
617-
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, new IntegerDataType()));
618-
}
614+
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, get_signed_number_datatype(pointer_size)));
619615
}else if(basic_info.kind==Kind.Int8) {
620-
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, new SignedByteDataType()));
616+
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, get_signed_number_datatype(1)));
621617
}else if(basic_info.kind==Kind.Int16) {
622-
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, new ShortDataType()));
618+
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, get_signed_number_datatype(2)));
623619
}else if(basic_info.kind==Kind.Int32) {
624-
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, new IntegerDataType()));
620+
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, get_signed_number_datatype(4)));
625621
}else if(basic_info.kind==Kind.Int64) {
626-
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, new LongLongDataType()));
622+
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, get_signed_number_datatype(8)));
627623
}else if(basic_info.kind==Kind.Uint) {
628-
if(pointer_size==8) {
629-
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, new UnsignedLongLongDataType()));
630-
}else {
631-
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, new UnsignedIntegerDataType()));
632-
}
624+
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, get_unsigned_number_datatype(pointer_size)));
633625
}else if(basic_info.kind==Kind.Uint8) {
634-
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, new ByteDataType()));
626+
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, get_unsigned_number_datatype(1)));
635627
}else if(basic_info.kind==Kind.Uint16) {
636-
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, new UnsignedShortDataType()));
628+
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, get_unsigned_number_datatype(2)));
637629
}else if(basic_info.kind==Kind.Uint32) {
638-
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, new UnsignedIntegerDataType()));
630+
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, get_unsigned_number_datatype(4)));
639631
}else if(basic_info.kind==Kind.Uint64) {
640-
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, new UnsignedLongLongDataType()));
632+
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, get_unsigned_number_datatype(8)));
641633
}else if(basic_info.kind==Kind.Uintptr) {
642-
if(pointer_size==8) {
643-
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, new UnsignedLongLongDataType()));
644-
}else {
645-
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, new UnsignedIntegerDataType()));
646-
}
634+
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, get_unsigned_number_datatype(pointer_size)));
647635
}else if(basic_info.kind==Kind.Float32) {
648636
basic_type_info_map.replace(offset, new OtherTypeInfo(basic_info, new Float4DataType()));
649637
}else if(basic_info.kind==Kind.Float64) {

0 commit comments

Comments
 (0)