2010-10-14 18 views
0

J'écris sur un script MSN Plus, qui est en fait javascript. Pour une interopérabilité avec Windows, il existe une classe appelée Interop.
Avec sa fonction statique Call, on peut appeler la fonction spécifiée dans une DLL spécifiée avec jusqu'à 12 arguments.
Mon but est d'écrire un script qui obtient un nom de processus hors du PID.
J'ai tout fait correctement, mais ça ne marche toujours pas.msn plus script lecture/écriture mémoire

function GetProcNameFromPID(pid) 
{ 
    var hnd = Interop.Call("kernel32", "CreateToolhelp32Snapshot", 2, 0); 
    var handle = Interop.Call("kernel32", "GetCurrentProcess"); 
    var StructP = Interop.Allocate(4+4+4+4+4+4+4+4+4+260);//*Allocate space for the ProcessEntry32 struct* 
    var hnd_ptr = Interop.Allocate(4); 
    var ress = Interop.Call("kernel32", "WriteProcessMemory", handle, StructP, StructP.size.DataPtr, 4, hnd_ptr); 
    Debug.Trace(ReadInt(hnd_ptr, 0)); 
    var res = Interop.Call("kernel32", "Process32FirstW", hnd, StructP.DataPtr); 
    if(!res) 
    { 
     Debug.Trace("FAAAAIIIILLLLL/" + Interop.Call("kernel32", "GetLastError") + "/" + ress); 
    } 
    else 
    { 
     do 
     { 
      var pos = 0; 
      ReadInt(StructP, pos); 
      ReadInt(StructP, pos); 
      var owpid = ReadInt(StructP, pos); 
      ReadInt(StructP, pos); 
      ReadInt(StructP, pos); 
      ReadInt(StructP, pos); 
      var parpid = ReadInt(StructP, pos); 
      ReadInt(StructP, pos); 
      ReadInt(StructP, pos); 
      ReadInt(StructP, pos); 
      var name = ReadString(pos, 50); 
      if(pid == owpid) 
       return name; 
      StructP = Interop.Allocate(4+4+4+4+4+4+4+8+4+50); 
      Interop.Call("kernel32", "WriteProcessMemory", handle, StructP.DataPtr, StructP.size.DataPtr, 4, null); 
     } 
      while(Interop.Call("kernel32", "Process32NextW", hnd, StructP.DataPtr) == true) 
    } 
} 
function ReadInt(buffer, pos) 
{ 
var res = 0; 
    for(var i = 0; i >> 24; 
    var b2 = addr >> 24; 
    var b3 = addr >> 24; 
    var b4 = addr >> 24; 
    return b4 + b3*256 + b2*256*256 + b1*256*256*256; 
} 

La fonction Process32FirstW toujours proprement déroulée, mais le struct est vide. La fonction WriteProcessMemory réussit également. Mais le nombre d'octets écrits est toujours 0.

+0

Personne n'a d'idées? – alex

Répondre

1

Je n'ai pas une machine à tester des choses, mais votre première question est que vous ne semblez pas passer the proper parameters to WriteProcessMemory:

BOOL WINAPI WriteProcessMemory(
    __in HANDLE hProcess, 
    __in LPVOID lpBaseAddress, 
    __in LPCVOID lpBuffer, 
    __in SIZE_T nSize, 
    __out SIZE_T *lpNumberOfBytesWritten 
); 

Vous » re passer ...

handle => hProcess, 
StructP => lpBaseAddress, // ??? 
StructP.size.DataPtr => lpBuffer, // ??? 
4 => nSize, 
hnd_ptr => lpNumberOfBytesWritten 

Commençons par une vue d'ensemble WriteProcessMemory: Il est censé prendre un morceau de données dans le processus curent, pointé par lpBuffer, nTaille octets. Il copie ces données dans l'espace mémoire du processus indiqué par hProcess et place ces données à l'adresse lpBaseAddress dans ce processus cible.

Les problèmes que je vois avec votre code sont:

  1. lpBaseAddress doit être l'adresse dans un autre processus que vous écrivez. Puisque votre handle pointe vers le processus en cours, je ne sais même pas pourquoi vous appelez cette fonction pour commencer. Vous pouvez simplement utiliser StructP.WriteWORD(Offset, Data) pour écrire des données dans votre structure. Mais je présume que pour l'instant vous faites cela pour des fins de démonstration minimum pour voir si vous pouvez obtenir WriteProcessMemory() pour travailler.

  2. Je ne pense pas que ce code est même valide. StructP.size exists, but it's an int, not an object. Il n'a aucun membre DataPtr. StructP.DataPtr existe également. En fait, StructP.DataPtr is what is sent if you just specify StructP according to the help file. Donc, vous essayez d'écrire de la structure de retour à la structure, encore une fois, comme un test minimum? Dans ce cas, les deux pointeurs doivent être StructP

Après cela, je ne sais pas où la fonction ReadInt() que vous utilisez vient. Il me semble que Databloc a plusieurs fonctions membres pour la lecture des valeurs, mais vous les appeler comme: hnd_ptr.ReadWORD(0)

Je suis unsurprised que la structure est vide après avoir appelé Process32FirstW(), comme it checks the value of the dwSize member of the structure. Puisque vous n'écrivez pas correctement, je m'attends à ce que la valeur soit normalement 0, et donc aucune donnée n'est écrite. Je n'ai jamais joué avec Messger Plus, alors vous allez me pardonner un peu d'être dérangé par beaucoup de cela. Faites-moi savoir si tout cela était utile.

+0

Eh bien, j'essaie de faire un PID pour traiter le script du nom en combinaison avec d'autres scripts, cela peut être très utile. Pour l'instant j'ai délété la fonction WriteProcessMemory() et essayé avec StuctP.WriteDWORD (0,296); puis Interop.Call ("kernel32", "Process32FirstW", hnd, StructP.DataPtr); mais ça échoue toujours. Je ne sais vraiment pas quoi faire d'autre. – alex