Конференция "Основная" » Исправить без пересборки
 
  • DayGaykin © (01.07.16 10:26) [0]
    Добрый день. Вот и наступила деноминация в Белоруси.

    Обнаружилась проблема, что сумма с копейками пишется прописью неверно.

    Начал копаться, обнаружил такой код:

    function KopToText(const Summa: Currency; const shablon: string): string;
    var
     strl: Tstrings;
     i: integer;
     S, sCopName: string;
     copIn: Int64;
    begin
     copIn := strtoint(copy(replaceDQ(floattostr(SimpleRoundTo(frac(Summa))), '0.', ''), 1, 2));
    ....


    Далее copIn скармливается этой функции:

    function Kopeika(const Value: integer; const Skp: string): string;
    var
     hk10, hk20: integer;
     Skp1, Skp2, Skp3: string;
    begin
     Fst(Skp, Skp1, Skp2, Skp3);
     hk10 := Value mod 10;
     hk20 := Value mod 100;
     //showmessage(inttostr(hk10) + ', ' + inttostr(hk20));
     if (hk20 > 10) and (hk20 < 20) then
       result := result + Skp3
     else if (hk10 = 1) then
       result := result + Skp1
     else if (hk10 > 1) and (hk10 < 5) then
       result := result + Skp2
     else
       result := result + Skp3;
    end;

    Уродливость кода опустим.

    Проблема в том, что

    copIn := strtoint(copy(replaceDQ(floattostr(SimpleRoundTo(frac(Summa))), '0.', ''), 1, 2));

    При Summa = 0.4 возвращает 4, а надо бы 40.

    Вопрос: как это исправить без пересборки?

    Пересборка оголит другие проблемы.
  • Юрий Зотов © (01.07.16 10:40) [1]
    > Пересборка оголит другие проблемы.

    Так может это и хорошо? Известная проблема лучше, чем скрытая.
  • DayGaykin © (01.07.16 11:12) [2]

    > Юрий Зотов ©   (01.07.16 10:40) [1]
    > > Пересборка оголит другие проблемы.
    >
    > Так может это и хорошо? Известная проблема лучше, чем скрытая.

    Нет на это времени, к сожалению. Проблему нужно решить "райт мяу".
  • backuper (01.07.16 11:13) [3]

    > Так может это и хорошо?

    только когда времени валом чтобы собирать релизный билд для одного фикса без промежуточных наработок
  • Kerk © (01.07.16 11:49) [4]

    > backuper   (01.07.16 11:13) [3]
    >
    > > Так может это и хорошо?
    >
    > только когда времени валом чтобы собирать релизный билд
    > для одного фикса без промежуточных наработок

    А причем тут "промежуточные наработки"? Берется из системы контроля версий версия исходников на нужную дату в прошлом. Исправляется в одном месте и пересобирается.
  • Kerk © (01.07.16 11:50) [5]
    Уже второй раз пытаешься что-то исправить без пересборки за последнее время. Тут по-моему что-то с консерваторией не так.
  • backuper (01.07.16 11:52) [6]

    > Берется из системы контроля версий версия исходников на
    > нужную дату в прошлом

    ее нет, иначе этой темы не было бы
  • DayGaykin © (01.07.16 15:09) [7]
    CPU Disasm
    Address   Hex dump            Command                                  Comments
    007EDD78  |.  E8 8B56C1FF     CALL 00403408                            ; ||[hotel.00403408



    Ребят, объясните, пожалуйста, как из 8B56C1FF получилось 00403408?
  • Sha © (01.07.16 15:18) [8]
    это не адрес, а смещение; смещения бывают положительными и отрицательными
  • DayGaykin © (01.07.16 16:09) [9]

    > Sha ©   (01.07.16 15:18) [8]
    >

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

    Еще вопрос:
    Код по вычленению копеек скопмилировался у меня так:

    copIn := Round(SimpleRoundTo(Frac(Summa) * 100, 0));

    007EDD66  |.  DF6D 08         FILD QWORD PTR SS:[EBP+8]
    007EDD69  |.  D835 10E07E00   FDIV DWORD PTR DS:[7EE010]               ; FLOAT 10000.00
    007EDD6F  |.  E8 9456C1FF     CALL 00403408                            ; [hotel.00403408
    007EDD74  |.  D80D 14E07E00   FMUL DWORD PTR DS:[7EE014]               ; FLOAT 100.0000
    007EDD7A  |.  83C4 F8         ADD ESP,-8
    007EDD7D  |.  DD1C24          FSTP QWORD PTR SS:[LOCAL.28]             ; /Arg1_2
    007EDD80  |.  9B              WAIT                                     ; |
    007EDD81  |.  33C0            XOR EAX,EAX                              ; |
    007EDD83  |.  E8 08D3C4FF     CALL 0043B090                            ; \hotel.0043B090
    007EDD88  |.  E8 9F56C1FF     CALL 0040342C
    007EDD8D  |.  8945 E0         MOV DWORD PTR SS:[EBP-20],EAX
    007EDD90  |.  8955 E4         MOV DWORD PTR SS:[EBP-1C],EDX



    1.
    FDIV DWORD PTR DS:[7EE010]:  7EE010 - это адрес или значение? Что там должно лежать по этому адресу и как?

    2.
    DD1C24          FSTP QWORD PTR SS:[LOCAL.28]: Что делает эта строка?
  • Sha © (01.07.16 16:26) [10]
    > DayGaykin ©   (01.07.16 16:09) [9]

    Может уже пора взять книжку в руки?
  • Pavia © (01.07.16 16:29) [11]

    > 7EE010 - это адрес или значение?

    Это адрес он в []. По этому адресу лежит константа 10000.00, лежит как FLOAT

     FSTP QWORD PTR SS:[LOCAL.28]:
    F - FPU S-Store-сохранение
    QWord =8 байт = SizeOf(Double)

    Очевидно что сохраняет результат из сопроцессора в стек, в локальную переменную.
  • DayGaykin © (01.07.16 16:44) [12]

    > Pavia ©   (01.07.16 16:29) [11]

    Спасибо.


    > Sha ©   (01.07.16 16:26) [10]
    > > DayGaykin ©   (01.07.16 16:09) [9]
    >
    > Может уже пора взять книжку в руки?

    Мне нужно решить эту задачу один раз и очень срочно.
  • DayGaykin © (01.07.16 18:39) [13]
    Еще вопрос:
    Как писать/читать в удаленный процесс я понимаю.
    Но для начала нужно найти куда писать, а для этого нужно определиться с диапазонами памяти процесса.
    Как узнать список диапазонов адресов памяти процесса?
    Есть ли возможность получить память только кода?
  • Pavia © (01.07.16 18:55) [14]
    Так в левой колонке адрес и указан
    007EDD66
    А ещё лучше поставте галочку генерировать MAP-файл.
    Там будет адрес для каждой строки кода и для начало каждой функции.
  • DayGaykin © (01.07.16 19:01) [15]
    Pavia ©   (01.07.16 18:55) [14]
    Т.к. билды у клиентов немного отличаются, я хочу сделать универсальный патчер. Поэтому хочу применить поиск.
    Map файла уже нет к этим билдам, в добавок он еще и запакован.
  • DayGaykin © (01.07.16 21:08) [16]
    Сделал. Код непричесанный, но если кому-то нужен как пример - обращайтесь. Могу сюда выложить.

    Работает так:
    1. Моя программа запускает ту самую и ждет пока она распакуется в памяти (обычный sleep).
    2. Перебирает все диапазоны адресов и ищет в них сигнатуру.
    3. Когда находит, проверяет ее дополнительно и достает необходимые адреса.
    4. Подготавливает и записывает другой код.
    5. Закрывается и остается только та самая программа.

    Еще один вопрос:
    Насколько сложно поправить EXE файл той-самой программы, чтобы она, к примеру, импортировала DLL и выполняла какую-то функцию из этой DLL? Чтобы хот патч встроить в саму программу.
  • NoUser © (02.07.16 17:46) [17]
    > в добавок он еще и запакован

    > Чтобы хот патч встроить в саму программу.

    гы, уже распаковал ))

    MS-овцы, походу, тоже не любят лишний раз билдить своё достояние:

    http://support.microsoft.com/en-us/kb/197571
    http://msdn.microsoft.com/ru-ru/library/a329t4ed(v=vs.100).aspx
  • DayGaykin © (02.07.16 21:43) [18]

    > NoUser ©   (02.07.16 17:46) [17]
    > > в добавок он еще и запакован
    >
    > > Чтобы хот патч встроить в саму программу.
    >
    > гы, уже распаковал ))

    В смысле?
    Я просто жду 500 мс пока он сам себя распакует.
    Вроде как-то можно подождать когда начнет работать оконный цикл, но времени уже нет разбираться.


    > MS-овцы, походу, тоже не любят лишний раз билдить своё достояние:
    >
    >
    > http://support.microsoft.com/en-us/kb/197571

    Интересно, почему вирусмейкеры этим не пользуются (на моей памяти ни разу). Это же жеее! :)
  • Eraser © (03.07.16 20:22) [19]

    > DayGaykin ©   (01.07.16 21:08) [16]

    добавят вашу программу в антивирусные базы, будет еще чем позаниматься.
    в [4] дан ответ. что там за адские по размеру проекты с такого уровня разработчиками, что за 4 дня нельзя билд собрать. края крайние..
  • DayGaykin © (04.07.16 00:32) [20]
    Проблему я уже решил. Всем спасибо.
  • KSergey © (04.07.16 11:04) [21]
    Суровы белорусские программисты!
  • backuper (10.07.16 20:07) [22]

    > в [4] дан ответ.

    не ответ, а совет.
  • DayGaykin © (11.07.16 10:28) [23]

    > Eraser ©   (03.07.16 20:22) [19]
    >
    > > DayGaykin ©   (01.07.16 21:08) [16]
    >
    > добавят вашу программу в антивирусные базы, будет еще чем
    > позаниматься.
    > в [4] дан ответ. что там за адские по размеру проекты с
    > такого уровня разработчиками, что за 4 дня нельзя билд собрать.
    >  края крайние..

    Ля-ля на форуме каждый мастер.

    В итоге проблем с деноминацией в программе оказалось настолько много, что пришлось таки пересобрать программу и отлаживать программу с базой каждого клиента.

    Это заняло время, но сейчас я понимаю, что это было единственное правильное решение.

    Спасибо еще раз.
 
Конференция "Основная" » Исправить без пересборки
Есть новые Нет новых   [134434   +26][b:0][p:0.002]