Перейти к содержанию

Рекомендуемые сообщения

Может кому пригодится.. В свое время наткнулся на данный исходник. Название Code Cave Finder (2CFinder). Автор: NC22.
Программа ищет пустые области памяти конкретного приложения и проверяет их на доступность для записи. Приложение задается по названию окна.
 
Команды для патчера памяти (Кнопка "Инъекция")
[WriteTest|0] - выключить проверку , доступна ли память для записи ( не рекомендуется выключать )
[Path|00401433|90FF90D0D0D0FF] - второй параметр - оффсет памяти от которого запишется 90FF90D0D0D0FF 
(т.е. 00401433 - 90 00401434 - FF и т.д.)
[About] - связь с автором
 

program finder;uses  windows, messages, commctrl, SysUtils; //Используемые модули// Иконка//{$R 'icon.res'}var  WinClass : TWndClass; //переменная класса TWndClass для создания главного окна  hInst : HWND; //хандлер приложения  Handle : HWND; //локальный хандлер  Msg : TMSG; //сообщение  hFont : HWND; //хандлер шрифта  game : HWND; //TEdit  buff : array[0.. 127] of Char;  List : HWND; //TListBox  Button1 : HWND; //TButton  Button2 : HWND; //TButton  Edit1 : HWND; //TEdit  Edit2 : HWND; //TEdit  Syze : HWND; //TEdit//форма инжектора  Inj : HWND;  SMenu:HWND;  Label2 : HWND; //TLabel  code : HWND; //TMemo  inject : HWND; //TButton  WriteMemTest : byte;//  adress : HWND; //TEdit  function GetLen(source: String): integer;  begin        result:=Length(source);  end; (*function StrToHex(source: String): String;var i:integer;    c:Char;    s:String;begin    s := '';    for i:=1 to Length(source) do    begin      c := source[i];      s := s +  IntToHex(Integer(c),2)+' ';    end;    result := s;end;function StrToInt(const S: string): Integer;var  E: Integer;begin  Val(S, Result, E);end;  *)function Err(msg: PChar): byte;begin   MessageBox(Handle,msg,'Error',MB_OK or MB_ICONINFORMATION);   result := 1;end;procedure ShutDown; //процедура завершения программыbegin  DeleteObject(hFont); //удаление шрифта  UnRegisterClass('TAPIxForm', hInst); //удаление окна  ExitProcess(hInst); //закрытие программыend;procedure injector; //процедура завершения программыvar//adres:cardinal;content: string;WindowName : integer;i : integer;b : integer;skip:bool;adr: byte;writedbite : cardinal;write : cardinal;ProcessId : integer;HandleWindow : HWND;parsstate: byte;(*1 - считывание типа операции2 - Операция Path получение 1 параметра3 - Операция Path получение 2 параметра9 - обработка операции*)parspreget: string;parsget : array of array of string;{--------------parsget-----------[адрес операции]-----------[0] - название-----------[1] - параметр 1-----------[2] - параметр 2}//debug : cardinal;len: integer;lens: integer;begin//GetWindowText(adress,buff,255);//content:=buff;//if Length(content)=0 then begin Err('Задайте адрес'); Exit; end;//adres:=StrToInt('$'+buff);GetWindowText(code,buff,255);content:=buff;if Length(content)=0 then begin Err('Код инъекции не набран'); Exit; end;//небольшой парсер кода / возможно получит развитиеparspreget:='';parsstate:=0;//setlength(parsget,1,1);len:=0; For i := 1 to Length(content) do begin        if content[i]='[' then begin                if parsstate=0 then begin parsstate:=1; CONTINUE; end                else begin Err('Неожиданное начало операции'); Exit; end;        end;        if (parsstate=1) or (parsstate=2) or (parsstate=3) then begin                      if content[i]='|' then begin                        if parsstate = 1 then parsstate:=9                        else if parsstate = 2 then begin                                if parsget[len][0]='Path' then begin                                if parspreget = '' then begin Err('Поле параметра 1 пустое'); Exit; end;                                parsget[len][1]:=parspreget;                                parsstate:=3;                                end;                                parspreget:='';                        end;                      end                      else if content[i]=']' then begin                                if parsstate=3 then begin                                        if parspreget = '' then begin Err('Поле параметра 2 пустое'); Exit; end;                                        parsget[len][2]:=parspreget; parsstate:=0; len:=0; parspreget:=''; CONTINUE; end;                                if parsstate=2 then begin                                        if parsget[len][0]='WriteTest' then begin                                        WriteMemTest:=StrToInt(parspreget);                                        parsstate:=0;                                        parspreget:='';                                        end                                        else if parsget[len][0]='Path' then begin                                        Err('Недостаточно параметров для операции Path.  Используйте [Path|Адресс_Памяти|Данные]'); Exit;                                        end;                                end                                else if (parspreget='About') then begin Err('Автор NC22 (mail torrenttvi@gmail.com)  v1.0 beta'); Exit; end                                else begin Err(PChar('Неожиданный конец операции (код : '+IntToStr(parsstate)+')')); Exit; end;                      end                      else parspreget:=parspreget+content[i];        end;        if parsstate=9 then begin                if (parspreget='Path') or (parspreget='WriteTest') then begin                parsstate:=2;                len:=Length(parsget);                setlength(parsget,len+1);                setlength(parsget[len],3);                parsget[len][0]:=parspreget;                end                else begin Err(PChar('Неизвестная операция '+parspreget)); Exit; end;                parspreget:='';        end;    end;GetWindowText(game,buff,255);WindowName := FindWindow(nil,buff);If WindowName = 0 then begin Err('Процесс не найден'); Exit; end;        GetWindowThreadProcessId(WindowName,@ProcessId);        HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);len:=Length(parsget);SuspendThread(HandleWindow);       For i:= 0 to len do begin                if parsget[i][0]='Path' then begin                                lens:=Length(parsget[i][2]);                                adr:=0;                                skip:=false;                                For b:= 1 to lens do begin     //[Path|00401433|90FF90D0]    Otherside                                 if skip then begin skip:=false;  CONTINUE; end                                 else skip:=true;                                 writedbite:=StrToInt('$'+parsget[i][2][b]+parsget[i][2][b+1]);                                 WriteProcessMemory(HandleWindow, ptr(StrToInt('$'+parsget[i][1])+adr), @writedbite,sizeof(writedbite), write);                                 adr:=adr+1;                                end;                        end;        end;Err(PChar(string('ok'))); /// после цикла не двигается дальшеResumeThread(HandleWindow);CloseHandle(HandleWindow);//ShutDown;end;procedure Find;varstart:cardinal;fin:cardinal;m:cardinal;total: cardinal;WindowName : integer;ProcessId : integer;HandleWindow : HWND;write : cardinal;output : cardinal;prevm : cardinal;word: PChar;testmem:byte;begintestmem:=$00;GetWindowText(game,buff,255);WindowName := FindWindow(nil,buff);        If WindowName = 0 then begin Err('Процесс не найден'); Exit; end;GetWindowThreadProcessId(WindowName,@ProcessId);HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);SendMessage(List,lb_ResetContent,0,0);GetWindowText(Syze,buff,255); total:=StrToInt(buff); GetWindowText(Edit1,buff,255); start:=StrToInt('$'+buff);GetWindowText(Edit2,buff,255); fin:=StrToInt('$'+buff); m:=start; prevm:=0; while m <= fin do begin        ReadProcessMemory(HandleWindow,ptr(m),@output,1, write);        //SendMessage(List,lb_addstring,0,lParam(IntToHex(output, 1)+'|'+IntToHex(m, 8)+'|'+IntToStr(total)+'|'+IntToHex(write, 8)));       if (output=0) then begin          if prevm=0 then prevm:=m;        //  m:=m+total;       end       else if prevm<>0 then begin           word:=PChar(IntToHex(prevm, 8)+'-'+IntToHex(m-1, 8)+'('+IntToStr(m-prevm)+'б)');           if m-prevm>=total then           if WriteMemTest=1 then begin            if WriteProcessMemory(HandleWindow, ptr(prevm), @testmem,1, write) then                 SendMessage(List,lb_addstring,0,lParam(word));           end           else SendMessage(List,lb_addstring,0,lParam(word));           prevm:=0;         end; m:=m+1; end; word:=PChar(IntToHex(prevm, 8)+'-'+IntToHex(m-1, 8)+'('+IntToStr(m-prevm)+'б)'); if prevm>0 then if m-prevm>=total then SendMessage(List,lb_addstring,0,lParam(word)); CloseHandle(HandleWindow);end;function WindowProc(hwnd, msg, wparam, lparam: longint): longint; stdcall; //обработчик сообщенийbegin  case Msg of  WM_COMMAND:        case LoWord(wParam) of        3: if HiWord(wParam) = bn_Clicked then Injector;        1: if HiWord(wParam) = bn_Clicked then Find;        2: if HiWord(wParam) = bn_Clicked then begin        if Inj<>0 then Exit;                    Inj := CreateWindowEx(0, 'TAPIxForm', '2CFinder - Injector',WS_OVERLAPPEDWINDOW or WS_VISIBLE or WS_MINIMIZEBOX or WS_MAXIMIZEBOX or WS_SYSMENU,715, 117, 315, 244, 0, 0, Inj, nil); ShowWindow(Inj, SW_SHOW);SMenu := GetSystemMenu(Inj, FALSE);if (SMenu <> 0) thenDeleteMenu(SMenu, SC_CLOSE, MF_BYCOMMAND);Label2 := CreateWindow( 'Static','Синтаксис: [Path|Адресс|Данные]' ,WS_CHILD or SS_NOTIFY or SS_LEFT or WS_VISIBLE, 8, 8, 300, 13, Inj, 0, 0, nil);SendMessage(Label2, WM_SETFONT, hFont, 0);      // adress := CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','' ,WS_CHILD or ES_AUTOHSCROLL or WS_VISIBLE,48, 8, 241, 21, Inj, 0, 0, nil);SendMessage(adress, WM_SETFONT, hFont, 0);code := CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','' ,WS_CHILD or ES_MULTILINE or ES_WANTRETURN or ES_AUTOVSCROLL or WS_VISIBLE,8, 40, 281, 121, Inj, 5, 0, nil); SendMessage(code, WM_SETFONT, hFont, 0);inject := CreateWindow('Button','Инъекция',WS_CHILD or BS_TEXT or WS_VISIBLE,8, 168, 281, 33, Inj, 3, 0, nil);SendMessage(inject, WM_SETFONT, hFont, 0);                end;        end;  WM_DESTROY: ShutDown;  end;  Result := DefWindowProc(hwnd, msg, wparam, lparam);end;beginWriteMemTest:=1;hInst := GetModuleHandle(nil);  with WinClass do  begin   Style := CS_PARENTDC; //стиль класса главного окна   hIcon := LoadIcon(hInst, MAKEINTRESOURCE('APIXICON')); //иконка программы   lpfnWndProc := @WindowProc; //назначение обработчика сообщений   hInstance := hInst;   hbrBackground := COLOR_BTNFACE + 1; //цвет окна   lpszClassName := 'TAPIxForm'; //класс окна   hCursor := LoadCursor(0, IDC_ARROW); //активный курсор  end;InitCommonControls;RegisterClass(WinClass); //регистрация класса в системе// Создание главного окна программыHandle := CreateWindowEx(0, 'TAPIxForm', '2CFinder',WS_OVERLAPPEDWINDOW orWS_VISIBLE or WS_MINIMIZEBOX or WS_MAXIMIZEBOX or WS_SYSMENU,503, 117, 212, 352,0, 0,hInst, nil);SMenu := GetSystemMenu(Handle, FALSE);if (SMenu <> 0) thenDeleteMenu(SMenu, SC_MAXIMIZE, MF_BYCOMMAND);DeleteMenu(SMenu, SC_SIZE, MF_BYCOMMAND);// Создание шрифтаhFont := CreateFont(-11, 0, 0, 0, 0, 0, 0, 0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH or FF_DONTCARE, 'MS Sans Serif');game := CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','Название окна' ,WS_CHILD or ES_AUTOHSCROLL or WS_VISIBLE,8, 16, 177, 21, Handle, 0, hInst, nil);SendMessage(game, WM_SETFONT, hFont, 0);List := CreateWindowEx(WS_EX_CLIENTEDGE,'listbox','',WS_CHILD or WS_VISIBLE or LBS_EXTENDEDSEL or WS_VSCROLL,8, 88, 177, 185, Handle, 0, hInst, nil);SendMessage(List, WM_SETFONT, hFont, 0);Button1 := CreateWindow('Button','Искать',WS_CHILD or BS_TEXT or WS_VISIBLE,8, 280, 81, 25, Handle, 1, hInst, nil);SendMessage(Button1, WM_SETFONT, hFont, 0);Syze := CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','8' ,WS_CHILD or ES_AUTOHSCROLL or WS_VISIBLE,95, 280, 25, 25, Handle, 0, hInst, nil);SendMessage(Syze, WM_SETFONT, hFont, 0);Button2 := CreateWindow('Button','Инъекция',WS_CHILD or BS_TEXT or WS_VISIBLE,125, 280, 60, 25, Handle, 2, hInst, nil);SendMessage(Button2, WM_SETFONT, hFont, 0);Edit1 := CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','00400000' ,WS_CHILD or ES_AUTOHSCROLL or WS_VISIBLE,8, 40, 177, 21, Handle, 0, hInst, nil);SendMessage(Edit1, WM_SETFONT, hFont, 0);Edit2 := CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','004FFFFF' ,WS_CHILD or ES_AUTOHSCROLL or WS_VISIBLE,8, 64, 177, 21, Handle, 0, hInst, nil);SendMessage(Edit2, WM_SETFONT, hFont, 0);  // Цикл сбора сообщений  while(GetMessage(Msg, 0, 0, 0)) do  begin    TranslateMessage(Msg); //прием сообщений    DispatchMessage(Msg); //удаление сообщений из очереди  end;  end.
Изменено пользователем Chucky
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Было бы неплохо код убрать под спойлер и написать пояснение, что такое cc finder и зачем он нужен. Не уверен, что все с рождения это знают.

P.S.: Мелькнула мысль, что нам пора заводить отдельный "словарь терминов" где-нибудь на сайте.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.