Сейчас на форуме: _MBK_ (+6 невидимых)

 eXeL@B —› Основной форум —› Замена int на longword (pascal) без последствий.
Посл.ответ Сообщение

Ранг: 15.1 (новичок)
Активность: 0.010
Статус: Участник

Создано: 16 апреля 2007 15:26
· Личное сообщение · #1

В некой программе (игре) необходимо заменить переменную типа int на longword. Т.е. signed 32-bit
на unsigned 32-bit. Возможно ли это как-то сделать без последствий для программы? Или какие могут быть последствия?



Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 16 апреля 2007 16:07
· Личное сообщение · #2

iddqd, глупый вопрос.
Ты хочешь заменить знаковый тип на беззнаковый.
Все зависит от проги - надо пробывать. но я думаю что не получится =).
iddqd пишет:
Или какие могут быть последствия?

программа выполнила недопустимую ошибку...



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 16 апреля 2007 17:12
· Личное сообщение · #3

оба не шарите... :P
integer == word == 16 bit [signed]
longword == dword == 32 bit [unsgned]...
последствия? смотря какой код, скорее всего что-то страшное

-----
Shalom ebanats!




Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 16 апреля 2007 18:03
· Личное сообщение · #4

SLV пишет:
оба не шарите...

кросавчег, я что-то неправильно сказал?



Ранг: 75.0 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 16 апреля 2007 19:02
· Личное сообщение · #5

SLV пишет:
оба не шарите... :P
integer == word == 16 bit [signed]
longword == dword == 32 bit [unsgned]...


ты не шаришь...

SLV пишет:
integer == word == 16 bit [signed]
longword == dword == 32 bit [unsgned]...


Зависит от компилятора...

iddqd пишет:
Т.е. signed 32-bit
на unsigned 32-bit.


Вопрос был именно в этом.

По теме: смотря что за переменная, то есть Signed тип минус старший бит, соответственно интервал примерно -2 млрд до +2 млдр, а вот Unsigned от 0 до 4 млрд.



Ранг: 15.1 (новичок)
Активность: 0.010
Статус: Участник

Создано: 17 апреля 2007 07:39
· Личное сообщение · #6

Rush пишет:
соответственно интервал примерно -2 млрд до +2 млдр, а вот Unsigned от 0 до 4 млрд.

Именно.
Ведь 4 байта буду заменены на 4 байта.



Ранг: 15.1 (новичок)
Активность: 0.010
Статус: Участник

Создано: 17 апреля 2007 07:41
· Личное сообщение · #7

Так понимаю, что ответ: НЕЛЬЗЯ без последствий.
Если у кого-то другое мнение - пишите



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 17 апреля 2007 08:40
· Личное сообщение · #8

Как минимум нужно определиться наверняка с размером.
SLV прав. Для языка из названия топика обычно тип int - это 16 бит.

iddqd пишет:
Возможно ли это как-то сделать без последствий для программы?

На этот вопрос можно смело ответить – ДА. Как и на любой вопрос из серии изменить что-то в чём-то.
Другой вопрос, что для этого придётся сделать.
А вот тут нужна конкретика.

-----
Всем привет, я вернулся




Ранг: 75.0 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 17 апреля 2007 08:45 · Поправил: Rush
· Личное сообщение · #9

iddqd пишет:
Так понимаю, что ответ: НЕЛЬЗЯ без последствий.
Если у кого-то другое мнение - пишите


Ты бы написал - за что, хоть, отвечает эта переменная (не от балды же ты ее поменять хочешь). Сам подумай, если переменная может принимать отрицательные значения, то МЕНЯТЬ НЕЛЬЗЯ. Если только положительные, то скорее всего можно, т.к. врядли переменная приобретает миллиардные значения.

Bitfry пишет:
Как минимум нужно определиться наверняка с размером.
SLV прав. Для языка из названия топика обычно тип int - это 16 бит.


Ребята, что вы курите...

Язык в названии - Pascal 32bit - ЭТО НЕ ТУРБО ПАСКАЛЬ И ЕГО 16 БИТ. По умолчанию в VCL тип integer 32bit.



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 17 апреля 2007 08:53
· Личное сообщение · #10

iddqd Ещё интересный вопрос - а зачам?



Ранг: 15.1 (новичок)
Активность: 0.010
Статус: Участник

Создано: 17 апреля 2007 11:07
· Личное сообщение · #11

Я поясню что это за переменная и зачем.
Как я уже говорила, это игра. Игра довольно старая и не далекие создатели сделали так, что деньги это тип int (signed 32), т.е. деньги могут быть только до 2,1 млрд. Присутствует такой баг, что если взять денег больше, чем влазит в int, то они уходят в минус. Для этого и хочу сделать usigned 32, чтоб хотя бы в два раза увеличить сумму денег.



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 17 апреля 2007 11:14
· Личное сообщение · #12

Зачем вам столько денег господин Корейко? Сделать вряд ли что нолучится т.к. исходников ясное дело нет? Как вариант - поставь на эту ячейку аппаратную точку останова, поставь сех и при попытках обращения - подсовывай всегда 1 млрд, к примеру .



Ранг: 15.1 (новичок)
Активность: 0.010
Статус: Участник

Создано: 17 апреля 2007 11:22
· Личное сообщение · #13

Само-собой. Были бы исходники, я бы писала на форуме по программирования, а не по крэкингу
Хотя, в принципе, и сама бы поменяла.
asd, не, суть не в читерстве. Надо именно сделать возможность хранить до 4.2 млрд.



Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 17 апреля 2007 11:45
· Личное сообщение · #14

iddqd забей. овчинка не стоит выделки, да и наврятли получися...




Ранг: 113.0 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 17 апреля 2007 11:59
· Личное сообщение · #15

iddqd

Доступен ли EXE? / а лучше куски из дизасма, скажем из IDA с использованием этой переменной (xref'ы).

-----
The one derivative you manage is the one I abhore (c) Slipknot




Ранг: 15.1 (новичок)
Активность: 0.010
Статус: Участник

Создано: 17 апреля 2007 12:23
· Личное сообщение · #16

_http://www.asta-reborn.spb.ru/allods2anet__.rar (1.3 Mb) распакованный.



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 17 апреля 2007 12:32
· Личное сообщение · #17

читайте доки, а автор нигде не писал под какой процессор игра...

> Ребята, что вы курите...
> Язык в названии - Pascal 32bit - ЭТО НЕ ТУРБО ПАСКАЛЬ И ЕГО 16 БИТ. По умолчанию в VCL тип integer 32bit.
ты сам чё куришь? при чём тут визуальная библиотека компонентов?

-----
Shalom ebanats!




Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 17 апреля 2007 12:47
· Личное сообщение · #18

Если это компелировалось в делфи как 32 разрядное аппликейшн, то integer знаковый и = 4 байтам. longword в данном случае беззнаковый и декларируется как cardinal, т.е. 4 байта беззнаково.

В любом случае, без последствий заменить нельзя.

-----
Я медленно снимаю с неё UPX... *FF_User*





Ранг: 113.0 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 17 апреля 2007 13:34
· Личное сообщение · #19

iddqd

А переменная-то какая нужна? (адресок)

-----
The one derivative you manage is the one I abhore (c) Slipknot





Ранг: 85.4 (постоянный)
Активность: 0.080
Статус: Участник

Создано: 17 апреля 2007 13:34 · Поправил: Icelot
· Личное сообщение · #20

AlexZ пишет:
В любом случае, без последствий заменить нельзя.

Мне кажется, что можно.. Число становиться отрицательным, т.к. включается первый бит - знаковый. Если программа будет считать, что по этому адресу лежит беззнаковая переменная, то всё будет ок имхо ;) А как это сделать...
PS Кстати а при чем здесь Pascal?

-----
radio uno in ibisa ...




Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 17 апреля 2007 14:06
· Личное сообщение · #21

Icelot пишет:
Мне кажется, что можно.. Число становиться отрицательным, т.к. включается первый бит - знаковый. Если программа будет считать, что по этому адресу лежит беззнаковая переменная, то всё будет ок имхо ;)

По умолчанию программа считает что integer знаковая переменная. Кстати, непонятно как автор это определил. И вообще обсуждаем какой-то офф. В F1 четко написано что такое integer и как мериется.

-----
Я медленно снимаю с неё UPX... *FF_User*




Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 17 апреля 2007 14:15 · Поправил: cppasm
· Личное сообщение · #22

Icelot пишет:
что по этому адресу лежит беззнаковая переменная, то всё будет ок имхо ;) А как это сделать...

А для этого надо пропатчить во всём бинарнике команды работающие с этой переменной со знаковых на их беззнаковые аналоги.
SAR на SHR, IMUL на MUL и так далее...
А что-то мне подсказывает что команд таких будет не мало...
Так что ИМХО



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 18 апреля 2007 21:27
· Личное сообщение · #23

cppasm пишет:
А что-то мне подсказывает что команд таких будет не мало...

Но ведь это возможно =).
Icelot пишет:
Число становиться отрицательным, т.к. включается первый бит - знаковый.

Старший бит. Биты принято нумеровать от нуля справа на лево.
Icelot пишет:
Если программа будет считать, что по этому адресу лежит беззнаковая переменная, то всё будет ок имхо

А чтоб она так считала, нужно исправлять команды работающие со знаком на беззнаковые.
К списку cppasm, прежде всего стоит добавить переходы =).

Обсуждение Int'a далее не приветствуется, раз прога 32-битная, вопрос снят.

Утром гляну что там.

-----
Всем привет, я вернулся




Ранг: 39.6 (посетитель), 21thx
Активность: 0.020
Статус: Участник

Создано: 20 апреля 2007 02:49
· Личное сообщение · #24

поменять команды на беззнаковые это, несомнено, мощное решение ). но может быть для начала стоит изменить форму вывода несчастного числа на беззнаковое. например в С это делается заменой %d на %u, как в паскале/дельфи не знаю.



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 20 апреля 2007 05:46
· Личное сообщение · #25

sen, кстати, не знал. Спасибо за совет.
Глянул. Во-первых это VS С++.
Там, похоже, всё так организовано, что та самая функция вывода, про которую сказал Sen, одинаково обрабатывает все GM_Report. Если просто заменить %d на %u, то все параметры игры станут беззнаковыми. Не уверен, что это будет здорово. =/

-----
Всем привет, я вернулся



 eXeL@B —› Основной форум —› Замена int на longword (pascal) без последствий.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати