Details par catégorie : Code
| Titre | Date de publication | ||
|---|---|---|---|
| Details | Décrypter les cookies Commerce Server 2002 |
Comment décrypter le contenu des cookies MSCSAuth Commerce Server 2002 sans l'avoir installé. C'est bien sûr encrypté avec la clef que l'on peut trouver dans la configuration : Encryption Key for Cookie Data Cliquez sur les images pour y voir clair.
L'appel à CryptCreateHash prends en paramètre (comme d'habitude les derniers sont les premiers) :
Avec tout ce travail on ne va garder que la clef donc notre [ebp+08h], le reste c'est poubelle c'est pour ça qu'on voit un appel a CryptDestroyHash que je ne vais pas expliquer. On remonte là d'oû on est parti, c'est a dire au moment ou l'on trouve l'appel a HrImportSessionKey, un peu plus bas on découvre des appels à CryptDecrypt, enfin. Les appel a CryptDecrypt prennent en paramètres :
Vous trouverez ici le code c# qui permet de le faire en utilisant les pInvoke sur ADVAPI32.dll Si vous avec l'équivalent en pur c# sans pInvoke je suis preneur. |
2/6/2010 12:43 PM |
| Details | EventHandler 2 le retour |
Afin de conclure sur le sujet des EventHandler Voici la version formatée et testée du code de Vincent voir le commentaire du post précédent. EventHandler handler = queryControl1.CompletedHandler; foreach (EventInfo eventInfo in MdfAPIClient.GetType().GetEvents()) { Delegate del = Delegate.CreateDelegate(eventInfo.EventHandlerType, queryControl1, handler.Method); eventInfo.AddEventHandler(MdfAPIClient, del); } Evidemment c’est beaucoup plus lisible et c’est bien sur la meilleure façon de faire :) Cela peux même tenir en une ligne si on veux : MdfAPIClient.GetType().GetEvents().ToList().ForEach(evnt => evnt.AddEventHandler(MdfAPIClient, Delegate.CreateDelegate(evnt.EventHandlerType, queryControl1, ((EventHandler)queryControl1.CompletedHandler).Method))); |
1/18/2010 9:07 AM |
| Details | EventHandler générique |
Récemment pendant le développement d’un client de test pour un web service, je me suis retrouvé à devoir appeler une même fonction pour tout les évènements *Completed du proxy, le problème est que les EventHandlers du proxy ont tous un prototype différent : public delegate void PrepareSearchCompletedEventHandler(object sender, PrepareSearchCompletedEventArgs e); Dans notre cas c’est le 2ème argument qui est typé sur chaque EventHandler. Quel est l’utilisation pratique d’une telle bidouille ? Cela me permet simplement de mettre à jour un control avec le contenu SOAP de la réponse du service, un peu comme une fenêtre de log. Voici la fonction que je souhaite appeler pour chacun de ces évènements : public void CompletedHandler(object sender, object e); Et voila comment j’ai fait :
// Pour chaque events foreach (EventInfo eventInfo in MdfAPIClient.GetType().GetEvents()) { // Je prends une liste des paramètre du handler List<Type> param = (from t in eventInfo.EventHandlerType.GetMethod("Invoke").GetParameters() select t.ParameterType). ToList(); // J’y ajoute le type qui déclare la fonction que je souhaite appeler // c’est avec cet argument que l’on passera notre instance param.Insert(0, typeof(QueryControl)); // Je déclare ma DynamicMethod avec // le 1er argument est le nom de la méthode pas utile // le 2nd est le type de retour de cette methode // le 3ème est le tableau de type d’arguments // le 4ème le type a qui la méthode sera appropriée System.Reflection.Emit.DynamicMethod handler = new DynamicMethod("", typeof(void), param.ToArray(), typeof(QueryControl)); // On recupere le générateur IL ILGenerator ilGenerator = handler.GetILGenerator();
// Je récupere la méthode que je souhaite appeler ici c’est CompletedHandler du type QueryControl MethodInfo genHandler = typeof(QueryControl).GetMethod("CompletedHandler"); // Début du contenu de l’event dynamique // Je re-empile les arguments avec lesquels on m’a appelé (l’instance, le 1er arg (sender), le 2nd arg un type dérivé de EventArgs (e) ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit(OpCodes.Ldarg_1); ilGenerator.Emit(OpCodes.Ldarg_2); // On appel la fonction souhaité ilGenerator.Emit(OpCodes.Call, genHandler); // Puis on Retourne ilGenerator.Emit(OpCodes.Ret); // Pour finir on ajoute notre eventhandler a notre proxy : MdfAPIClient eventInfo.AddEventHandler(MdfAPIClient, handler.CreateDelegate(eventInfo.EventHandlerType, queryControl1)); } Tout ça pour éviter d’écrire : { MonProxyWS proxy = new MonProxyWS(); // Puis pour chaque EventHandlers XXX proxy.XXXCompleted += new XXXCompletedEventHandler(proxy_XXXCompleted); } // Ainsi que mon event target différent aussi pour chaque XXX void proxy_XXXCompleted(object sender, XXXCompletedEventArgs e) { queryControl1.CompletedHandler(sender, e); }
Soit beaucoup de code redondant et sans valeur ajoutée. Il y a peu être une méthode plus simple ou une implémentation plus claire/propre, dans ce cas laissez un commentaire
Edit :
Une autre méthode aurait été de faire un Tracelistener qui débite dans le controle voulu, et d'activer les traces network comme ici. Bien sur il existe un tas de trace sources et switches à tous les niveaux, faîtes votre choix. |
1/12/2010 1:29 PM |








Viadeo