Very oldschool x86 signed division by 2 using `sar`+`adc` lifts into something unhelpful
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 55/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Activo
- Stack tecnológico
- cpp
- Área
- reverse-engineering
Línea de trabajo
Start with the attached binjabaddiv.zip and inspect the function at 0x40107c in Binary Ninja; compare the lifted SAR/ADC flags and conditional path with signed division by two. Done means this pattern decompiles without an unimplemented carry flag and expresses the intended signed result.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Version and Platform (required):
- Binary Ninja Version: 5.3.9757 Personal (a99f2380)
- OS: macOS
- OS Version: 26.6.1
- CPU Architecture: ARM64
Bug Description:
I have a target that has been compiled using Borland C++, either version 4.5 or 5.x (from the late 90s). In this compiler, the following code:
int bad_div2(int x) { return x / 2; }
…which computes a signed division by 2, ends up compiling into the following assembly:
sar eax,1
jns short @3
adc eax,0
@3:
After loading this into Binary Ninja, it decompiles into a rather unhelpful:
0040107c int32_t sub_40107c(int32_t arg1)
0040107c {
0040107c int32_t result = arg1 >> 1;
🚫🚫00401082 bool c = /* bool c = unimplemented {sar eax, 0x1} */;
00401082
00401084 if (arg1 >> 1 >= 0)
0040108a return result;
0040108a
00401086 return result + 0;
0040107c }
Steps To Reproduce:
Please provide all steps required to reproduce the behavior:
- I am attaching a fully-linked EXE which includes this function at address 0x40107c. (Running the EXE doesn't do anything, it's only useful for looking at the function.)
Expected Behavior:
It'd be really nice if this pattern could be recognized and simplified.
Screenshots/Video Recording:
N/A
Binary:
binjabaddiv.zip
Additional Information:
N/A
- Lenguaje dominante
- C++
- Estrellas
- 1.3k
- Forks
- 298
- Merge medio
- 4 d 13 h
- PR fusionados (30 d)
- 20
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de Vector35/binaryninja-api
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 88/100
Vector35/binaryninja-api#8540 ·
-
normalize time logs from WARP Abierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
Vector35/binaryninja-api#8446 ·
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
Vector35/binaryninja-api#8444 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Vector35/binaryninja-api#8441 · 3 comentarios ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Vector35/binaryninja-api#8404 ·
Todos los issues de Vector35/binaryninja-api
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
google/libultrahdr#485 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
godotengine/godot#123776 ·
-
bug
Dificultad 1/5 Menos de una hora Aptitud para principiantes 60/100
-
good first issue
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
-
good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
ros2/common_interfaces#344 ·