[ Delphi / Pascal ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by banned, 6 May 2007.

Thread Status:
Not open for further replies.
  1. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    Progeras - Вы шутник однако, Вы просите исходники со сменой точки входа, при
    том что Вы ничего не сделали для людей сидящих здесь? Вы думаете такой исход
    ник на дельфинчике стоит 50-100 рублей? Мне кажется это слишком самонадеянно.
    Ну а если по теме то в PE-файлах описывается специальное поле в PE-заголовке,
    в котором лежит RVA-(относительный виртуальный адрес) EP, с которого как бы и
    начинается выполнение. но мы то знаем, что Entry Point) выполняется не первой,
    а последней. До нее система загружает все статик библиотеки и выходят на испо
    лнение через Dllmain. TLS-k’и также получают управление до выполнения EP, кот
    орую Вы собираетесть сменить, только не понятно какой именно участок вашего ко
    да потеряет управление и EP будет некому вызывать, так как она будет указывать
    неизвестно на какой код. Вот только Вы не уточняете кто у Вас этот "Маша расте
    ряша", толи Dllmain или может быть TLS-callback.


    #*************************************************
    #define PE_off 0x3C // PE magic word raw offset
    #define EP_off 0x28 // relative Entry Point filed
    offset
    BYTE* GetEP()
    {
    static BYTE* base_x, *ep_adr;
    static DWORD pe_off, ep_off;
    char buf [_MAX_PATH];
    // obtain exe base address
    GetModuleFileName(0, buf, _MAX_PATH);
    base_x = (BYTE*) GetModuleHandle(buf);
    pe_off = *((DWORD*)(base_x + PE_off));
    ep_off = *((DWORD*)(base_x + pe_off + EP_off));
    ep_adr = base_x + ep_off; // RVA to VA
    return ep_adr;
    }
    #*************************************************

    Это простейший пример GetEP(), но только боевая функция чуть чуть посерьезнее,
    так как осуществляет такую огромную кучу всяких проверок. Но концепция приведе
    нная выше правильная. И конечно же в данном случае Вы спрячете много чего от
    отладчика, но бряк на ntdll, несработает, нет, нет, и еще раз нет, он пойдет
    лесом, так как адрес EP у нас совершенно другой. Да да, самый яркий пример, это
    когда парень в воскресенье подрывается с кровати и говорит, что емуу надо сроч
    но на работу, а потом не звонит. если быть подробнее, то ОС никак не информиру
    ет отладчик о передаче управления на EP и отладчик должен париться над этим сам
    остоятельно, а не просить об этом на форуме, но так как отладчик идет лесом, я
    и пишу свой обоснованный ответ, почему он туда пошел. Дизасемблирование тут то
    же мало поможет так как они(дизассемблеры) сразу начинают с ЕР. а вот тут-то
    без определения реальной ЕР не куда! Некоторые вири используют довольно хитрый
    трюк, они как акробаты в цирке прыгают jump из TLS-callback’а, то есть, на сам
    ом то деле они выполняют TLS-callback но без возврата управления. И в итоге на
    ша любимая, красивая, оригинальная(это я про себя) ЕР идет к бабушке с пирожка
    ми лесом и могут эти пиражки содержать что угодно (это я про ЕР). НО!!! НО!!!!
    Начиная с XP, системный загрузчик выполняет ряд проверок (дабы не дать мистеру
    смиту заразить матрицу)- и файлы, с точкой останова которые вылетают за преде
    лы страничного образа, он просто поылат и не грузит в память. Хотя тут все ут
    рированно, даже если бы он их грузил,то любой более менее нормальный авер, за-
    рычал бы на вашу безобидную антиотладочную систему, так как такая ЕР уж очень
    косо на него смотрит. Ну и какой смысл безобидную программу выдавать за вирус?
    Тогда конечно же лучше всего закинуть ЕР в безобидный код, а из TLS-callback’а
    совершить переход на тело.


    #*************************************************
    EntryPoint:
    XOR EAX, EAX
    PUSH EAX
    CALL d, ds:[ExitProcess]

    PassowrdBody:



    TLS_Callback1:
    ADD d, ds:[ESP+magic_offset], offset VirusBody
    — offset EntryPoint
    RETN 0Ch
    #*************************************************

    А вот после такого в США выбирают в президенты наштх афроамериканских друзей.
    Я не рассистка конечно же, но просто в первом случае мы бы имели позорный jump
    из TLS-callback’а. который бы потом пришлось маскировать с помощью математичес
    ких преобразований, но целевой адрес перехода декодируется однозначно и палит.
    А во втором случае TLS-callback добавляет какое-то значение к некоторой ячейке
    памяти, лежащей в области стека, и возвращает управление системе. Человек с от
    ладчиком чисто теоретически может трассировать миллионы тонн машинных инструк
    ций, ответственных за инициализацию файла. Он может даже дождаться момента пе
    редачи управления на точку входа или хотя бы область памяти, не принадлежащую
    системе, а находящуюся в границах PE-файла или одной из динамических библиотек.
    И тогда товарищ с удивлением обнаружит, что точка входа каким-то магическим об
    разом ушла в запой! Вот только трассировать придется долго. А Аверы ничего на
    скажут вашей маленькой приблуде, так как они не могут трассировать на живой ОС.
    Откуда им знать, что именно находится в данной конкретной ячейке памяти? А что,
    собственно говоря, там находится и как оно туда попадает?

    Только стоить это будет не 50 и не 100 рублей.
     
  2. KaZ@NoVa

    KaZ@NoVa Elder - Старейшина

    Joined:
    5 Jul 2008
    Messages:
    368
    Likes Received:
    438
    Reputations:
    -16
    легко. В разделе uses пишешь название юнита, содержащего эту форму.
    Например, если она находится в Unit1 пишешь
    uses Unit1.dcu;

    вот и всё=) :rolleyes:
     
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 Progeras там шутк 50 строк кода на асме для заражения шелкодом. И еще дохера строк шелкода который будет спрашивать пароль. ибо гемор с созданием формамы на API большой. При том что код должен быть позиционно независимый.
    Добавление новой секции не всегда правильный код. При сливании секций при компиле в Си бывает получается что места нету под вставку новой таблицы для своей секции. (пример - калькулятор)

    Кисто инфектор - как раз и будет стоить копейки, там нет ничего сложного, а вот сам шелкод - никто ипаться не будет из-за этого, т.к. возьни много.
     
    #3343 slesh, 4 May 2009
    Last edited: 4 May 2009
    1 person likes this.
  4. Zitt

    Zitt Elder - Старейшина

    Joined:
    7 May 2006
    Messages:
    736
    Likes Received:
    268
    Reputations:
    59
    у DBGrid не появляется горихонтальный скролбар.. хотя даные не все на экране... как его "включить" ? )
     
  5. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    в FormCreate попробуй установить свойство показа скрол бара.
    SetScrollRange(DBGrid1.Handle,SB_HORZ,0,100,true);
     
  6. Zitt

    Zitt Elder - Старейшина

    Joined:
    7 May 2006
    Messages:
    736
    Likes Received:
    268
    Reputations:
    59
    неа, не помогло(
     
  7. Tapaceuka

    Tapaceuka New Member

    Joined:
    13 Jan 2008
    Messages:
    111
    Likes Received:
    2
    Reputations:
    -6
    PASCAL

    PASCAL
    Вот задание:Билет называют «счастливым», если в его номере сумма первых трех цифр равна сумме последних трех. Подсчитать число тех «счастливых» билетов, у которых сумма трех цифр равна 13. Номер билета может быть от 000000 до 999999.
    Вот что я пока написал:
    Code:
    program tt;
    const a=001;b=009;
    var m:array[a..b] of integer;i,c:integer;
    begin
     for i:=a to b do m[i]:=i;
     for i:=a to b do 
      write(m[i]);
    end. 
    Всё, сам берёт и заполняет массив и выводит его. Но как зделать чтобы число 001 не преабразовывалось просто в однёрку ?
     
  8. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    если я не ошибаюсь и правильно понял задачу (посчитать кол-во счастливых билетов, у которых сумма первых трёх цифр равна сумме последних трёх цифр и равна 13), то ответ это..

    а нет. ошибаюсь. ща поправлю

    ((C из 15 по 2) - 3*(С из 4 по 1 + C_3 по 1 + C_2 по 1 +C_1 по 1))^2 = 75^2
    вот так правильно )
     
    #3348 desTiny, 5 May 2009
    Last edited: 5 May 2009
  9. warkk

    warkk Member

    Joined:
    20 Feb 2009
    Messages:
    139
    Likes Received:
    23
    Reputations:
    0
    Подскажите пожалуйста, как сделать что бы при запуске программы, она сразу сворачивалась трей?
     
  10. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Ты ппц спросил....
    Для начала, тебе надо научиться работать с треем), ну а далее затолкать функцию/код (сворачивания в трей) в какое нить событие.
    Ответ на уровне твоего вопроса :)
     
  11. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    юзай гугл!!!!!!!
    Delphi World (5005 статей по Delphi) статья "Иконка на TrayBar - пример"
    Там скрытие в трей(HideItemClick(Self)) делается при сворачивании формы.
    Сделай ты еще глобальную переменную. типа flag=false;
    и при событии OnPaint если flag=false пряч форму HideItemClick(Self);
    и делай flag=true; Это сделает так чтобы при первой прорисовке прожка скрылась. Хотя можно помудрить и в dpr файле чтобы форма не показывалась с самого начала и при OnCreate вставляешь HideItemClick(Self) но нужно тогда убрать скрытие формы
     
  12. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 Zitt попробуй переопределить методы этого компонента с созданием нового но с обработкой onpaint где будет показываться скролбар.
    Code:
    type
      TScrollBarDBGrid = class(TDBGrid)
      protected
        procedure Paint; override;
    end;
    
    procedure register;
    
    implementation
    
    procedure register;
    begin
      RegisterComponents('Samples', [TScrollBarDBGrid]);
    end;
    
    procedure TScrollBarDBGrid.Paint;
    begin
      SetScrollRange(Handle, SB_VERT, 0, 100, false);
      SetScrollRange(Handle, SB_HORZ 0, 100, false);
    или 
     ShowScrollBar(Handle, SB_HORZ, true);
     ShowScrollBar(Handle, SB_VERT, true);
      inherited;
    end;
    

    как вариант попробуй код, но не уверен что будет пахать
    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids, DBGrids;
    
    type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
      private
        FDBGridWndProc: TWndMethod;
        procedure DBGridWndProc(var Msg: TMessage);
    
        { Private declarations }
      public
       FShowHoriz: Boolean;
       FShowVert: Boolean;
    
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure Tform1.DBGridWndProc(var Msg: TMessage);
    begin
     ShowScrollBar(DBGrid1.Handle, SB_HORZ, FShowHoriz);
     ShowScrollBar(DBGrid1.Handle, SB_VERT, FShowVert);
     FDBGridWndProc(Msg);
    end;
    
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     FShowHoriz:=True;
     FShowVert:=True;
     FDBGridWndProc:=DBGrid1.WindowProc;
     DBGrid1.WindowProc:=FDBGridWndProc;
    end;
    
    end.
    
    
    протестить не могу т.к. под рукой нет никакой БД
     
  13. s.p.a.m

    s.p.a.m Banned

    Joined:
    26 Jan 2009
    Messages:
    6
    Likes Received:
    2
    Reputations:
    0
    Нужно закачать файл на ftp сервер с использованием wininet.
    Заранее спасибо!
     
  14. Kuzya

    Kuzya Elder - Старейшина

    Joined:
    27 Apr 2008
    Messages:
    166
    Likes Received:
    106
    Reputations:
    30
    Скажите пожалуйста как в Pascal можно сравнить 2 даты (формат дд-мм-гггг)? Нашёл в гугле что в Delphi за это отвечает модуль DateUtils, но в Pascal его нет =(
     
  15. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    http://www.cryer.co.uk/brian/delphi/wininet.htm
    мб тут что найдешь
     
  16. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Как можно проверить состояние канвы что бы не получать "Canvas does not allow drawing" ?
     
  17. Balvan

    Balvan Member

    Joined:
    11 Mar 2009
    Messages:
    66
    Likes Received:
    5
    Reputations:
    0
    ммм... а как именно сравнить?! что получить надо? Разницу в кол-ве дней, месяцев, лет или чего?! или просто сравнить true or false?!
     
  18. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 _nic попробуй заюзать
    try
    работа с канвой
    except
    обработка ошибки
    end;
     
  19. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 s.p.a.m -
    последовательносять команд
    InternetOpen
    InternetConnect
    FtpPutFile
    InternetCloseHandle
    описание и пример работы каждой функции есть в 5005 статей по делфи (Delphi World)
     
  20. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 Kuzya так открой в делфи этот модуль и погляди как сделано это там. Там в основном это примитивные функции которые можно свести к паскелевским довольно просто.
     
Thread Status:
Not open for further replies.