|
75 | 75 | }, |
76 | 76 | } |
77 | 77 |
|
| 78 | +ELF_ABIS: Dict[lief.ELF.ARCH, Dict[lief.ENDIANNESS, List[int]]] = { |
| 79 | + lief.ELF.ARCH.x86_64: { |
| 80 | + lief.ENDIANNESS.LITTLE: [3,2,0], |
| 81 | + }, |
| 82 | + lief.ELF.ARCH.ARM: { |
| 83 | + lief.ENDIANNESS.LITTLE: [3,2,0], |
| 84 | + }, |
| 85 | + lief.ELF.ARCH.AARCH64: { |
| 86 | + lief.ENDIANNESS.LITTLE: [3,7,0], |
| 87 | + }, |
| 88 | + lief.ELF.ARCH.PPC64: { |
| 89 | + lief.ENDIANNESS.LITTLE: [3,10,0], |
| 90 | + lief.ENDIANNESS.BIG: [3,2,0], |
| 91 | + }, |
| 92 | + lief.ELF.ARCH.RISCV: { |
| 93 | + lief.ENDIANNESS.LITTLE: [4,15,0], |
| 94 | + }, |
| 95 | +} |
| 96 | + |
78 | 97 | # Allowed NEEDED libraries |
79 | 98 | ELF_ALLOWED_LIBRARIES = { |
80 | 99 | # dashd and dash-qt |
@@ -248,12 +267,19 @@ def check_ELF_interpreter(binary) -> bool: |
248 | 267 |
|
249 | 268 | return binary.concrete.interpreter == expected_interpreter |
250 | 269 |
|
| 270 | +def check_ELF_ABI(binary) -> bool: |
| 271 | + expected_abi = ELF_ABIS[binary.header.machine_type][binary.abstract.header.endianness] |
| 272 | + note = binary.concrete.get(lief.ELF.NOTE_TYPES.ABI_TAG) |
| 273 | + assert note.details.abi == lief.ELF.NOTE_ABIS.LINUX |
| 274 | + return note.details.version == expected_abi |
| 275 | + |
251 | 276 | CHECKS = { |
252 | 277 | lief.EXE_FORMATS.ELF: [ |
253 | 278 | ('IMPORTED_SYMBOLS', check_imported_symbols), |
254 | 279 | ('EXPORTED_SYMBOLS', check_exported_symbols), |
255 | 280 | ('LIBRARY_DEPENDENCIES', check_ELF_libraries), |
256 | 281 | ('INTERPRETER_NAME', check_ELF_interpreter), |
| 282 | + ('ABI', check_ELF_ABI), |
257 | 283 | ], |
258 | 284 | lief.EXE_FORMATS.MACHO: [ |
259 | 285 | ('DYNAMIC_LIBRARIES', check_MACHO_libraries), |
|
0 commit comments