Добро пожаловать, гость ( Вход | Регистрация )
Дата поста: | В теме: | За сообщение: | Спасибо сказали: | ||
---|---|---|---|---|---|
Jan 4 2015, 20:40 | Сотовые телефоны: ни сот, ни мёда | Пришёл знакомый человек, озадаченно разглядывая свой телефон - говорит, что дата после Нового Года сбросилась на 1 января 1997. Телефон модели Samsung SGH-X160 (фото тут). Модель эта была анонсирована и вышла в 2006 году. Меняю там дату - ставлю 01/01/2015 - телефон говорит неверный формат. Офигеть. На официальном сайте (ссылка выше) написано: QUOTE Вопрос: У меня модель sgh-x160, работает хорошо с 2008 года, менять его не хочу. К сожалению календарь в телефоне только до конца 2014 года. Как его можно продлить? Ну, это просто охренеть, скажу я вам!Ответ: К сожалению, продление календаря не предусмотрено. Поставил человеку 2009 год в телефоне - там, вроде бы, календарь с 2015 совпадает. А так-то, конечно, свинство полное. Погуглил ещё и нашёл вот такое: QUOTE интересно, телефон, я так понимаю года 2006-2008? Т.е. по сути ему не так много. В инструкции же не сказано, что он сможет работать только до 2015 года? (да и на каком основании?) - может стоит с юристами поговорить, ты же вещь, грубо говоря, не на семь лет покупал, а тут обман производителя. Вот бы кто-нибудь сделал хорошее дело и подал на них в суд, заставив не моральную компенсацию выплачивать, а исправлять прошивку.Интересно, в моём телефоне тоже такое "ограничение" стоит?.. |
Siberian GRemlin, | ||
Nov 29 2014, 14:51 | Delphi, Asm, C, WinAPI, PHP, ... | Немного интересной и полезной информации по .BAT файлам. 1) Недавно перечитывая справку по .BAT файлам в Windows, натолкнулся на такую штуку: CODE @echo off if _%1 == _ goto quit program.exe %1 :quit Оказывается в Windows (в 98-ой не проверял, но в XP точно есть) можно сделать проще (справка по "goto /?"): QUOTE Изменение команды GOTO при включении расширенной обработки команд: Таким образом, скрипт можно сократить:Команда GOTO принимает в качестве метки перехода строку :EOF, которая вызывае передачу управления в конец текущего пакетного файла. Это позволяет легко выйти из пакетного файла без определения каких-либо меток. Команда CALL /? выводит описание расширенных возможностей команды CALL, делающих эту функцию особенно полезной. CODE @echo off if _%1 == _ goto :EOF program.exe %1 Для тех, кто не в курсе - если вместо "goto <конец_файла>" делать exit, то это прекращает выполнение вообще. К примеру, если из одного .BAT файла через call вызвали другой, то при exit произойдёт выход из обоих файлов, а не возврат в верхний. 2) А ещё команду call можно вызывать с метками и параметрами - см. справку по "call /?". 3) Но и это ещё не всё. Перечитывая FAQ к DOS Navigator 1.51 (C:\DN\DOC\DN-FAQ25.TXT) я нашёл там такое: QUOTE Q > Зачем в DN.HGL сделано 'comentstring ::' в .BAT-файлах". A > Потому, что набоp '::' в начале стpоки аналогичен REM, более того, это даже более гpамотно, так как REM все же команда DOS и вся стpока пеpедается командному пpоцессоpу на обpаботку, а ':' это не команда, а метка (что, видимо, и так все знают), а вот если после ':' стоит символ, котоpый не может быть частью названия метки (точнее метка, котоpой нет), то DOS пpосто пpопускает эту стpоку, т.е. получается тот же комментаpий, только экономится запуск целой команды. Для командных файлов с многими REM'ами можно добиться некотоpого ускоpения запуска. А '::' - уже установившийся de-facto стандаpт, кpоме того так пpоще набиpать и так гоpаздо кpасивее. Не знаю, насколько эта фича документированна, но такая штука: CODE @echo off Вполне себе работает.rem комментарий :: это тоже комментарий echo тест P.S. Годная, хотя и старая, книжка Стивен Симрин. Библия MS-DOS (версии 3.30), особенно там интересны всякие описания по физическому устройству дисков и файловой системы. Чего я про неё пишу - там описывается, что до MS-DOS 3.30 не было команды call и прямой вызов одного .BAT файла из другого приводил к невозможности возврата, поэтому приходилось выкручиваться. |
Siberian GRemlin, | ||
Nov 26 2014, 18:25 | Прогресс и программы | Как вы, наверное, все знаете Microsoft бросила Windows XP, а за ней уже и все остальные подтянулись, ломая зачастую даже хорошие вещи в угоду "моде". Ведь нормально написанная программа без проблем работает с ядром системы напрямую (KERNEL / USER / GDI и прочие DLL), без всяких "MSVCR90.DLL" и прочего ГМО призванного подтирать сопли рукожопым дебилам немогущим нормальный код. В связи с этим создаю эту тему, где буду сообщать о программах, которые были ничего, но превратились в кучу компоста. Во-первых, срочно - обновилась Miranda IM до версии v0.10.25: QUOTE Enhancements: Обратите внимание: если раньше Miranda IM работала через "MSVCRT.DLL", который есть много где (хотя и не везде), то теперь через "MSVCR90.DLL", который нужно качать и ставить (redistributable package). Хотя я использую Unicode под Windows XP, но у меня большие сомнения, что их ANSI-версия теперь будет работать под Windows 98.- Switch to newer compiler which requires an included redistributable package Так что бегом качать Miranda IM v0.10.24 из репозитория, пока её оттуда ещё не удалили. Во-вторых, пара слов о PHP: 1) Последний кошерный PHP собранный под VC6 - это 5.3.5 (тут остался) - работает не в пример шустрее собранных под VC9, а также меньше занимает. 2) Сам PHP 5.3.x уже бросили летом. 3) Как видно из ссылки выше PHP 5.4.x бросят в следующем году. 4) А PHP 5.5.x и выше уже не поддерживает Windows XP и Windows 2003 (минимум нужен Vista)! В общем, делайте запасы. |
Siberian GRemlin, | ||
Nov 2 2014, 14:02 | Command & Conquer: Red Alert [Hidden Easter Egg] | Товарищ Siberian GRemlin! Во-первых, поздравляю с очередным релизом, во-вторых, замечания принимаются? Решил поставить перевод на свою версию C&C:RA (какой-то рип, с какого-то сборника - очень давно у меня на винте лежит, так что не смогу вспомнить где взял). Что меня в твоём переводе удивило: 1) Путь установки был предложен как... "C:\Program Files\Far". Эээ... так и должно быть? 2) Если воспользоваться переключателями снизу, то путь меняется на "C:\WESTWOOD\REDALERT" - у меня игра и не там стоит, ну да ладно (подозреваю, что ты пытаешься настройки из реестра прочитать, а у меня рип, который ничего туда не писал... но Far-то откуда?). 3) Далее перевод отказывался установиться, ибо у меня чего-то нехватало, хотя окно требовало с меня версию 3.03 (она у меня и так стоит) или 3.05. Потом до меня дошло - переименовал RA95.EXE обратно в RA95.DAT и твой перевод встал. Можно ли как-то (пожелание) сделать сообщение об ошибке более информативным, чтобы пользователь знал на каком файле программа стопорится или что ей не нравится? Я, конечно, понимаю, что человек нормально поставивший игру и обновление на неё такой ошибки не получит, но на всякий случай решил о такой вещи упомянуть. 4) В результате обновились файлы RA95.DAT (EXE) и WOLAPI.MIX. Других изменений не заметил. Загрузил одну из своих старых игр (года два или три назад играл последний раз), но при вызове "Меню" -> "Инструкции" задание миссии всё ещё на английском. Это так и должно быть или задание сохраняется в файл вместе с сохранённой игрой, поэтому и осталось непереведённым? Если так, то, может, стоит об этом где-нибудь упомянуть при установке перевода, а то вводит в заблуждение. Вроде бы всё. |
Siberian GRemlin, | ||
Oct 25 2014, 18:18 | Command & Conquer: Red Alert [Hidden Easter Egg] | Короче, рассказываю: 1) Открываешь свой файл через HIEW. 2) Встаёшь на первую букву любого сообщения. 3) Переходишь в ASM-режим (F4 - Decode или два раза Enter). 4) Жмёшь F6. 5) Всё. 6) Если, вдруг, строчка используется в нескольких местах, то после того как нашлось первое сразу же жмёшь CTRL+F6 и так пока все ссылки не будут найдены. И, кстати, поиск массива указателей тебе не поможет, потому что там не массив. (*улыбается*) |
Siberian GRemlin, | ||
Sep 23 2014, 17:35 | Delphi, Asm, C, WinAPI, PHP, ... | Можно одним вызовом со специальным параметром разрешить для всех потоков процесса: QUOTE Did you get that? If any thread in the process calls CoInitialize[Ex] with the COINIT_MULTITHREADED flag, then that not only initializes the current thread as a member of the multi-threaded apartment, but it also says, "Any thread which has never called CoInitialize[Ex] is also part of the multi-threaded apartment." © Why does CoCreateInstance work even though my thread never called CoInitialize? The curse of the implicit MTAИ ещё пара полезных ссылок о подводных камнях: для C++ и для Delphi. |
Siberian GRemlin, | ||
Sep 14 2014, 17:21 | Сотовые телефоны: ни сот, ни мёда | Microsoft - КОРПОРАЦИЯ ЗЛА! Знакомому подарили смартфон с Windows 8 (Nokia Lumia). Тот захотел поставить туда свои мелодии на звонки - попросил помочь. Уже существующий там каталог "Ringtones" и всё что в нём лежит телефон не видит. Погуглил - чтобы добавить музыку в коллекцию рингтонов нужна специальная программа (трындец!). Чтобы поставить программу (любую!), нужен аккаунт в Microsoft Live. Чтобы получить аккаунт в Microsoft Live нужно иметь ящик на @Hotmail.com или @Outlook.com. В этом месте мне захотелось очень сильно ВЗЯТЬ@УШАТАТЬ того, кто разрабатывал этот сраный сраньфон. На кой хрен чтобы поставить БЕСПЛАТНУЮ программу мне ОБЯЗАТЕЛЬНО нужно иметь сраную учётную запись в Microsoft? У меня, блин, сотовый телефон удобнее, чем этот кусок не буду говорить чего. |
Siberian GRemlin, | ||
Aug 17 2014, 06:33 | MicroOLAP TCPDUMP for Windows | Нашёл ещё одну похожую тулзу: RawCap (подробнее). Бесплатная, драйверов не ставит. Но есть несколько жирных минусов: 1) Нужен сраный .NET Framework 2.0. 2) Полноценно работает только под Windows XP. 3) Пишет лог в формате PCAP, так что и смотреть придётся специальной программой (на том же сайте есть одна такая - CapLoader - правда триальная). |
useretail, | ||
Jun 26 2014, 14:00 | Нужен нормальный C/C++ компилятор | Как вы, наверное, помните, я пишу сишные программы на: QUOTE gcc.exe (GCC) 3.2 (mingw special 20020817-1) Это тот GCC, который из DEV-CPP. Писал тут одну программу DOS/Windows совместимую. Всё было нормально, пока не проверил программу под DOS в Borland Turbo C++ 3.0. Поменял кое-чего, сохранил и... она перестала копилироваться под Windows. Получаю какую-то странную ошибку: QUOTE C:\Temp/ccmYeaaa.o(.eh_frame+0x11):TESTFILE.C: undefined reference to `__gxx_personality_v0' Погуглил - говорят, надо какими-то ключами из командной строки что-то отключать. Но у меня же всё работало! Начинаю по одной строчке и блоками возвращать программу из резервной копии, которая комилировалась. Возвращал, возвращал... всё вернул! Обе программы идентичны, даже через "fc /b old_file.c TESTFILE.C" проверил - нет различий! Что за черт?! Осталось только имя поменять - сменил, всё заработало! Итого: если файл имеет расширение "*.C" (C - заглавная!) и компилируется через "GCC.EXE", то включается какой-то зело параноидальный режим, в котором нельзя вызывать функции отсутствующие в стандарте ANSI C89. В частности у меня вызывалась функция GetLastError() из WinAPI. При этом отсутствие или наличие ключа "-ansi" ни на что не влияет. |
Siberian GRemlin, | ||
Jun 2 2014, 17:38 | Command & Conquer: Red Alert [Hidden Easter Egg] | Смотри какая штука - там есть дикая функция, которая считает хеш от строк (привет The Neverhood). У меня RA95.EXE выводит версию V3.03E - для других смещения будут другие. Собственно, сама функция: sub_4F5C0C. У ней один входной параметр - это строка (в EAX). Возвращается её хеш. В игре эта функция используется два раза для двух хешей: RA95.EXE:000F4DD0 - тут первый хеш: $D95C68A2 (параметр командной строки) RA95.EXE:00108218 - тут второй хеш: $72A47EF6 (неизвестно; может имя пользователя для сетевой игры?..) Я выдернул код подсчёта хеша и попробовал перебором подобрать - не получилось. Там реально вырвиглазный подсчёт идёт, в том числе по таблице для каждого символа ASCII. Зато хеш можно заменить. Например, для слова "boom" хеш будет $03432522. Если заменить первый хеш (D95C68A2) хешем для "boom", то запустив игру: RA95.EXE boom Будет пропущен вступительный ролик (там ещё какая-то странная серая табличка "STAND BY" промелькнёт) и сразу стартует кампания за Советов (не знаю на какой сложности). Со вторым хешем сложнее - я так и не понял, где и что он включает, но от него зависит как раз вывод тех строк-приколов и ещё где-то рядом надпись "SECRET UNITS ON" (даёт возможность производить секретные типы войск?..). Там ещё какая-то строчка выше по коду про инициализацию сети была, так что, подозреваю, что эти строки-приколы вызываются в меню мультиплеера, но у меня кнопка "Network" там не работает - выкидывает назад в главное меню. |
Siberian GRemlin, | ||
Apr 1 2014, 14:58 | Software patches | И последнее дополнение на сегодня. Не так давно (всего-то пару лет назад) начал слушать файлы в .AAC формате (к примеру, дёргаешь звук из видео с YouTube и чтобы не перекодировать прямо в .AAC и слушаешь). К тому же благодаря переписке и небольшой помощи с моей стороны (а может и не только?) автор MP3DirectCut добавил возможность резать и .AAC файлы, так что всё ненужное можно отрезать и слушать любую понравившуюся музыку с YouTube. Как вы помните, я пользуюсь Winamp 2.81 Classic. Для него есть плагин in_mp4.dll (версии там нет, но датируется 2004.07.09), который проигрывает как обычные .AAC, так и .M4A/.MP4. Проблема в том, что последнего формата файлов у меня нет, есть только .AAC, причём после того как я проиграю какой-либо из этих файлов, то теряю к ним доступ - ни удалить, ни изменить, ни переместить не могу, пока не закрою Winamp. Вчера глянул в Unlocker один такой файл и аж офигел - оказывается Winamp держит штук 20 с лишним файловых дескрипторов, т.е. плагин in_mp4.dll каждый раз заново открывал файл при проигрывании, но не закрывал при остановке/переключении на другой трек. Охренев от такого безобразия полез в Интернет искать новую версию этой библиотеки. Но тут меня ждал облом, т.к. новых версий не было, а исходные коды menno (автор плагина, разработчик из Nero) удалил из репозитория с пометкой "OBSOLETE", потому что поддержка .AAC была в Winamp 5 нативной (через свою библиотеку), но в старых Winamp-то её не было! Начался адский квест по поиску исходных кодов этой бибиотеки. Нашёл вот тут, правда они старые (см. историю изменений), но хоть что-то. Можно, конечно, было собрать плагин заново, но я не был уверен, что мне для этого не придётся ставить 7-ую студию, плюс пришлось бы выковыривать из репозитория все изменения плагина, которые произошли до его удаления (а там было что). Короче, я решил поглядеть исходные коды и поправить косяк дописав нужный код на ассемблере в библиотеку. А теперь, вы можете офигевать вместе со мной. /bmp-faad/work/faad2/plugins/in_mp4/in_mp4.c:play() CODE if (!(mp4state.mp4file = MP4Read(mp4state.filename, 0))) { mp4state.filetype = 1; // это будет .AAC } else { MP4Close(mp4state.mp4file); mp4state.filetype = 0; // а это .M4A/.MP4 } Обратите внимание, что если что-то пошло не так, то класс автоматически выгружается. /bmp-faad/work/faad2/common/mp4v2/mp4.cpp CODE extern "C" MP4FileHandle MP4Read(const char* fileName, u_int32_t verbosity) { MP4File* pFile = NULL; try { pFile = new MP4File(verbosity); pFile->Read(fileName); return (MP4FileHandle)pFile; } catch (MP4Error* e) { VERBOSE_ERROR(verbosity, e->Print()); delete e; delete pFile; return MP4_INVALID_FILE_HANDLE; } } Ещё немножко ходим по коду, смотрим где что открывается - всё ок, но тут... /bmp-faad/work/faad2/common/mp4v2/mp4file.cpp CODE MP4File::~MP4File() { MP4Free(m_fileName); delete m_pRootAtom; for (u_int32_t i = 0; i < m_pTracks.Size(); i++) { delete m_pTracks[i]; } MP4Free(m_memoryBuffer); // just in case } ДА-ДА-ДА! Это именно то, про что вы подумали - в деструкторе НЕ закрывается открытый файловый дескриптор! Там адово нехватает: CODE if (m_pFile) { fclose(m_pFile); } Таким образом, когда MP4Read() возвращает ноль (MP4_INVALID_FILE_HANDLE), то класс уничтожается, но открытый файл не закрывается! А ведь ноль может вернуться не только в случае отсутствующего файла или невозможности его открыть, но и в случае неверного формата или не .M4A/.MP4 формата! В общем, пришлось впихивать в деструктор упомянутый выше код с fclose() - крови оно мне попортило изрядно, но, в итоге, всё работает. Особенно весело было получать адрес fclose(), с учётом того, что в библиотеке нет функций LoadLibrary(), GetProcAddress() и даже GetModuleHandle(), а также не стоит забывать, что все импортируемые адреса при загрузке .DLL меняются - выкрутился через получение EIP и ручное высчитывание смещения относительно известного у free() (несущественные инструкции я опустил): CODE @patch: call @func add eax, 035h; free() addr - [A8100610] - see below mov eax, [eax] sub eax, 034h; fclose() addr mov ecx, [ecx][4]; m_pFile test ecx, ecx; m_pFile == NULL ? jz @skip push ecx call d, [eax] pop eax; restore stack @skip: jmp @continue <start destructor proc> ... 8B1D [A8100610] mov ebx, free; MSVCRT <-- rebased value! ... jmps @patch @continue: ... </end> @func: pop eax; mov eax = esp (eip after return) push eax; put back ret; return: pop dd & jmp dd Так как в оригинале библиотека была сжата UPX 1.24, то я её распаковал (заодно Winamp будет грузить быстрее) и пропатчил - результат каждый может взять вот тут: in_mp4.dll (fixed) 275 Kb Для работы поместить "in_mp4.dll" в C:\Program Files\Winamp\Plugins\ или где там Winamp установлен. |
Siberian GRemlin, useretail, | ||
Apr 1 2014, 05:15 | STUNS - STupid UNcompreSsor | Собрал новую версию v0.3. Описание на английском (спасибо Grom PE за пруфрид!) и ссылку в первом сообщении обновил. Русским языком: - поправлена ошибка переполнения буфера (вернее отсутствие проверки на его конец) для PKWare - программа больше не падает - для PKWare и Deflate если выходной буфер кончился раньше входного, то, как и у других алгоритмов, такой буфер передаётся дальше, а не возвращается ошибка (см. следующий пункт) - собственно, самое главное изменение: если на запись в файл (декомпрессор отработал успешно) приходит размер равный всему блоку памяти выделенному под выходной буфер (256 Мб по умолчанию), то такой файл не сохраняется, а пишет ошибку типа: > PKWare: Failed! Output buffer 256 Mb exhausted at: 0 (0x0) потому как полностью заполненный выходной буфер (если, конечно, его не уменьшили до 1 Мб), как правило, свидетельствует о неверном входном потоке, если же его всё равно нужно сохранить, то рекомендуется увеличить размер выходного буфера или вовсе отключить упомянутую в сообщении бибилиотеку (если она не нужна - см. справку по командной строке программы), чтобы увеличить скорость работы (256 Мб заполняются очень не быстро) - поправлена опечатка - долго глаза мозолила, но собирать новую версию ради неё одной не особо хотелось |
Axsis, Siberian GRemlin, | ||
Mar 3 2014, 14:08 | Жёсткий диск | QUOTE(Siberian GRemlin @ Mar 2 2014, 18:16) [snapback]3661[/snapback] Хотел спросить совета: какой программой лучше сделать образ винта со свежеустановленной системой? Отмечу, что сохранение фрагментации и прочей «точности» не нужно. Нужно только сохранить файлы с диска, загрузочную область, с возможность восстановления на винт. Ну, мне сложно что-то посоветоветь, так как я с 2006-го года не переустанавливал свой Windows XP, только обновления скачиваю и устанавливаю. (*улыбается*) Сначала для всего подозрительного и ненужного я юзал виртуальную машину с Windows, а потом перешёл на Sandboxie, так что не позволяю своей рабочей системе запаршивить.Кто же касается программ - можно юзать Norton Ghost - самое простое, что есть. Также, вот тут можно официально и бесплатно взять Ghost Explorer (GHO_Explorer.exe): _tp://ftp.symantec.com/public/english_us_canada/products/ghost/utilities/ При помощи этой программы можно вытаскивать отдельные файлы с образа диска. Если тебе именно нужно что-то серьёзное, то можно взять Acronis True Image, но хочу сразу оговориться, что даже честно купленная лицензионная версия - это часто треш, ад, угар и содомия, особенно, если ты апгрейдишься с одной мажорной версии до другой (к примеру 1.x, до 2.x - версии для примера взяты с потолка). У меня знакомый купил лицензию и него были ошибки, когда то драйвер отваливался и не хотел переустанавливаться, то какая-то херня с резервными копиями происходила и можно было откатить только всё, а не нужный diff, то ещё что-то было (уже всех косяков не вспомню). Как показывает практика - самая стабильная версия - это предыдущая. Т.е. если только что вышла 2.x, значит последнюю в ветке 1.x уже можно использовать. Фиг знает почему, но каждый раз, как они выпускают новую версию, то что-то в ней ломают, а затем достаточно долго занимаются исправлением этих косяков. |
Siberian GRemlin, | ||
Feb 13 2014, 14:49 | Delphi, Asm, C, WinAPI, PHP, ... | Натолкнулся на то, что в нескольких играх используется LZSS, описанный в моём сообщении выше. Но, есть одно отличие MS-LZSS (Microsoft LZSS) от классического LZSS (который, похоже, используется во многих играх), без которого на выходе получится не файл, а что попало. Итак, строчки из MS-LZSS: CODE FillChar(buff[0], $FFF + 1, 32); I:=($FFF + 1) - 16; в классическом LZSS должны выглядеть вот так: CODE FillChar(buff[0], $FFF + 1, 0); I:=($FFF + 1) - 16 - 2; Т.е. кольцевой буфер заполняется нулём, а не пробелом (походу изначально MS жали текстовые файлы, вот пробелом (32) и заполняли), а также отступ от начала буфера должен быть $FEE (поэтому ещё "-2" добавляется). Ещё хочу заметить, что сжатые этим алгоритмом данные очень хорошо выявляются "на глаз": CODE _FORMMIDI_1234LIST_... Где "_" - это символ $FF (255), так как в начале файлов ещё нет повторений, то первые блоки по 8 байт идут в упаковонный поток без изменений. В общем, если в файле видны блоки по 9 байт, первый из которых $FF (и, собственно, с $FF файл и начинается), то с большой долей вероятности можно утверждать, что файл ужат классическим LZSS. В некоторых совсем уж старых играх буфер может быть не 4Кб, а 1Кб, но это не так сложно подобрать опытным путём. |
Siberian GRemlin, | ||
Jan 26 2014, 08:06 | Нужен нормальный C/C++ компилятор | Welcome back! Что-то давно на форуме видно не было, но мы всегда рады старым хорошим знакомым. Кстати, а почему на "вы" или это было обращение ко всем? (*улыбается*) QUOTE(useretail @ Jan 26 2014, 01:32) [snapback]3635[/snapback] > именно этой версии от DEV-CPP не понял. можно ссылку > эти флаги специфичные для платформ и под Windows не пашут ну это смотря в какой среде. прежде чем что-то советовать хотелось-бы ответ на первый вопрос Если речь о Dev-C++ (http://www.bloodshed.net/dev/), то там используется gcc c MinGW. Среда MinGW хоть и минималистична, но всегда страдала отсутствием некоторых непортируемых ф-й. Если вам критично использование gcc (а бегло прочитав тред я понял что нет), то качестве замены могу посоветовать Cygwin, но тогда прийдется таскать с собой чемодан в виде cygwin1.dll. То что вам требуется точно есть в MSVC. Ставьте Visual Studio и будет вам счастье ![]() Да, именно этот Dev-C++. Да, там используется MinGW. Критично именно использование GCC, потому что: 1) Он бесплатный, а также его лицензия позволяет писать программы на нём и продавать - MSVC по этой причине не подходит (его покупать нужно). 2) MSVC отпадает ещё и по той причине, что единственная более или менее нормальная версия - это 6.0, все остальные геренируют код который выглядит как кусок не буду говорить чего, плюс не будет работать под Windows 98. 3) Как я уже сказал в GCC той версии что я пользуюсь есть флаг -fwritable-strings, в более поздних версиях которого его нет. 4) Я уже достаточно серьёзно разобрался с GCC и знаю все (или большинство) его подводных камней, так что мне бы, по хорошему, тут немного дожать и там немного дожать - и будет очень хорошо. 5) Cygwin не устраивает именно что из-за "cygwin1.dll". Я пишу под Windows (ну, кроме распаковщиков для игр и специфичных программ для нескольких платформ) и мне нужно чтобы программа работала "из коробки", а тот же пресловутый msvcrt.dll отсутствует в чистом Windows 98 SE. Короче, я хочу, чтобы сишный компилятор компилировал используя только библиотеки системы (kernel32.dll, user32.dll, ...) и ничего более. Если нужны какие-то отсутствующие там функции, то пусть они будут статичным кодом внутри .EXE файла - меня это полностью устраивает. Пользуясь случаем расскажу ещё об одном подводном камне GCC. Итак, у меня не собирается программа, выплёвывая в консоль ошибку: QUOTE library.o(.text+0x123):library.c: undefined reference to `memset' C:\Dev-Cpp\bin\mingw32-make: *** [Program.exe] Error 1 Сравнил makefile с тем (у другой программы), который компилировался - всё точно также. Стал комментарить все функции и выяснил, что если в программе используется функция: ZeroMemory(buff, size); то всё нормально, но стоит хоть где-то вызвать: FillMemory(buff, size, filler); Всё - получаем такую ошибку. Насильное указание ключа -fbuiltin, а также: #define memset __builtin_memset Нифига не помогают. Обе эти функции (ZeroMemory() и FillMemory()) в заголовочных файлах переопределяются через memset(), но почему-то зануление заменяется inline-кодом, а заполнение - нет (и, более того, ещё и отключает встроенное зануление). В общем, полная задница - походу, все стандартные функции придётся реализовывать вручную, а с синтаксисом GAS'а (GNU Assembler) - это ад адский. Думаю сделать на FASM'е, потом просто в либу собрать и подключать её при компиляции... |
useretail, | ||
Jan 22 2014, 13:51 | Нужен нормальный C/C++ компилятор | Ничего люди нормально сделать не могут! Руки у них непонятно откуда! Подключаю к программе сишный файл, ни одной функции ещё оттуда не использую, но они все (ВСЕ!) включаются в выходной .EXE файл! Начал гуглить как можно избавиться от unused functions в GCC - везде предлагают только такой вариант: CFLAGS += -fdata-sections -ffunction-sections LDFLAGS += --gc-sections Пробую - нифига. Потом ещё полазил по Интернету и привет - эти флаги специфичные для платформ и под Windows не пашут. У меня GCC 3.2 - там есть уже упомянутый: -fwritable-strings В новом этот ключ убрали, зато есть какой-то -dead_чего-то-там, который, вроде бы, должен что-то такое делать - нифига не работает. С горя нашёл даже DeadStrip и всё было бы просто замечательно, но он импорт не перестраивает! Т.е. если есть какая-то функция, использующая WinAPI'шные функции, то они будут в импорте выходного файла, хотя НИГДЕ не используются! Итого, в программе, где ничего кроме ExitProcess(0) нет, импорт занимает чуть ли не 99% кода... Кто-нибудь знает как можно в GCC (именно этой версии от DEV-CPP) выкинуть неиспользуемые функции (вместе с импортом)? Сразу оговорюсь, что варианты комментировать функции или вручную включать-отключать их через define'ы - абсолютно неинтересны. |
Siberian GRemlin, useretail, | ||
Dec 31 2013, 11:07 | С наступающим Новым годом! | Пожалуйста, прочитайте ежегодное Новогоднее Обращение к участникам, форумчанам и гостям проекта CTPAX-X! (*улыбается*) Итак, год 2013, год змеи, уползает не выдержав топота копыт надвигающегося года лошади. Кое-кого из нас, змея основательно так покусала, так что год выдался достаточно богатым на неприятности. И хотя змея считается символом мудрости, но злые шутки здесь играло число 13 в номере года. Так что есть ненулевая вероятность (что уже само по себе хорошо (*улыбается*)), что в следующем году нам всем повезёт гораздо больше. Как бы там ни было, хочется пожелать всем встретить и провести Новый Год в хорошей компании родных, близких, друзей и приятелей, не болеть, не грустить, а, главное, не терять присутствия духа, какие бы каверзные проблемы вам не подкидывала судьба! От себя лично хочу добавить, что мне было исключительно приятно провести этот год среди таких замечательных товарищей как вы друзья! Всем вместе и каждому в отдельности крепко жму руку и ещё раз поздравляю! С Наступающим всех! |
Axsis, Siberian GRemlin, useretail, | ||
Dec 30 2013, 13:00 | Жёсткий диск | Я хотел написать отдельную статью, когда всё закончится и я буду знать результаты, чтобы либо критиковать, либо похвалить, но раз такое дело... Добавлено: диск восстановить не смогли, к тому же ещё и протянули время (см. ниже окончательный отзыв). Короче, пару месяцев назад у меня рухнул жёсткий диск. Обратился в самую известную в нашем городе (живу, к слову, не в мухосранске - город большой) фирму по восстановлению жёстких дисков. Диск у меня, вообще, пропал из системы и виден не был. В фирме диск вскрыли, сказали, что там царапина на поверхности, так что они ничего сделать не могут. Я, думаю, не нужно говорить, что в рекламе они сообщали что ремонтируют ЛЮБЫЕ повреждения на дисках. Начал искать другие фирмы в нашем городе - они либо не брались, а те что взялись, сказали, что раз диск уже вскрывали, то цена за ремонт будет минимум X тысяч рублей и ничего гарантировать они не могут, от чего у меня аж глаза на лоб полезли. Начал искать в Интернете кто может восстановить хоть что-то. Вылетел на какую-то статью на сайте http://www.hardmaster.info/ Зачитался и в конечном счёте, решил отправить диск туда. Оплатил предварительный осмотр (нужно было оплатить диск-донор и работу - 4 + 2 тыс.руб., хочу заметить, что могло быть и меньше, но так как диск вскрывали - в общем, читайте правила на их сайте...) - поставили в очередь, сказали, что к концу января будет известно можно ли что-то восстановить с диска (можно и раньше, но за дополнительные деньги, а мне не к спеху). Мне, кстати, из фирмы написали, что на моём диске не только головки отогнуты как попало, там ещё и отпечатки пальцев на поверхности (!) дисков. В общем, у меня, походу, вот такой случай, разве что крышка от диска целая была после вскрытия... Товарищ Siberian GRemlin, тебе вот эта статья будет интересна, так как ты, возможно (я не знаю точной причины твоей поломки), занимаешься сейчас тем же самым (считыванием, когда этого делать нельзя). Я хочу закончить мысль по поводу этой фирмы, а дальше пусть уже каждый сам решает стоит ли туда диск отправлять. Почему я решил отослать диск в эту фирму - мне понравились статьи. Они написаны специалистом. Например вот эта. Обратите внимание - там куча всякой технической информации (типа "Rst 0x08M"), которая неподготовленному человеку вообще ни о чём не говорит, но именно уход от простого объяснения на пальцах (для обычных клиентов, которые просто хотят починить диск и ни в чём не разбираются) в сторону технических подробностей говорит о том, что статью писал специалист, а не пиар-манагер цель которого написать красиво и складно, чтобы привлечь клиентов. Т.е. человек пишет именно о том, в чём он разбирается и понимает. А ещё это в некоторой степени говорит об увлечённости предметом. Просто я не так давно тоже начал писать технические статьи (кое-что и тут на форуме видно) и у меня такая же проблема - ухожу в технические детали, которые кроме специалистов никому неинтересны и непонятны. К слову из забавных статей, которые я нашёл на том сайте. Вообще, сайт интересный - рекомендую к прочтению. Итого - я высказал свои мысли, а уже решает пусть каждый сам за себя. И, ещё раз повторюсь, какие-то результаты (хорошие или плохие), а также окончательный отзыв о фирме я смогу сообщить только в конце января или даже позже. |
Grom PE, Siberian GRemlin, | ||
Dec 23 2013, 18:31 | Spacebase DF9 | Походу это LuaJIT: _ttp://luajit.org Гугли "LuaJIT decompiler" или что-нибудь этакое. Нашёл вот это, но не пробовал: _ttp://github.com/bobsayshilol/luajit-decomp |
Siberian GRemlin, | ||
Dec 16 2013, 20:40 | Spacebase DF9 | Скачать бесплатно, без регистрации и SMS: stex2dds.zip Насчёт ширины/высоты (width/height) не уверен, потому что они там одинаковые (в .DDS просто сначала высота идёт, а уже потом ширина). dwName - имена людей (ANNA и т.п. - они разные), ну и ещё там пара полей фиг знает за что отвечающих. P.S. Как идут дела с первой Кирандией? Да, я такой. (*улыбается*) |
Siberian GRemlin, | ||
Nov 27 2013, 15:42 | Delphi, Asm, C, WinAPI, PHP, ... | Недавно я тут писал про утилиту COMPRESS.EXE, сжимающую файлы. Конечно, сжатие весьма посредственное (мы сейчас рассматриваем классический алгоритм LZSS, а не MS-ZIP, который туда добавили позже) и хорошо жмёт только файлы где есть длинные последовательности из повторяющихся байт, но в общем и целом для некоторых вещей вполне себе подойдёт. Тут главный плюс в том, что распаковщик короткий, легко пишется и не требует дополнительной памяти (ну 4 Кб на циклический буфер - это крохи). Так что можно использовать этот архиватор и созданные им файлы для своих нужд. Но, для начала, давайте взглянем на то, как сжатые файлы создаются. Итак, делаем: COMPRESS.EXE FILENAME.EXT FILENAME.EX_ Что происходит после выполнения этой команды? 1) Создаётся файл FILENAME.EX_ 2) Туда пишется следующий заголовок: CODE CHAR[8] - signature "SZDD\x88\xF0\x27\x33" CHAR - compression algo type - always 'A' (0x41) CHAR - last char of uncompressed file name (example: "test.xyz" -> 'z'); may be null DWORD - unpacked file size Итого, заголовок у нас занимает 14 байт. Отдельно хочу сделать замечание по поводу поля "algo type" (алгоритм сжатия). Если кто-то видел в Интернете исходные коды Windows 2000, то там можно было увидеть такое: CODE #define ALG_FIRST ((BYTE) 'A') // first version algorithm label for Lempel-Ziv #define ALG_LZ ((BYTE) 'B') // new Lempel-Ziv algorithm label #define ALG_LZA ((BYTE) 'C') // Lempel-Ziv with arithmetic encoding algorithm label Однако, сразу после этого шёл define объявлявший валидным только первый алгоритм. Так что на практике первые два поля в заголовке архива - константы и можно смело проверять даже не 8, а первые 9 байт. Поле "last char" утилитой EXPAND.EXE тоже не используется, а COMPRESS.EXE пишет туда ноль (или я так и не понял, как сделать, чтобы оно работало). Так что его можно игнорировать, если, конечно, вы сами не создавали архив и сами же его не распаковываете (точно зная, что поле не пустое). Далее идёт размер распакованного файла и всё. Хочу обратить на это внимание - в архиве нигде не содержится размер сжатых данных - файл читается, пока размер распакованного буфера не достигнет размера распакованного файла из заголовка. 3) В файл пишется упакованное содержимое. 4) Файлу-архиву ставится дата исходного файла - таким "оригинальным образом" в Microsoft сохраняют дату создания файла. Поясню: при распаковке извлечённому файлу выставляется (восстанавливается) дата с файла-архива. Ну вот, теперь мы знаем как это работает и устроено, так что можем делать архивы, линковать в ресурсы к своим программам и "на лету" распаковывать. Вот небольшой код на Delphi делающий распаковку (я переписал его с Си - см. ссылку). Вызывать так: MSLZSSExpandBuff(PackedBuffer, UnpackedBuffer, PackedBufferSize, UnpackedBufferSize); CODE { ported from: http://gnuwin32.sourceforge.net/packages/mscompress.htm } Function MSLZSSGetByte(Var P: Pointer; Var Ps: DWORD): Integer; Begin If Ps > 0 Then Begin result:=Byte(P^); Ps:=Ps - 1; Inc(DWORD(P)); End Else result:=-1; End; Function MSLZSSPutByte(Var U: Pointer; Var Us: DWORD; B: Byte): Boolean; Begin result:=(Us > 0); If result Then Begin Byte(U^):=B; Us:=Us - 1; Inc(DWORD(U)); End; End; Procedure MSLZSSExpandBuff(P, U: Pointer; Ps, Us: DWORD); Var I, J, Len, M, B: Integer; Buff: Array[0..$FFF] Of Byte; Begin FillChar(buff[0], $FFF + 1, 32); I:=($FFF + 1) - 16; While ((Ps > 0) And (Us > 0)) Do Begin B:=MSLZSSGetByte(P, Ps); If B = -1 Then Break; For M:=0 To 7 Do Begin If (B And 1) = 0 Then Begin J:=MSLZSSGetByte(P, Ps); If J = -1 Then Break; Len:=MSLZSSGetByte(P, Ps); If Len = -1 Then Break; J:=J + ((Len And $F0) ShL 4); Len:=(Len And $0F) + 3; While Len > 0 Do Begin Buff[I]:=Buff[J]; If MSLZSSPutByte(U, Us, Buff[I]) = False Then Break; J:=(J + 1) And $FFF; I:=(I + 1) And $FFF; Len:=Len - 1; End; End Else Begin J:=MSLZSSGetByte(P, Ps); If J = -1 Then Break; Buff[I]:=J; If MSLZSSPutByte(U, Us, Buff[I]) = False Then Break; I:=(I + 1) And $FFF; End; B:=B ShR 1; End; // For End; // While End; |
Siberian GRemlin, | ||
Nov 17 2013, 11:03 | Software patches | Многие знают, что ещё со времён MS-DOS есть такая утилита как EXPAND.EXE, которая распаковывает установочные файлы "FILENAME.EX_" во что-нибудь типа "FILENAME.EXT". Упаковка осуществляется программой COMPRESS.EXE. У меня была эта программа, но для DOS. Понадобился этот упаковщик и решил скачать версию для Windows, чтобы работала нормально под любым Windows (в том числе и x64, где DOS не эмулируется никак). Программа COMPRESS.EXE любезно предоставленна фирмой Microsoft и входит в комплект Windows Server 2003 Resource Kit Tools. Однако, выяснилось, что упакованные ей файлы не хотят распаковываться через EXPAND.EXE. Офигев от такой нагласти упаковал тот же файл DOS-версией программы (её архивы успешно распаковывались) и сравнил результат. Оба файла оказались идентичны, за исключением поля отвечающего за размер распакованного файла. В оригинале файл занимал 2990 байт (0BAEh). В нормальном архиве так и было записано: AE 0B 00 00 В ненормально же было так: 01 AE 0B 00 Возникает резонный вопрос: WTF??? Полез в отладчик и нашёл такой удивительный код: CODE .text:010018F8 mov al, [ecx+0Ah]; put last extension char to al (null) .text:010018FB mov [ebp-0Bh], al; put char to header buffer ;------------- .text:010018FE inc al ; where the WTF??? started - increment last char .text:01001900 mov [ebp-0Ah], al; put as first byte for unpacked buffer in header .text:01001903 mov eax, [ecx+0Ch] ; move actual unpacked size to eax ;------------- .text:01001906 xor esi, esi .text:01001908 xor edi, edi .text:0100190A @loc_100190A: ; put unpacked size to the header buffer .text:0100190A mov ecx, edi ; why so difficult? .text:0100190C mov edx, eax ; by the way - this code NOT SAFE! .text:0100190E shr edx, cl ; because it writes 4 bytes to buffer .text:01001910 add edi, 8 ; but we already use one (see above) .text:01001913 inc esi ; so the last byte makes BUFFER OVERFLOW! .text:01001914 cmp edi, 20h .text:01001917 mov [ebp+esi-0Ah], dl; here we can fix this error: -0Ah to -0Bh .text:0100191B jl short loc_100190A Мало того, что в выходной буфер за каким-то чёртом пишется последний символ расширения файла увеличенный на единицу, так туда же ещё и пытается записаться размер (4 байта), причём после этого самого непонятного байта, что приводит к переполнению буфера! Как видно из комментариев выше, сиё безобразие несложно поправить исправлением всего 1 байта. compress.exe 00000D1A: F6 -> F5 ; version info: ; 39936 bytes ; 2003.04.18 17:46:26 ; 5.2.3790.0 built by: dnsrv_dev(v-smgum) Так как esi при первом шаге цикла уже 1 (inc esi), то нужно как-то это компенсировать, вот и отнимаем больше на 1: вместо -0Ah используем -0Bh (см. комментарии выше). Что, в итоге, позволяет нам не только избежать переполнения буфера, а также записать размер правильно, но и перезаписать тот непонятный байт. В общем, после сего исправления эту утилиту, наконец-то, можно использовать. |
useretail, | ||
Nov 1 2013, 18:16 | OllyDbg v1.10 CommandBar v3.20.110 plugin | OllyDbg v1.10 CommandBar v3.20.110 plugin CXP update © CTPAX-X Team 2013 Based on source codes from: http://tuts4you.com/download.php?view.3405 QUOTE [CXP:20131101] - autoclose "Intermodular calls" window after "BPX" command and restore size of the current MDI window only if active window is maximized - add messages for "BPX" command: "! Specified name not found or invalid" - if breakpoint set/remove operation failed "+ Breakpoint is set" - if breakpoint set operation successful "- Breakpoint removed" - if breakpoint remove operation successful - add menu item "2 Set focus to CommandBar\tCtrl+D|" (this hot key was undocumented anywhere else) - Ctrl+D in the CommandBar combobox returns focus back to the active MDI window (if any) - replace "sprintf()" from LIBC with "wsprintf()" from WinAPI - smaller binary file (42 kb) - fix compiler warnings - compiled with MS Visual C++ 6.0 (new recompiled "Ollydbg.lib" file) Download: cmdbarcx.zip Кто пользовался плагином - всё поймёт. Перед установкой необходимо убрать файлы "CmdBar.dll" / "CmdLine.dll" из каталога с плагинами у Ольки. Какие-нибудь ещё пожелания есть? Что-нибудь добавить? Хех, только не сильно навороченное. |
Siberian GRemlin, | ||
Sep 14 2013, 14:32 | Delphi, Asm, C, WinAPI, PHP, ... | Часто пишу программы, которые со временем довольно сильно меняются. Ставить на свою машину SVN, GIT или другие репозитории не хочу, да и задачи не такие глобальные. Так что сделал себе вот такой вот файлик. backup.bat CODE @echo off del "%DATE:~-4%%DATE:~3,2%%DATE:~0,2%.zip" >nul 2>&1 cd .. zip.exe -9 -X -D "%~d0%~p0%DATE:~-4%%DATE:~3,2%%DATE:~0,2%.zip" "*.*" -x "*.dcu" -x "*.bak" cd /d "%~d0%~p0" 1) Файл должен находиться в "%КАТАЛОГ_ПРОЕКТА%\backup\", где вместо backup может быть каталог с любым другим именем. 2) Ключ "-x" позволяет исключить ненужные файлы. 3) Нельзя писать "..\*.*" для указания маски файлов для упаковки, потому что это чревато тем, что в архив файлы с таким именем и будут сложены: "..\Project1.dpr" - что при распаковке вывалит их на каталог выше чем надо. 4) Ключ -D отключает обработку каталогов (чтобы самого себя не запаковать). 5) "-9" - максимальное сжатие. 6) "-X" - отключает всякую ненужную информацию, которая только раздувает размер архива. 7) "%DATE:~-4%%DATE:~3,2%%DATE:~0,2%" превратится в текущую дату: "20130914" (запускаем и делаем копию за сегодня). 8) "%~d0%~p0" - каталог, откуда был запущен .BAT файл. 9) Бесплатный "zip.exe" брал тут: Info-ZIP, распаковать и поместить в %PATH% (например, в C:\WINDOWS\). Прошу обратить внимание, что в этой программе ключи регистрочуствительные, так что -d и -D, а также -x и -X - это разные ключи! |
Siberian GRemlin, | ||
Jun 28 2013, 11:09 | Delphi, Asm, C, WinAPI, PHP, ... | Мне не так давно было ещё одно откровение, которым спешу поделиться. Представьте, что у нас есть вот такой код в какой-то программе, которую мы хотим изменить: CODE .00401581: 7513 jne .000401596 Как известно jump'ы правят двумя способами: 1) Когда надо переходить, то меняем 0x7? на 0xEB. 2) Когда НЕ надо переходить, то заменяем оба байта на 0x90. Но я всегда стараюсь сократить количество изменяемых байт, чтобы проще было исправлять, да и самому не путаться. В первом случае, как можно заметить, мы меняем 1 байт, а во втором 2. Хотелось бы сократить издержки производства, но как это сделать? Оказывается достаточно просто - нужно всего лишь заменить второй байт (смещение для прыжка прибавляемое к адресу после команды jump) на 00, вот так: CODE .00401581: 7500 jne .000401583 Куда будет переходить такой прыжок? Правильно, на следующую после jump'а инструкцию. Изменяется всего один байт - очень аккуратно, компактно и элегантно. |
Siberian GRemlin, | ||
Упрощённая версия | Сейчас: 28th May 2024 - 13:11 |