Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 сентября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.

Символ | Входной | Выходной аргумент

 
 преобразования| аргумент   |
 
 ---------------------------------------------------------------------
 
                 числовые данные
 
 ---------------------------------------------------------------------
 
      d        |  целое     | целое десятичное со знаком
 
      i        |  целое     | целое десятичное со знаком
 
      o        |  целое     | целое восьмеричное без знака
 
      u        |  целое     | целое десятичное без знака
 
      x        |  целое     | целое шестнадцатеричное без знака
 
               |            | (с буквами a, b, c, d, e, f)
 
      X        |  целое     | целое шестнадцатеричное без знака
 
               |            | (с буквами A, B, C, D, E, F).
 
      f        |с плавающей | значение со знаком в форме [-]dddd.
 
               |  точкой    | dddd
 
      e        |с плавающей | значение со знаком в форме [-]d.dddd
 
               |  точкой    | e[+/-]ddd
 
      g        |с плавающей | значение со знаком либо в форме f, либо
 
               |  точкой    | в форме e, с данным значением и точнос-
 
               |            | тью. Хвостовые нули и десятичная точка
 
               |            | печатаются только при необходимости
 
      E        |с плавающей | так же, как в случае e, только с буквой
 
               |  точкой    | E для обозначения степени
 
      G        |с плавающей | так же, как в случае g, только с буквой
 
               |  точкой    | E для обозначения степени
 
 ---------------------------------------------------------------------
 
 
 
                           Символьные данные.
 
 ---------------------------------------------------------------------
 
      C        | символьное | один символ
 
      S        | указатель  | печатает символы до тех пор, пока не
 
               | на строку  | встретится нулевое окончание, либо не
 
               |            | будет достигнута точность.
 
      %        | нет символа| печатается только знак %.
 
 ---------------------------------------------------------------------
 
 
 
                               Указатели
 
 ---------------------------------------------------------------------
 
      n        | указатель  | сохраняется (по адресу, указанному во
 
               | на целое   | входном аргументе) кол-во только что за-
 
               |            | писанных символов.
 
      P        | указатель  | печатает входной аргумент,как указатель;
 
               |            | дальние указатели печатаются, как
 
               |            | XXXX:YYYY, ближние указатели печатаются,
 
               |            | как YYYY (только смещение).
 
 ---------------------------------------------------------------------
 
 
 
                                 Соглашения.
 
 
 
                    В нижеследующей   таблице   перечислены  некоторые
 
                    соглашения, сопровождающие данные спецификации.
 
 
 
  ---------------------------------------------------------------------
 
   Символы   |     Соглашения
 
  ------------+--------------------------------------------------------
 
  e или E    | аргумент преобразуется в соответствии с шаблоном:
 
             | [-]d.ddd...e[+/-]ddd, где
 
             | - одна цифра предшествует десятичной точке;
 
             | - число цифр после десятичной точки равно точности;
 
             | - степень всегда содержит три цифры.
 
     f       | аргумент преобразуется в десятичную форму в соответст-
 
             | вии с шаблоном [-]ddd.ddd..., где число десятичных
 
             | цифр после запятой равно точности (если дана ненулевая
 
             | точность).
 
  g или G    | аргумент печатается по принципу e, E или f, с точнос-
 
             | тью, обозначающей число значащих цифр.
 
             | Хвостовые нули удаляются, десятичная точка ставится
 
             | только при необходимости.
 
             | аргумент печатается по принципу e или f (с некоторыми
 
             | ограничениями), если символ преобразования g; и по
 
             | принципу E, если символ преобразования G.
 
             | Принцип e используется только в том случае, если экспо-
 
             | нента, полученная в результате либо а) больше, чем точ-
 
             | ность; б) меньше чем -4.
 
  x или X    | Для преобразований типа x - в выводе будут буквы a, b,
 
             | c, d, e.
 
             | Для преобразований типа X - в выводе будут буквы A, B,
 
             | C, D, E.
 
  ----------------------------------------------------------------------
 
 
 
                    Замечание. Неопределенные  значения  с   плавающей
 
                    точкой  печатаются как +INF или -INF.  Не числа по
 
                    IEEE печатаются как +NAN или -NAN.
 
 
 
                              Символы - флаги.
 
 
 
                    Символы - флажки это минус(-),  плюс(+), диез(#) и
 
                    пусто(  );  Они могут появляться в любом порядке и
 
                    комбинации.
 
 
 
  ---------------------------------------------------------------------
 
  Флаг      |      Что это означает
 
  -----------+---------------------------------------------------------
 
    -       | Левое выравнивание результата, пробелы остаются справа.
 
            | Если не задан, результат выравнивается справа, заполня-
 
            | ется пробелами или нулями слева.
 
    +       | Знаковое преобразование - результат всегда начинается со
 
            | знака (+) или (-).
 
    пусто   | Если значение неотрицательно, вывод начинается с пробе-
 
            | ла вместо плюса; отрицательные значения всегда начина-
 
            | ются со знака минус.
 
    #       | Специфицирует, что преобразуемый аргумент используется в
 
            | "альтернативной" форме. Смотрите следующую таблицу.
 
  ---------------------------------------------------------------------
 
 
 
                    Примечание. Знак плюс имеет приоритет над пробелом
 
                    в обоих случаях.
 
 
 
                    Альтернативная форма.
 
 
 
                    Если флаг  #  используется   вместе   с   символом
 
                    преобразования,   при   конвертировании  аргумента
 
                    (arg) это даст следующий результат:
 
 
 
  ---------------------------------------------------------------------
 
  Символ           |    Как # влияет на результат
 
  преобразования   |
 
  ------------------+--------------------------------------------------
 
 c, s, d, i, u     | Не оказывает влияния.
 
       0           | 0 предшествует ненулевому arg
 
     x или X       | 0x (или 0X) предшествует arg
 
   e, E или f      | Результат всегда будет содержать десятичную точ-
 
                   | ку, даже если за точкой не следует никаких цифр.
 
                   | Обычно, десятичная точка появляется в результате,
 
                   | только если за ней следует цифра.
 
    g или G        | Аналогично e или E, с дополнением, что хвостовые
 
                   | нули не удаляются.
 
  ---------------------------------------------------------------------
 
 
 
                    Спецификация ширины.
 
 
 
                    Спецификация ширины    устанавливает   минимальную
 
                    ширину поля для выводимого значения.
 
 
 
                    Ширина задается одним из двух способов:
 
 
 
                    - непосредственно, с помощью строки десятичных
 
                      цифр;
 
 
 
                    - или косвенно с помощью знаков (*).
 
 
 
                    Если вы используете звездочку (*) для спецификации
 
                    ширины,  следующий  аргумент  в   вызове   функции
 
                    (который должен быть целым) определяет минимальную
 
                    ширину  выводного  поля.
 
 
 
                    Не существующая или недостаточная ширина поля ни в
 
                    коем  случае  не  приведет  к усечению поля.  Если
 
                    результат шире,  чем объявленная ширина поля, поле
 
                    будет просто продолжено до необходимой ширины.
 
 
 
  ---------------------------------------------------------------------
 
  Спецификация |       Как это влияет на ширину вывода
 
  ширины       |
 
  --------------+------------------------------------------------------
 
    n          | Печатаются по крайней мере n символов. Если выводи-
 
               | мое значение меньше, чем n символов, вывод заполня-
 
               | ется пробелами (выравнивание справа, если задан флаг
 
               | "-", в противном случае - левое выравнивание).
 
    0n         | Печатается по крайней мере n символов. Если выводное
 
               | значение содержит менее n символов, оно заполняется
 
               | слева нулями.
 
    *          | Спецификация ширины ставится в списке аргументов
 
               | перед соответствующим аргументом.
 
  ---------------------------------------------------------------------
 
 
 
                           Спецификация точности.
 
 
 
                    Спецификация точности всегда  начинается  с  точки
 
                    (.),  отделяющей ее от предшествующей спецификации
 
                    ширины.  Затем спецификация точности также,  как и
 
                    ширины,  задается либо непосредственно,  с помощью
 
                    строки десятичных цифр,  либо косвенно - с помощью
 
                    знака   звездочки   (*).   Если  для  спецификации
 
                    точности  используется  звездочка  (*),  следующий
 
                    аргумент  в  вызове  функции  (обязательно  целый)
 
                    определяет точность.
 
 
 
                    Если вы используете звездочки для задания точности
 
                    или ширины,  или для обеих спецификаций,  аргумент
 
                    должен      следовать      непосредственно      за
 
                    соответствующим спецификатором.
 
 
 
  ---------------------------------------------------------------------
 
  Спецификация  |        Как это влияет на вывод
 
  точности      |
 
  ---------------+-----------------------------------------------------
 
  (не дана)     | Точность устанавливается по умолчанию (стандартно
 
                | =1 для типов d, i, o, u, x, X;
 
                | =6 для типов e, E, f;
 
                | = все значащие цифры для типов g, G;
 
                | = печать первого нулевого символа для типа S;
 
                |   не влияет на тип c)
 
     .0         | Для типов d, i, o, u, x точность устанавливается по
 
                | умолчанию.
 
                | Для типов e, E, f десятичная точка не печатается.
 
     .n         | Печатаются n символов или n десятичных знаков; если
 
                | выводимое значение содержит больше n символов, оно
 
                | может быть усечено или округлено. (Случится это или
 
                | нет, зависит от символьного типа).
 
      *         | Спецификация точности задается в списке аргументов,
 
                | причем она предшествует значению форматируемого ар-
 
                | гумента.
 
  ---------------------------------------------------------------------
 
 
 
                    Замечание. Если   указана   нулевая   точность,  и
 
                    спецификатор формата для целого значения (т.е.  d,
 
                    i,  o,  u, x), и печатаемое значение равно 0, то в
 
                    этом случае не будут  выводится  цифровые  символы
 
                    (т.е. поле будет пустое).
 
 
 
  ---------------------------------------------------------------------
 
  Символ        | Как спецификация точности влияет на преобразование
 
 преобразования |
 
  ---------------+-----------------------------------------------------
 
      d         | .n показывает, что будет напечатано по крайней мере
 
      i         | n цифр. Если выводимый аргумент имеет менее n цифр,
 
      o         | свободные места в выводе забиваются слева нулями.
 
      u         | Если же выводимый аргумент имеет больше n цифр, вы-
 
      x         | ходное значение не усекается.
 
      X         |
 
                |
 
      e         | .n показывает, что после десятичной точки будет на-
 
      E         | печатано n символов, причем последняя цифра округ-
 
      f         | ляется.
 
                |
 
      g         | .n определяет, что будет напечатано максимально n
 
                | значащих цифр.
 
      G         |
 
                |
 
      c         | .n не имеет влияния на вывод
 
                |
 
      s         | .n определяет, что будет напечатано не больше, чем
 
                |  n символов.
 
  ---------------------------------------------------------------------
 
 
 
                        Модификатор входного размера.
 
 
 
                    Символ - модификатор входного размера (F,  N, h, l
 
                    или   L)   дает   размер   последующего   входного
 
                    аргумента:
 
 
 
                    F = дальний указатель;
 
                    N = ближний указатель;
 
                    h =  короткое целое;
 
                    l = длинное целое;
 
                    L = длинное двойной точности;
 
 
 
                    Модификаторы входного размера (F,  N,  h,  l и  L)
 
                    влияют  на  то,  каким  образом  функции ...printf
 
                    интерпретируют   тип    данных    соответствующего
 
                    входного   аргумента   arg.  Модификаторы  F  и  N
 
                    применяются только к тем входным  аргументам  arg,
 
                    которые  представляют  собой  указатели (%p,  %s и
 
                    %n).  Модификаторы h, l и L применяются к числовым
 
                    аргументам (целые и с плавающей точкой).
 
 
 
                    Оба модификатора  F  и  N  интерпретируют  входной
 
                    аргумент arg.  Обычно,  для преобразований %p, %s,
 
                    или  %n  аргумент arg - это указатель стандартного
 
                    размера  для  соответствующей  модели  памяти.   F
 
                    означает:   "интерпретировать   arg,  как  дальний
 
                    указатель".  N означает: "интепретировать arg, как
 
                    ближний указатель".
 
 
 
                    Модификаторы h, l и L отвергают стандартный размер
 
                    числовых  данных  входных  аргументов:   l   и   L
 
                    применяется к целым типам данных (d,  i,  o, u, x,
 
                    X) и типам данных с плавающей точкой (e, E, f, g и
 
                    G),  в  то  время как h применяется только к целым
 
                    данным.  Ни h,  ни l-  модификаторы  не  оказывают
 
                    никакого   влияния   на   типы  символов(c,s)  или
 
                    указателей(p,n).
 
 
 
  ---------------------------------------------------------------------
 
  Модификаторы     |       Как  интерпретируется аргумент
 
 входного размера  |
 
  ------------------+--------------------------------------------------
 
       F           | аргумент arg читается, как дальний указатель.
 
       N           | аргумент arg читается, как ближний указатель.
 
                   | в сверх-больших моделях памяти N  не может ис-
 
                   | пользоваться ни с каким типом преобразований.
 
       h           | для типов преобразований d, i, o, u, x, X аргумент
 
                   | arg интерпретируется, как короткое целое;
 
       l           | для типов преобразований d, i, o, u, x, X аргумент
 
                   | интерпретируется, как длинное целое;
 
                   | для типов преобразований e, E, f, g, G аргумент ин-
 
                   | терпретируется как число двойной точности.
 
       L           | интерпретирует arg как длинное с двойной точ-
 
                   | ность для типов преобразований e, E, f, g, G.
 
  ---------------------------------------------------------------------
 
 
 
 
 
 Возвращаемое       Каждая функция возвращает количество выводимых
 
 значение           байт. В случае ошибки printf возвращает EOF.
 
 
 
 Переносимость      printf поддерживается на системах UNIX и определена
 
                    в стандарте   Кернигана  и  Ритчи.  Поддерживается
 
                    стандартом  ANSI  C.  Функция  не   совместима   с
 
                    Windows.
 
 
 
 Смотрите также     cprintf, ecvt, fprintf, fread, fscanf, putc, puts,
 
                    putw, scanf, sprintf, vprintf, vsprintf.
 
 
 
 Пример:
 
 
 
 #define I 555
 
 #define R 5.5
 
 
 
 int main(void)
 
 {
 
    int i, j, k, l;
 
    char buf[7];
 
    char *prefix = &buf;
 
    char tp[20];
 
    printf("prefix   6d   6o   8x   10.2e   10.2f\n");
 
    strcpy(prefix, "%");
 
    for (i=0; i<2; i++){
 
      for (j=0; j<2; j++)
 
       for (k=0; k<2; k++)
 
        for (l=0; l<2; l++)
 
        {
 
          if (i==0)  strcat(prefix,"-");
 
          if (j==0)  strcat(prefix,"+");
 
          if (k==0)  strcat(prefix,"%");
 
          if (l==0)  strcat(prefix,"0");
 
          printf("%5s !",prefix);
 
          strcpy(tp, prefix);
 
          strcat(tp, "6d !");
 
          printf(tp, I);
 
          strcpy(tp,"");
 
          strcpy(tp, prefix);
 
          strcat(tp, "6o !");
 
          printf(tp, I);
 
          strcpy(tp,"");
 
          strcpy(tp,prefix);
 
          stpcat(tp, "8x !");
 
          printf(tp,I);
 
          stpcry(tp,"");
 
          stpcry(tp, prefix);
 
          strcat(tp, "10.2e !");
 
          printf(tp, R);
 
          strcpy(tp, prefix);
 
          strcat(tp, "10.2f !");
 
          printf(tp,R);
 
          printf(" \n");
 
          stpcry(prefix, "%");
 
         }
 
    }
 
 }
 
 
 
 prefix     6d    6o      8x        10.2e       10.2f
 
 %-+#0 !+00555 !01053  !0x0022b  !+5.50e+000 !+000005.50 !
 
  %-+# !+555   !01053  !0x22b    !+5.50e+000 !+5.50      !
 
  %-+0 !+00555 !01053  !000022b  !+5.50e+000 !+000005.50 !
 
   %-+ !+555   !1053   !22b      !+5.50e+000 !+5.50      !
 
  %-#0 !000555 !001053 !0x00022b !05.50e+000 !0000005.50 !
 
   %-# !555    !01053  !0x22b    !5.50e+000  !5.50       !
 
   %-0 !000555 !001053 !0000022b !05.50e+000 !0000005.50 !
 
    %- !555    !1053   !22b      !5.50e+000  !5.50       !
 
  %+#0 !+00555 ! 01053 ! 0x0022b !+5.50e+000 !+000005.50 !
 
   %+# !  +555 ! 01053 !   0x22b !+5.50e+000 !     +5.50 !
 
   %+0 !+00555 ! 01053 ! 000022b !+5.50e+000 !+000005.50 !
 
    %+ !  +555 !  1053 !     22b !+5.50e+000 !     +5.50 !
 
   %#0 !000555 !001053 !0x00022b !05.50e+000 !0000005.50 !
 
    %# !   555 ! 01053 !   0x22b ! 5.50e+000 !      5.50 !
 
    %0 !000555 !001053 !0000022b !05.50e+000 !0000005.50 !
 
     % !   555 !  1053 !     22b ! 5.50e+000 !      5.50 !


<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS