Me he estado preguntando: ¿cómo se puede desmontar un binario auto modificante? Supongo que no puedes usar olly o IDA porque son desensambladores estáticos, ¿correcto? ¿Qué pasa con el desensamblador si saltas a la mitad de una instrucción? ¿Y cómo se analizan los motores metamórficos?Desmontar el código de auto-modificación
Respuesta
Tanto OllyDbg como IDA no son solo analizadores estáticos, sino que ambos también pueden ejecutar el código. IDA también puede ejecutar su código de forma remota y, hasta donde yo sé, incluso puede hacer depuración incorporada. Por supuesto, si "rompe" la ejecución del programa en algún momento, y echa un vistazo al desmontaje, reflejará (en ambos programas) el estado actual del programa, incluidas las modificaciones que haya realizado en sí mismo.
¿Qué sucede con el desensamblador si se salta al medio de una instrucción?
De acuerdo con mi experiencia, ambos desensambladores mencionados pueden manejar esta situación. Por ejemplo, ver aquí, ¿cómo OllyDbg lo administra, aquí es una captura de pantalla cuando EIP es 00892C0E:
Y cuando hago EIP = 00892C0F, que se encuentra en una mitad de una instrucción:
como ve, simplemente vuelve a desensamblar las instrucciones, por lo que es un código de operación diferente (pero aún válido).
¿Y cómo se analizan los motores metamórficos?
Al igual que cualquier otro código. Los trucos que mencionas (saltar a la mitad de una instrucción, modificarse a sí mismo) fueron principalmente populares hace un tiempo, cuando los desensambladores y el depurador no eran tan inteligentes como lo son ahora.
Por supuesto, el análisis estático puede ser muy difícil, pero por supuesto puede analizar binarios completamente fuera de línea y descifrar el "morphing" (en su mente) para hacerse una idea de lo que hará el código. Pero cuando puedes usar un depurador en vivo, entonces simplemente ves lo que el código está haciendo.
Por supuesto, todo esto es una carrera interminable entre las personas que escriben el código y las personas que lo analizan. Quién gana depende de quién se da por vencido antes.
Solo quería citar esto, porque esto es muy cierto :) "Por supuesto, todo esto es una carrera interminable entre las personas que escriben el código y las personas que lo analizan. Quien gana depende de quién se rinda antes". –
Ollydbg se encargará de tales situaciones.
La funcionalidad que está buscando es 'Analizar'. Volverá a desarmar las nuevas instrucciones en la ubicación y actualizará la ventana de la CPU con el código actualizado.
Supongamos que las instrucciones de la dirección X harán algunos cambios de auto modificación. Después de ejecutar esa instrucción, puede ejecutar el comando 'Analizar'. Este es un código para volver a desensamblar alrededor de ese bloque básico y actualizar la CPU con las instrucciones actualizadas.
Para analizar, haga clic derecho en la ubicación deseada en la ventana de la CPU y haga clic en Análisis> Analizar Código. El atajo es Ctrl-A.
- 1. gdb desmontar una línea
- 2. Ver tanto el código de ensamblado como el código C
- 3. Cómo fuerza una conexión CIFS para desmontar
- 4. ¿Cómo puedo obligar a GDB a desmontar?
- 5. git: switch branch sin desmontar head
- 6. Montar/Desmontar unidades USB con VBSCript
- 7. La mejor herramienta de Linux para desmontar ejecutables C++
- 8. Compilar, montar y desmontar utilizando la cadena de herramientas LLVM
- 9. Configurar/desmontar el esquema de Oracle para construir CI sin fragmentar el catálogo
- 10. Interpretar el valor de retorno (disidente) al intentar desmontar el volumen en OS X
- 11. Desmontar con python, ¿no es una solución fácil?
- 12. ¿Podemos desmontar (utilizando ILDasm) un conjunto NGen-ed?
- 13. Cómo configurar y desmontar temporalmente django db para pruebas unitarias?
- 14. ¿Herramienta para comparar .dlls y desmontar las diferencias?
- 15. ¿Cómo desarmo el código x86 sin formato?
- 16. ¿Por qué el compilador genera este código?
- 17. ¿Hay un objeto de función de C++ estándar para desmontar un std :: pair?
- 18. Mezclando el código de VB.net con el código de C#
- 19. ¿Cómo suprimir el análisis de código en el código generado?
- 20. código Java: buscando el código fuente
- 21. ¿Código incorrecto en el código de ejemplo de Apple?
- 22. ¿Cuál es la función de "mov eax, cr3; mov cr3, eax" en el código de ensamblaje x86?
- 23. ¿Cuál es la diferencia entre el código nativo, el código de máquina y el código de ensamblaje?
- 24. Analizando el Código de Eficiencia?
- 25. Recupere el código de ILGenerator
- 26. Obtener el código de REPL
- 27. ¿Es posible mezclar el código C89 con el código C99?
- 28. Diferencia entre el código nativo y el código administrado?
- 29. ¿El código es más rápido que el código en línea?
- 30. Rendimiento de invocar código no administrado desde el código administrado
Uno no desea criticar su pregunta demasiado duramente. Tal vez simplemente no lo entiendo! Sin embargo, puede que no sea el tipo de pregunta que uno puede responder en unos pocos párrafos. – thb