Me llama la atención, por que únicamente a mano?
Podrías ver el HEX el msngr.exe (o algo asi
). Después modificar lo y comparar las diferencias, para así saber que es lo que modifica el programa
Mensajes de éste tipo deberían ser borrados inmediatamente. Sin embargo, Al grano.
La verdad es que nunca había necesitado hacerlo, pero ya que estamos, lo hacemos . Evidentemente como ya dijo "
Tena" un buen método para saber si la ventana está activa sería utilizar la API
FindWindowA. Así que metes un BP en FindWindowA.
y parará aquí:
7E3AXXXX > 8BFF mov edi,edi
7E3AXXXX 55 push ebp
7E3AXXXX 8BEC mov ebp,esp
7E3AXXXX 33C0 xor eax,eax
7E3AXXXX 50 push eax
7E3AXXXX FF75 0C push dword ptr ss:[ebp+C]
7E3ADE92 FF75 08 push dword ptr ss:[ebp+8]
7E3ADE95 50 push eax
7E3ADE96 50 push eax
7E3ADE97 E8 4CFFFFFF call USER32.7E3ADDE8
7E3ADE9C 5D pop ebp
7E3ADE9D C2 0800 retn 8
Nota:
La dirección no tiene porque ser esa, pones CTRL + G y escribes "FindWindowA" y verás tu dirección en OllyDBG .
Una vez paras ahí retornamos al código principal, si vemos que vamos a entrar en módulos .dll hacemos "
CTRL + F4 y F7" (ésta combinación ejecuta el código hasta el siguiente RETORNO y ejecuta una instrucción para caer en la zona que llamó a la API), si vamos hacia el EXE hacemos "
ALT + F9 " (ésto ejecuta código hasta llegar a cualquier línea del modulo principal (msnmsgr.exe).
y llegamos.
00548828 > \6A FF push -1 ; /Timeout =INFINITE
0054882A . FF73 24 push dword ptr ds:[ebx+24] ; |hObject
0054882D . FF15 F4144000 call ds:[<&KERNEL32.WaitForSingleObject>] ; \WaitForSingleObject
00548833 . 83F8 FF cmp eax,-1
00548836 . 0F84 96000000 je msnmsgr.005488D2
0054883C . 57 push edi ; /Title
0054883D . 68 F8885400 push msnmsgr.005488F8 ; |Class = "MSNMSGRBlObj"
00548842 . FF15 78174000 call ds:[<&USER32.FindWindowA>] ; \FindWindowA
00548848 . 8BF0 mov esi,eax ; EAX = 001902EE
Bueno siendo breves he marcado en negrita las 2 lineas importantes, la primera es la línea desde donde viene un salto condicional, y la segunda es donde caemos, es decir, justo debajo de la llamada a
FindWindowA.
Como no quiero extenderme mucho explicaré lo que hay que hacer rápidamente, os colocáis en la línea primera que he marcado (
00548828), y dáis a CTRL + R o CTRL + J (para los que tengan el plugin), cualquiera de las dos os sacará la dirección de quien llama ahí, dais intro y llegáis al salto:
00543CCB > /68 78D75500 push msnmsgr.0055D778 ; /EventName = "MSNMSGR"
00543CD0 . |57 push edi ; |InitiallySignaled
00543CD1 . |6A 01 push 1 ; |ManualReset = TRUE
00543CD3 . |57 push edi ; |pSecurity
00543CD4 . |FF15 3C144000 call ds:[<&KERNEL32.CreateEventA>] ; \CreateEventA
00543CDA . |3BC7 cmp eax,edi
00543CDC . |8B5D E8 mov ebx,ss:[ebp-18]
00543CDF . |8943 24 mov ds:[ebx+24],eax
00543CE2 . |0F84 EA4B0000 je msnmsgr.005488D2
00543CE8 . |FF15 8C154000 call ds:[<&KERNEL32.GetLastError>] ; [GetLastError
00543CEE . |3D B7000000 cmp eax,0B7
00543CF3 . |0F84 2F4B0000 je msnmsgr.00548828 ; EAX = 0B7
Bueno aquí rápidamente la cosa es que crea el evento MSNMSNGR y si ha habido algun error lo recupera, y si nos devuelve 0B7 (como que hay otra instancia abierta) nos manda a checkear el FindWindow, y luego nos hace un POSTMESSAGE para poner la ventana por delante de las demás. Así que lo que hay que hacer es nopear ese salto o cambiar la comparación o lo que preferáis.
Para los más vagos, incluso hay sitio para vosotros... SOLUCION:
- Abrid el proceso msnmsngr.exe en OllyDBG.
- Subis la barra al principio y pulsáis "CTRL + B" y teniendo ésta cadena en el portapapeles "3B C7 8B 5D E8 89 43 24 0F 84 ?? ?? ?? ?? FF 15 ?? ?? ?? ?? 3D B7 00 00 00 0F ?? ?? ?? ?? ??" le dáis a "Mayus + Ins".
- Cambiáis el salto en funcion de lo que veáis (en Windows Live, nopeais en MSN Messenger cambiadlo por un JMP).
En cualquier caso hice un parche para todas las versiones:
MSN Messenger y Windows Live Messenger MultiInstance PatchSalu2..