En fin, la cuestión está en que hace algún tiempo, encontré una aplicación que te escribia dos entradas en el archivos /etc/hosts para anular la publicidad proveniente de Spotify.
Cosa que Spotify no hace mucho ha arreglado, por lo que ahora cualquier canción nueva que tenga que ser reproducida no se va a escuchar al menos que los anuncios se reproduzcan antes.
Bueno, la cosa está en que no hace mucho encontré este repositorio (Spotify1710), lo estuve mirando así por encima, ya que yo de C++ tampoco entiendo mucho y bueno, pues lo probé y vi que no funcionaba (Spotify crashea) asi que me puse a hacer lo mismo pero en C#. (Quizás debería de probar una version más antigua de Spotify?, ya que hay varias releases...)
Según he visto como funciona esta utilidad lo que se hace es inyectar una (managed) DLL dentro un (unmanaged) proceso. Esto es posible gracias a una librería llamada "SharpNeedle"...
La cosa está en que todo funciona perfectamente... He creado hasta un sistema de sockets para recibir mensajes desde dentro del proceso de Spotify hasta una consola)...
Todo funcionaba, hasta el momento que dije de reimplementar la segunda parte que es la de modificar un método dentro de Spotify, el proyecto original utiliza Detours. Aquí es donde digo que creo que falla todo (tanto en mi version como en la versión hecha en C++ por Meik1710, como digo debería de probar versiones antiguas de Spotify).
Yo para esto utilizo un wrapper para .NET llamado "detours.net", con el cual ando un poco perdido como podréis comprobar: https://github.com/uta-org/SpotifySharper/blob/master/SpotifySharper.Injector/Tools/SpotifyPatchAds.cs#L186 (como veréis no tengo ni idea que puntero pasarle como parametro, he estado mirando el código original, pero como es posible obtener un puntero de una void? Yo he recreado esto con la clase "GCHandleProvider", pero vamos que estoy dando palos de ciego...)
Pero la cosa está en que dentro de lo que cabe, no todo está perdido, no he llegado a un punto muerto aún. (O quizás sí, no lo sé), el caso está en que Spotify me ha generado un archivo *.dmp por cada crash, pero el WinDbg no me muestra nada... Me muestra el siguiente error:
Citar
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(30e0.4a58): Access violation - code c0000005 (first/second chance not available)
For analysis of this file, run !analyze -v
The stored exception information can be accessed via .ecxr.
(30e0.4a58): Access violation - code c0000005 (first/second chance not available)
For analysis of this file, run !analyze -v
* El cual no entiendo *
Con VS2017 la cosa cambia, me muestra "The thread tried to read from or write to a virtual address for which it does not have the appropriate access.", lo que me quiere decir que el puntero que he usado para leer y modificar el metodo a traves del delegado era erroneo. (Es decir, esto --> lo mismo pero en C++, supuestamente lo he implementado bien no?)
Como puedo obtener el puntero de una función? O como puedo obtener a que módulo pertenece un una dirección de memoria especifica? (al menos para saber que debería probar de decompilar), la verdad que no estoy seguro de nada... Para ser sinceros, necesito ayuda de cerca. He estado mirando el PInvoke en busca de pistas (ya que dentro del Kernel32.dll existen metodos para obtener cosas parecidas, como por ejemplo: "GetModuleHandle", lo que se me ocurre quizás es probar a obtener la dirección de memoria para cada modulo, y acotar entre dos modulos una dirección de memoria, pero no se si daría resultado, lo daría?)
Otra de las cosas que me ralla del tema es que con detours.net, por lo visto el funcionamiento es bien sencillo:
Código
namespace myplugin { public static class Logger { // Declare your delegate public delegate int CoCreateInstanceDelegate( Guid rclsid, IntPtr pUnkOuter, int dwClsContext, Guid riid, ref IntPtr ppv ); // And now declare your hook public static int CoCreateInstance( Guid rclsid, IntPtr pUnkOuter, int dwClsContext, Guid riid, ref IntPtr ppv ) { // Call real function int result = ((CoCreateInstanceDelegate)DelegateStore.GetReal(MethodInfo.GetCurrentMethod()))(rclsid, pUnkOuter, dwClsContext, riid, ref ppv); Console.WriteLine(" {" + rclsid.ToString() + "} {" + riid.ToString() + "} " + result.ToString("x")); return result; } } }
Pero claro, como digo, los métodos "CmdAddTextGAIA", "CreateTrackPlayer", "OpenTrack", "CloseTrack", deben de estar definidos en alguno de los módulos que estan ejecutandose dentro de Spotify, que no son pocos según muestra Process Explorer: https://pastebin.com/qp8pha3H
Pero como digo no se como obtener dicho modulo, quizás este en el propio Spotify.exe... Voy a probar a usar algo de aquí, porque por lo visto Spotify se ha actualizado a una nueva version, la "1.1.10.540".
Un saludo.
Gracias por leer el tocho.