2009-08-20 5 views
2

J'utilise Deviare de Nektra pour accrocher les appels de méthodes d'envoi de winsock. Mon idéia est d'apprendre à envoyer aussi des messages par le même socket que l'application originale. Donc ce que je fais c'est quand je détecte le premier appel à envoyer un message, je sauvegarde l'identifiant de socket (le premier argument de la fonction d'envoi), donc je peux l'utiliser plus tard.Envoyer une chaîne avec des sockets (pas si facile!)

Alors, voici mon code:

uint socket = 0; 

[DllImport("Ws2_32.dll")] 
private static extern int send(uint socket, string buf, int len, int flags); 

void _proxy_OnFunctionCalled(DeviareTools.IProcess proc, DeviareParams.ICallInfo callInfo, Deviare.IRemoteCall rCall) 
{ 
    socket = (uint)callInfo.Params.get_Item(0).Value; 
} 

et plus tard

int ret = send(socket, "ABC", 3, 0); 
    MessageBox.Show(ret.ToString()); 

Ce dernier est messagebox POPING toujours -1. Pourquoi devrait-il être cela?

Merci

modifier: l'appel retourne WSAGetLastError() 2. Ce que je ne sais pas ce que cela signifie, car il ne semble pas apparaître sur msdn.

Répondre

1

Essayez de faire

MessageBox.Show(socket.ToString()); 

aussi bien et assurez-vous que votre variable socket obtenu réglée. Je crois que l'erreur 2 est "fichier non trouvé", ce qui me suggère que vous avez un id de socket invalide, mais je pourrais me tromper à ce sujet.

+0

Il a une certaine valeur, 1564, en ce moment. –

+0

Eh bien, je fixe la valeur du socket à 123 et il apparaît la même erreur. Étrange. Alors peut-être que ça a quelque chose à voir avec l'id de la socket qui n'est pas valide? Je ne comprends pas pourquoi. –

0

WinSock doit être initialisé, un Socket doit être créé, une connexion doit être établie (sauf si votre socket est un SOCK_DGRAM), donc vous ne pouvez rien envoyer. De plus, les fonctions de l'API sont conçues pour fonctionner avec des données provenant de pointeurs (char *), assurez-vous qu'elles se produisent. Peut-être que "ABC" est déclaré comme un tableau WIDECHAR, un objet String ou quelque chose qui n'est pas un tampon (char *).

Il y a plein d'un exemple de connexion de base prise ici dans MSDN: http://msdn.microsoft.com/en-us/library/ms737625(VS.85).aspx

+0

Je pense que je n'ai rien à initialiser, souvenez-vous que j'utilise l'ID d'une socket qui a déjà été créée. –

+0

Oui, mais je pense que vous n'obtenez pas le point. Je ne demande pas comment envoyer des informations avec des sockets, je demande à hwo d'envoyer des informations après avoir l'ID de la prise que j'ai eu à accrocher une autre application. –

+0

Il devrait fonctionner très bien, s'il s'agissait d'un socket de données réel et prêt à envoyer. Peut-être que vous faites quelque chose d'autre qui ne va pas. Je construis plutôt mes propres méthodes pour APIHook, en fait j'ai déjà fait des filtres de sécurité et des solutions anti-triche pour les serveurs de jeux sans avoir accès à leur code, en utilisant seulement APIHook. – Havenard

0

Il pourrait un peu tard, mais le problème est que vous essayez d'utiliser un socket créé dans un processus différent. En utilisant Deviare vous obtenez un identifiant de socket d'un processus et vous essayez de l'utiliser dans votre processus. Cela ne fonctionne pas car les ID de socket ne sont valides que dans le processus où ils ont été créés.

Questions connexes