1. Pascal / Говнокод #3750

    +108

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    ...
    var
     fileName  :string;                // имя файла
     mes       :string;                // текст мессаги
     capt      :string;                // заголовок мессаги
     f         :thandle;
     fils      :integer;
     BytesRead :D WORD;
     c         :byte;
    begin
     writeln('enter filename:');      // просим ввести имя файла
     readln(fileName);                // в fileName заносим имя файла
     if not fileexists(fileName) then // если он несуществует
      begin
      writeln('file not found :( ');   // виводит предупреждение
      readln;
      exit;                           // закриваем прогу
      end;
     writeln('');                              // просим ввесли текст мессаги
     writeln('enter message text (max 10):');  // максмальна длина 10 символов(так как в Project1.exe для нее зарезирвировано 10 байт) потому что длина HelloWorld=10
     readln(mes);
     writeln('');                                 // просим ввести заголовок мессаги
     writeln('enter message caption (max 10):');  // опять максимальная длина 10 символов
     readln(capt);
    
     f:=fileopen(fileName,fmOpenReadWrite);  // откриваем fileName
     fils:=Windows.GetFileSize(f,nil);       // получаем размер
     writeln('size = '+inttostr(fils)+'b');  // виводим размер
    
     // патчим байти для мессаги
     // $2848,$2849,$284A,$284B,$284C,$284D,$284E,$284F,$2850,$2851
     c:=ord(char(pchar(mes[1])));             // патчим первий байт
     SetFilePointer(f, $2848, nil, 0);
     WriteFile(f, c, SizeOf(c), BytesRead, nil);
    
     c:=ord(char(pchar(mes[2])));             // патчим второй (2) байт
     SetFilePointer(f, $2849, nil, 0);
     WriteFile(f, c, SizeOf(c), BytesRead, nil);
    
     c:=ord(char(pchar(mes[3])));             // патчим 3 байт
     SetFilePointer(f, $284A, nil, 0);
     WriteFile(f, c, SizeOf(c), BytesRead, nil);
    
     c:=ord(char(pchar(mes[4])));             // патчим 4 байт;
     SetFilePointer(f, $284B, nil, 0);
     WriteFile(f, c, SizeOf(c), BytesRead, nil);
    
     c:=ord(char(pchar(mes[5])));             // патчим 5 байт
     SetFilePointer(f, $284C, nil, 0);
     WriteFile(f, c, SizeOf(c), BytesRead, nil);
    
     c:=ord(char(pchar(mes[6])));             // патчим 6 байт
     SetFilePointer(f, $284D, nil, 0);
     WriteFile(f, c, SizeOf(c), BytesRead, nil);
    
     c:=ord(char(pchar(mes[7])));             // патчим 7 байт
     SetFilePointer(f, $284E, nil, 0);
     WriteFile(f, c, SizeOf(c), BytesRead, nil);
    
     c:=ord(char(pchar(mes[8])));             // патчим 8 байт
     SetFilePointer(f, $284F, nil, 0);
     WriteFile(f, c, SizeOf(c), BytesRead, nil);
    
     c:=ord(char(pchar(mes[9])));             // патчим 9 байт
     SetFilePointer(f, $2850, nil, 0);
     WriteFile(f, c, SizeOf(c), BytesRead, nil);
    
     c:=ord(char(pchar(mes[10])));             // патчим 10 байт
     SetFilePointer(f, $2851, nil, 0);
     WriteFile(f, c, SizeOf(c), BytesRead, nil);
    
     // патчим байти для заголовка мессаги
     // адреса с $283C до $2845
     c:=ord(char(pchar(capt[1])));            // патчим первий байт
     SetFilePointer(f, $283C, nil, 0);
     WriteFile(f, c, SizeOf(c), BytesRead, nil);
    
     c:=ord(char(pchar(capt[2])));            // патчим второй байт
     SetFilePointer(f, $283D, nil, 0);
     WriteFile(f, c, SizeOf(c), BytesRead, nil);
    
     c:=ord(char(pchar(capt[3])));            // третий символ и так дальше
     SetFilePointer(f, $283E, nil, 0);
     WriteFile(f, c, SizeOf(c), BytesRead, nil);
    
     c:=ord(char(pchar(capt[4])));
     SetFilePointer(f, $283F, nil, 0);
     WriteFile(f, c, SizeOf(c), BytesRead, nil);
    
     c:=ord(char(pchar(capt[5])));
     SetFilePointer(f, $2840, nil, 0);
     WriteFile(f, c, SizeOf(c), BytesRead, nil);
    ...

    Где-то нашёл =(

    Запостил: BlincAttack, 21 Июля 2010

    Комментарии (29) RSS

    • это что? подмена названия и описания в экзешнике?
      Ответить
      • угу
        Ответить
        • кроме недостатка циклов, что еще я не заметил?
          Ответить
          • я кроме этого больше ничего не заметил, искал что-то типа такого на C#.У кого есть подкинте линк на примерчик.Буду признателен.
            Ответить
            • для 10 символов, будем считать что это оптимизация, экономия на спичках.
              Ответить
            • первым делом нарыть спеку ехе формата, а там хоть на спектрум-бейсике наваять несложно.
              можно еще попросить у гугла всемогущего, авось
              Ответить
              • мине именно на C# надо=(
                Ответить
                • а в чем проблема? недостаток знаний шарпа?
                  тогда гугел вам в помощь
                  Ответить
                • используй класс System.IO.FileStream

                  вместо WriteFile использовать FileStream.Write
                  вместо SetFilePointer, использовать FileStream.Position

                  и т.д.
                  Ответить
          • > кроме недостатка циклов, что еще я не заметил?

            Delphi?
            Ответить
            • Вы так говорите, как будто программировать на языках, отличных от Си++, плохо. Хотя со Страуструпом на эту тему лучше не спорить.
              Ответить
          • 1. Отсутствие проверок. Программа позволяет «выстрелить себе в ногу». То есть пользоваться ей скорее всего сможет только автор.
            2. А главное — смещения в хардкоде. Если это экзешник, то при выравнивании/перепаковке его будут проблемы. Надёжнее читать заголовок PE и считать смещения относительно начала сегмента, в котором нужно патчить мессаги.
            Ответить
            • Дельфисты никогда не проверяют возвраты от API вызовов

              "Project1.exe" это не экзешник а чёрти-чо, если переименования до сих пор не случилось - скорее всего автор уже не будет пользоваться не будет
              Ответить
              • Дело не в проверке возвратов от API вызовов, а в том, что будет, если передадим этой программе неправильные аргументы. Длину строки программа сама обкромсает до десяти символов. Но этой программой можно пропатчить неродной файл, то есть неплохо было бы перед тем как патчить, проверить «свой-чужой».
                Ответить
          • * Seek на текущую позицию в файле 9 раз при записи каждого блока,
            * суржик к комментариях
            Ответить
    • SetFilePointer(f, $2848, nil, 0);
      WriteFile(f, mes[1], 10, BytesRead, nil);
      SetFilePointer(f, $283C, nil, 0);
      WriteFile(f, capt[1], 10, BytesRead, nil);
      Ответить
      • да, я тож не понял про ord(char(pchar(...)))
        Ответить
        • c:=ord(                 // а это наоборот, не функция, а каст
             char(                 // неведомая хуйня
                 pchar(           // вот это говно, такой каст для managed AnsiString приводит вызову функции 
                      mes[1]
                 )
             )
          );
          Ответить
          • Изо всего этого Г только ord и нужно. На остальное смотреть страшно.
            Ответить
        • А я понял. mes и capt — это string, а в патч нужно загнать строку с завершающим нулём. Только автор написал абсолютно нерабочее преобразование. Грамотнее это было бы сделать так:
          mes := mes + #0;
          capt := capt + #0;

          А потом как предложил Stalker.
          Говно в неумении готовить из string asciiz.
          Ответить
          • Зачем ноль? Строки в дельфи и так на ноль кончаются, если, конечно, автор догадался врубить соответствующую опцию компилятора.
            Ответить
            • а если не догадался?
              Ответить
            • Если не догадался отключить, вообще-то.
              var S: string;
              ... 
              S := 'something'; { если строка не пустая }
              { оба выражения дают LPТSTR-совместимый указатель }
              PChar(S) 
              @S[1]
              Ответить
    • мне одному этот патч одновременно напоминает WebKill-hack-style // закриваем прогу
      и методы написаниясофта Денисом Поповым?
      Ответить

    Добавить комментарий