Add Outlining Support for strcat
@bpotchik ya está trabajando en esto.
Desde el 23/6/2025.
Evaluación
Este issue todavía no se ha evaluado.
Descripción
What is the feature you'd like to have?
Currently, in the binary I am looking at, there are a number of string operations that are treated as raw hex numbers applied to variable offsets. It would be nice if these showed in a more 'as it would appear in the code' way, of just general string operations.
Is your feature request related to a problem?
There are other similar examples in the binary (macOS, x86_64) I'm looking at, but this is the most self contained one:
005851a0 int64_t SerumGUI::getPath_AppDataBase(int64_t arg1, int64_t* arg2)
005851b5 int64_t rax = *___stack_chk_guard
005851d4 void var_70
005851d4 if (_FSFindFolder(0xffff8005, 0x61737570, 0, &var_70) == 0)
005851dc int64_t rax_2 = _CFURLCreateFromFSRef(0, &var_70)
005851f1 _CFURLGetFileSystemRepresentation(rax_2, 0, arg2, 0x200)
005851f9 _CFRelease(rax_2)
00585201 int64_t rax_3 = _strlen(arg2)
🐛00585210 *(arg2 + rax_3) = 0x6566782e6d6f632f
🐛0058521e *(arg2 + rax_3 + 8) = 0x7364726f63657272
🐛0058522d *(arg2 + rax_3 + 0x10) = 0x2f6d757265732e
00585239 int64_t rax_4 = *___stack_chk_guard
00585240 if (rax_4 != rax)
0058524b ___stack_chk_fail()
0058524b noreturn
0058524a return rax_4
If I right click -> Display As -> Character Constant on those hex constants, it looks a bit more readable:
005851a0 int64_t SerumGUI::getPath_AppDataBase(int64_t arg1, int64_t* arg2)
005851b5 int64_t rax = *___stack_chk_guard
005851d4 void var_70
005851d4 if (_FSFindFolder(0xffff8005, 0x61737570, 0, &var_70) == 0)
005851dc int64_t rax_2 = _CFURLCreateFromFSRef(0, &var_70)
005851f1 _CFURLGetFileSystemRepresentation(rax_2, 0, arg2, 0x200)
005851f9 _CFRelease(rax_2)
00585201 int64_t rax_3 = _strlen(arg2)
- 🐛00585210 *(arg2 + rax_3) = 0x6566782e6d6f632f
- 🐛0058521e *(arg2 + rax_3 + 8) = 0x7364726f63657272
- 🐛0058522d *(arg2 + rax_3 + 0x10) = 0x2f6d757265732e
+ 🐛00585210 *(arg2 + rax_3) = '/com.xfe'
+ 🐛0058521e *(arg2 + rax_3 + 8) = 'rrecords'
+ 🐛0058522d *(arg2 + rax_3 + 0x10) = '.serum/'
00585239 int64_t rax_4 = *___stack_chk_guard
00585240 if (rax_4 != rax)
0058524b ___stack_chk_fail()
0058524b noreturn
0058524a return rax_4
But it would be nicer if it was automatically something more like this (or similar):
005851a0 int64_t SerumGUI::getPath_AppDataBase(int64_t arg1, int64_t* arg2)
005851b5 int64_t rax = *___stack_chk_guard
005851d4 void var_70
005851d4 if (_FSFindFolder(0xffff8005, 0x61737570, 0, &var_70) == 0)
005851dc int64_t rax_2 = _CFURLCreateFromFSRef(0, &var_70)
005851f1 _CFURLGetFileSystemRepresentation(rax_2, 0, arg2, 0x200)
005851f9 _CFRelease(rax_2)
00585201 int64_t rax_3 = _strlen(arg2)
- 🐛00585210 *(arg2 + rax_3) = 0x6566782e6d6f632f
- 🐛0058521e *(arg2 + rax_3 + 8) = 0x7364726f63657272
- 🐛0058522d *(arg2 + rax_3 + 0x10) = 0x2f6d757265732e
+ 🐛00585210 *(arg2 + rax_3) = '/com.xferrecords.serum/'
00585239 int64_t rax_4 = *___stack_chk_guard
00585240 if (rax_4 != rax)
0058524b ___stack_chk_fail()
0058524b noreturn
0058524a return rax_4
Or even better would be:
005851a0 int64_t SerumGUI::getPath_AppDataBase(int64_t arg1, int64_t* arg2)
005851b5 int64_t rax = *___stack_chk_guard
005851d4 void var_70
005851d4 if (_FSFindFolder(0xffff8005, 0x61737570, 0, &var_70) == 0)
005851dc int64_t rax_2 = _CFURLCreateFromFSRef(0, &var_70)
005851f1 _CFURLGetFileSystemRepresentation(rax_2, 0, arg2, 0x200)
005851f9 _CFRelease(rax_2)
- 00585201 int64_t rax_3 = _strlen(arg2)
- 🐛00585210 *(arg2 + rax_3) = 0x6566782e6d6f632f
- 🐛0058521e *(arg2 + rax_3 + 8) = 0x7364726f63657272
- 🐛0058522d *(arg2 + rax_3 + 0x10) = 0x2f6d757265732e
+ 🐛00585210 _strcat(arg2, "/com.xferrecords.serum/")
00585239 int64_t rax_4 = *___stack_chk_guard
00585240 if (rax_4 != rax)
0058524b ___stack_chk_fail()
0058524b noreturn
0058524a return rax_4
- https://www.geeksforgeeks.org/strcat-in-c/
-
char *strcat(char *dest, const char *src);
-
Are any alternative solutions acceptable?
Unsure.
Additional Information:
- This last screenshot shows another thing that would be nice to improve (which maybe is worth opening as a separate issue), where 32 bit shifts are also being used within the string operations
- Lenguaje dominante
- C++
- Estrellas
- 1.3k
- Forks
- 298
- Merge medio
- 5 d 5 h
- PR fusionados (30 d)
- 19
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 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
Vector35/binaryninja-api#8516 ·
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 92/100
Vector35/binaryninja-api#8503 ·
-
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 ·
Todos los issues de Vector35/binaryninja-api
Issues similares
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 92/100
autowarefoundation/autoware_universe#13413 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
-
automated-analysis bug memory-safety
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
-
Sensor initialization takes very long when `--initial-sim-time` is set to current UNIX timestamp Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
gazebosim/gz-sensors#662 · 1 comentario ·