В контексте статьи Ваше сообщение подразумевает, что Вы тоже рассчитываете на примерно "$300 000 в день". Могу предположить, что люди отнеслись к этому скептически.
В любом случае делайте то, что за думали. Я считаю, что правильно поступает тот, кто делает что-либо, и не правильно тот — кто ни делает ничего, но ждет успеха.
Схема, предложенная в статье называется «Free to play, Pay to win». Как правило полностью ломает баланс в игре (если он там есть). Представьте себе шахматы, в которых за реальные деньги можно покупать новые фигуры или усовершенствовать имеющиеся ;) Хотя зарабатывать это не мешает.
В том то и дело, что они только убрали саму кнопку, меню пуска, пусть и изуродованное (мне тоже неприятно, что вся рабочая поверхность закрывается) оставили, и оно также вызывается клавишей Win или наведением курсора в нижний угол и кликом. Удаление кнопки — только визуальное.
Некий юрист из Австралии попытался сделать это, запатентовав колесо. Правда там он доказывал несовершенство выдачи «упрощенных» патентов, но суть то ясна. Пруф
Судя по статье — это же не последний проект? Так вот, нужен хороший дизайнер. Для меня иконы жанра — World of Goo и Braid даже сложно сказать, чем произвели больший эффект — непосредственно головоломками или антуражем.
Куски кода — копипаста из оригинальной карты, и названия придумывал не я. Скорее всего это делалось для обфускации — редактор WarCraft использует достаточно убогие шрифты. А может просто для хакерского лоска.
Почему индекс 0x0200? Ведь это отступ в памяти. В другом месте код пишется по смещению 0x00. Насколько я помню, в данный момент массивы ссылаются на стек, поэтому возможно отступ в 0x0200 выбран просто как безопасный, не затрагивающий важные данные. Сейчас подыму историю переписки:
struct JassVArray
{
int *VFuncs;
int ListSize;
int NItems;
int *Items; // Это поле является указателем на данные массива
int BlockSize;
}
Так вот, используя операцию присвоения значению переменной массива, которая является указателем на подобную структуру, произвольного значения, содержащегося в обычной переменной (на самом деле совсем не произвольного) мы получаем массив, Items которого ссылается на нужный нам адрес в адресном пространстве процесса, в данном случае это стек одной из веточек. Откуда можно легко перехватить управление. Теперь при записи в массив игра будет на самом деле писать в код процесса. Соответственно, при записи в массив foo[n], данные будут записаны по адресу Items+n.
Кстати, насколько я понял, тут идет запись в стек, основной же код пишется действительно просто в массив. Такой же методикой находится адрес процедуры VirtualProtect, и она выполняется с флагом PAGE_EXECUTE_READWRITE на память, куда записан код. Дальше управление и передается этому коду.
Данные, показанне в примере — очень хорошие, это код. Только надо свапнуть их задом наперед (я делаю это инстинктивно):
set zg0oI[0x200]=0xE8575653
set zg0oI[0x201]=0x000000F3
//...
CPU Disasm
Hex dump Command Comments
53 PUSH EBX ; сохраняем регистры
56 PUSH ESI
57 PUSH EDI
E8 F8000000 CALL 0056C100 ; Вызов. Адрес равен адресу начала кода + 0x0100
В любом случае делайте то, что за думали. Я считаю, что правильно поступает тот, кто делает что-либо, и не правильно тот — кто ни делает ничего, но ждет успеха.
Проводя аналогии…
Почему индекс 0x0200? Ведь это отступ в памяти. В другом месте код пишется по смещению 0x00. Насколько я помню, в данный момент массивы ссылаются на стек, поэтому возможно отступ в 0x0200 выбран просто как безопасный, не затрагивающий важные данные. Сейчас подыму историю переписки:
Так вот, используя операцию присвоения значению переменной массива, которая является указателем на подобную структуру, произвольного значения, содержащегося в обычной переменной (на самом деле совсем не произвольного) мы получаем массив, Items которого ссылается на нужный нам адрес в адресном пространстве процесса, в данном случае это стек одной из веточек. Откуда можно легко перехватить управление. Теперь при записи в массив игра будет на самом деле писать в код процесса. Соответственно, при записи в массив foo[n], данные будут записаны по адресу Items+n.
Кстати, насколько я понял, тут идет запись в стек, основной же код пишется действительно просто в массив. Такой же методикой находится адрес процедуры VirtualProtect, и она выполняется с флагом PAGE_EXECUTE_READWRITE на память, куда записан код. Дальше управление и передается этому коду.
Данные, показанне в примере — очень хорошие, это код. Только надо свапнуть их задом наперед (я делаю это инстинктивно):