Форум программистов, компьютерный форум, киберфорум
Бета-тестирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14

Lineedge (Semi-Alpha)

30.07.2025, 18:50. Показов 46904. Ответов 787
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Только вроде недавно я выпускал билд к Lineedge (Semi-Alpha) 0.75@20, как уже готова новая полуверсия. Причем со "счастливым" номером - Lineedge (Semi-Alpha) 0.777. Разумеется, такой номер не случаен, я специально подсчитывал, сколько очков нужно для того, чтобы такой номер соответствовал остальной шкале. В основном эта версия (средняя между ревизией и билдом) была сосредоточена на одной важной технически, а не геймплейно, функции, плюс было исправлено то ли пять, то ли шесть ошибок, в зависимости от того, считать ли неоптимизированность ошибкой - я больше склоняюсь к тому, что нет, потому что согласно тому, что я учил в университете, есть функциональные требования к программному обеспечению - нажал эту кнопку - такая-то реакция - а есть нефункциональные требования, такие как кроссплатформенность, удобство использования там, и в том числе оптимизированность, так вот нарушение функциональных требований - это ошибка, а нарушение нефункциональных требований ошибкой не является - так что будем считать, что в этой версии я исправил пять ошибок. Вот полный список:
- Можно зарегистрировать единую учетную запись Red-Star-Soft, имя и пароль в которой шифруются RSA! Разумеется, это защита только от пытливого школьника, а не от серьезного хакера, но я решил отложить заказ полноценной криптосистемы со всеми "фишками" на низкоуровневом языке под Windows, Linux и Android с оберткой на PHP, JavaScript и Blueprints на основе McEliece до момента, когда получу прибыль от игры, так как если никто не заплатит, взлом не нанесет финансового ущерба (даже если он будет), а пока что - RSA. Ссылка на регистрацию единой учетной записи Red-Star-Soft находится на главной странице нашего сайта.
- В зарегистрированную учетную запись можно войти с паролем в игре, для чего появилось новое текстовое поле для пароля. Теперь существует два типа учетных записей - со слоганом и с паролем, и если ввести и то, и другое, игра выдаст ошибку. Пароль шифруется (и хэшируется), в отличие от слогана. Если ввести слоган в учетной записи со слоганом в поле для пароля, игра выдаст ошибку! Также, нельзя играть учетной записью с паролем в соло.
- Кроме того, можно прямо в игре старую учетную запись со слоганом превратить в новую с паролем. Этот функционал доступен как "действие", но для этого нужно выполнить ряд условий, например, достичь уровня 11. Хотя с помощью другого действия можно достичь его мгновенно...
- Исправлен раздражающий эффект, из-за которого компьютер очень сильно "грузился" в главном меню.
- Исправлено сразу три ошибки-долгостроя:
--- См. выше про слоган и пароль.
--- Исправлена ошибка, из-за которой отображалась непонятная картинка перед созданием сервера.
--- Также исправлена ошибка-долгострой, не входившая в официальный список, но, тем не менее, существовавшая несколько версий, из-за которой автомобили в гараже начинали скользить по полу, затем сталкиваться, подпрыгивать, ударяться друг об друга и разрушаться с противным звуком. Звук все еще может быть слышен на клиенте, до того, как игровой мир полностью загрузился, если начать игру прямо возле автомобилей (в гараже или совсем рядом с ним), и автомобили могут меняться местами, но, думаю, большинство игроков помнят "свой" автомобиль по цвету, и мало кто выходит из игры в гараже или возле него (чтобы потом начать в этом месте). Хотя, согласно некоторым данным, не факт, что ошибка исправлена полностью.
- Исправлена ошибка, из-за которой постоянно дергался и "прыгал" угол поворота жителей города.
- Исправлена ошибка с залипанием поворота при управлении мышью.

Системные требования


Легенда: процессор (ядра x ГГц) / видеокарта (разбивка идет по моделям от NVIDIA, так как они знакомы большему числу пользователей) / RAM (ГБ) + подкачка (ГБ) / прочее.
Минимальные (обычные редакции, низкая графика, 1024x768 (меньшее разрешение не поддерживается), будут сбои, зависания и рассинхронизация): любой 64-разрядный (даже медленный процессор рано или поздно заданную ему программу выполнит) / хотя бы встроенная не старше 5-7 лет / 8+16.
Средние (обычные редакции, низкая графика, 1920x1080): 4x3 / 1060 6 GB / 24.
Рекомендуемые (обычные редакции, средняя графика (а хорошая в стандартной редакции ничем не отличается), 1920x1080): 6x3.5 / 3060 8 GB / 32.
Высокие (платиновая редакция, средняя графика, 2560x1440): 8x4.5 / 4080 / 64 / DirectX 12, SM6.
Эпические (платиновая редакция, хорошая графика, 3840x2160): 8x5 (не знаю, задействует ли игра больше 8 ядер) / 5090 / 96 / DirectX 12, SM6, HDR.

Оставшиеся ошибки-долгострои:


1. Глобальное подключение может сразу не получиться. Не отчаивайтесь, пробуйте снова, особенно если у вас не очень быстрый компьютер. Надеюсь, в таких случаях, как минимум, выдается соответствующее сообщение (в отличие от прошлого выделенного сервера). (Примечание: если сообщение не выдается, но вместо вашего имени - EXITED, это некорректный вход, попробуйте еще раз. А если имя корректно, но вы не видите пейзажа, а только небо, вход корректен, нужно просто подождать.)
2. На медленном компьютере враги могут собираться "пачками" и не двигаться, а игрок - не реагировать сразу на нажатия кнопок. Это не баги, но, к счастью, и не фичи, это - лаги. На быстром компьютере, и если сервер не перегружен, их нет.
3. Во время установки после выбора одного или всех пользователей происходит распаковка, но ее прогресс не отображается, и на медленном компьютере может ничего видимого не происходить десятки минут. Если вы сомневаетесь, не вылетела ли установка - посмотрите в диспетчере задач.
4. В игре присутствуют негативные VFX, проявляющиеся, например, когда единица-маг применяет BASIC. Хотя я не уверен, баг это или фича.
5. KC не способны двигаться без игрока, просто стоят в заранее определенных местах в BADFORD (эта ошибка уже почти исправлена, вероятно, будет исправлена в следующей версии, или даже в билде).
6. На клиенте может возникнуть иллюзия, что две KC стоят "одна в одной", но не сливаются, а случайным образом "лежат" друг на друге, наводя ужас на всех проходящих.
7. Когда игрок управляет KC, некорректно рисуется его меш, вместо нужного меша появляется меш стандартного UE4Mannequin.
8. WOWE периодически уходят "погулять", вместо того, чтобы защищать клетку. Но даже если вход в клетку свободный, вам одинаково придется убить как минимум одного WOWE, что, собственно, и написано в задании.
9. Деревья (в частности, BYAROWS) визуально полупрозрачны и бесцветны, пока к ним не подойти вплотную.
10. Попытка подключения к несуществующему (например, серверу в WAN в версии, где его нет, или при опечатке в наборе IP-адреса) или недоступному серверу (например, из-за обрыва связи) приводит к непредсказуемым последствиям.
Прямо сейчас доступны редакции под Windows и Linux без речи, редакции с речью и редакция для Android будут позже.
Надеюсь, эта версия окажется одной из лучших.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.07.2025, 18:50
Ответы с готовыми решениями:

Lineedge (Semi-Alpha) 0.55 (а то и 0.6) возвращается!
И снова всем привет! Если кто-то помнит, я утверждал, что сделаю Lineedge в версии Semi-Alpha с...

Lineedge. Посеяны семена нового потомка "линейки"
Игра под прозвищем "линейка" стала одной из вех в истории игровой индустрии. Причина этого,...

Что нужно сделать с Lineedge, чтобы она перестала быть мусором и говном?
Раньше господин Usaga писал, что квинтэссенция игры - это сетевой код, и что почему-то его нельзя...

787
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
08.01.2026, 14:52  [ТС]
Студворк — интернет-сервис помощи студентам
Royal_X, но почему-то в UE5.5 это не вызывало вылет...
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6338 / 3071 / 1054
Регистрация: 01.06.2021
Сообщений: 11,786
08.01.2026, 15:07
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
это
а что ты там поменял? вроде картинки идентичные?
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
08.01.2026, 15:13  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
а что ты там поменял? вроде картинки идентичные?
Сделал, чтобы узел Select выбирал не между интерфейсом и None (желтые), а между объектом и None (голубые), а уже потом этот объект преобразовывался в интерфейс. В чем разница - одним Epic Games известно...

Добавлено через 2 минуты
Royal_X, и еще к слову, автоустановщик не начал работать?
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6338 / 3071 / 1054
Регистрация: 01.06.2021
Сообщений: 11,786
08.01.2026, 16:35
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
автоустановщик не начал работать
не проверял

если честно, мне автоустановщики не нравятся.

Добавлено через 1 час 15 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
я вот никак не пойму, как ты смог получить результат декомпиляции в 13 строчек? у меня hello world минимум 500 строчек (это если hex-rays использовать), у других декомпиляторов вообще 1000+ строк... и выводится совсем нечитаемый текст, прям такой, какой у тебя на втором скрине
на первом скрине будто исходный код написан, это какой волшебный декомпилятор у тебя?
Custos, наверное, зависит как этот Hello world был скомпилирован.
Сразу предупреждаю, что я в этом деле не копенгаген, если ты спец. в ida pro и прочих инструментах, то подскажи мне.

у меня есть программа, которая выводит hello world, со статической линковкой, скомпилирована с помощью g++ GNU GCC MingW64 ucrt.

Вот у тебя на скриншоте просто волшебство, в псевдокоде сразу видна строка hello world и ты утверждаешь, что так просто найти.

А вот, что у меня на практике происходит, причем пробовал в IDA Pro 9.2, а также в Cutter (в последнем можно выбрать декомпиляторы jsdec или Ghidra). И везде результат одинаковый - много букаффф и нет такого волшебства, как на твоем скрине. Либо я не знаю, как правильно декомпилировать, либо ты что-то недоговариваешь, либо у тебя была динамическая линковка и как-то иначе прога была компилирована.

Вот, смотри, что у меня происходит:

Псевдокод стартовой функции, полученный в IDA Pro 9.2:

C
1
2
3
4
5
__int64 start()
{
  unk_140102090 = 0;
  return sub_140001020();
}
как видишь выглядит не так, как у тебя

захожу в псевдокод функции sub_140001020

Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
__int64 sub_140001020()
{
  PVOID StackBase; // rsi
  signed __int64 v1; // rax
  int v2; // r14d
  _QWORD *v3; // rax
  __int64 v4; // rcx
  __int64 result; // rax
  FILE *v6; // rax
  int v7; // esi
  char *v8; // rax
  __int16 v9; // dx
  __int64 v10; // r12
  _QWORD *v11; // rax
  __int64 v12; // r13
  __int64 v13; // r15
  __int64 i; // rsi
  size_t v15; // rdi
  void *v16; // rax
  unsigned int v17; // [rsp+3Ch] [rbp-5Ch]
  _DWORD v18[19]; // [rsp+4Ch] [rbp-4Ch] BYREF
 
  StackBase = NtCurrentTeb()->NtTib.StackBase;
  while ( 1 )
  {
    v1 = _InterlockedCompareExchange64(&qword_140102040, (signed __int64)StackBase, 0);
    if ( !v1 )
    {
      v2 = 0;
      goto LABEL_6;
    }
    if ( StackBase == (PVOID)v1 )
      break;
    Sleep(0x3E8u);
  }
  v2 = 1;
LABEL_6:
  if ( unk_140102048 == 1 )
    sub_14001A270(31);
  if ( unk_140102048 )
  {
    dword_140102004 = 1;
  }
  else
  {
    unk_140102048 = 1;
    v6 = _acrt_iob_func(2u);
    setvbuf(v6, 0, 4, 0);
    v7 = crt_atexit(Function);
    if ( v7 )
      abort();
    sub_14000EA00();
    qword_1401020D0 = (__int64)SetUnhandledExceptionFilter(TopLevelExceptionFilter);
    set_invalid_parameter_handler(Handler);
    sub_14000F240();
    unk_140102078 = 1;
    unk_140102074 = 1;
    unk_140102070 = 1;
    if ( *(_WORD *)off_1400DA530 == 23117 )
    {
      v8 = (char *)off_1400DA530 + *((int *)off_1400DA530 + 15);
      if ( *(_DWORD *)v8 == 17744 )
      {
        v9 = *((_WORD *)v8 + 12);
        if ( v9 == 267 )
        {
          if ( *((_DWORD *)v8 + 29) > 0xEu )
            v7 = *((_DWORD *)v8 + 58) != 0;
        }
        else if ( v9 == 523 && *((_DWORD *)v8 + 33) > 0xEu )
        {
          v7 = *((_DWORD *)v8 + 62) != 0;
        }
      }
    }
    dword_140102008 = v7;
    if ( unk_140102090 )
      set_app_type(_crt_gui_app);
    else
      set_app_type(_crt_console_app);
    *_p__fmode() = unk_1401020C0;
    *_p__commode() = unk_140102080;
    if ( (int)sub_14000E670() < 0 )
      goto LABEL_39;
    if ( unk_1400D00A0 == 1 )
      sub_14000EDD0(sub_14000E730);
    if ( unk_1400D0020 == -1 )
      configthreadlocale(-1);
    if ( initterm_e(&qword_1400E5770, qword_1400E5778) )
      return 255;
    v18[0] = unk_140102060;
    if ( (int)sub_14001A2A0(
                (unsigned int)&dword_140102020,
                (unsigned int)&qword_140102018,
                (unsigned int)&qword_140102010,
                unk_140102050,
                (__int64)v18) < 0
      || (v10 = dword_140102020, v11 = malloc(8LL * (dword_140102020 + 1)), (v12 = (__int64)v11) == 0) )
    {
LABEL_39:
      sub_14001A270(8);
    }
    if ( (int)v10 > 0 )
    {
      v13 = qword_140102018;
      for ( i = 1; ; ++i )
      {
        v15 = strlen(*(const char **)(v13 + 8 * i - 8)) + 1;
        v16 = malloc(v15);
        *(_QWORD *)(v12 + 8 * i - 8) = v16;
        if ( !v16 )
          goto LABEL_39;
        memcpy(v16, *(const void **)(v13 + 8 * i - 8), v15);
        if ( v10 == i )
          break;
      }
      v11 = (_QWORD *)(v12 + 8 * v10);
    }
    *v11 = 0;
    qword_140102018 = v12;
    initterm(&qword_1400E5760, &qword_1400E5768);
    sub_14000E650();
    unk_140102048 = 2;
  }
  if ( !v2 )
    _InterlockedExchange64(&qword_140102040, 0);
  if ( TlsCallback_0 )
    TlsCallback_0(0, 2, 0);
  v3 = (_QWORD *)sub_14001A260();
  v4 = (unsigned int)dword_140102020;
  *v3 = qword_140102010;
  result = sub_1400CEAD0(v4, qword_140102018);
  if ( !dword_140102008 )
    exit(result);
  if ( !dword_140102004 )
  {
    v17 = result;
    cexit();
    return v17;
  }
  return result;
}


Но и тут нет красивого Hello world, как у тебя.

Моих знаний хватает на то, чтобы понять, что функция sub_140001020 только настраивает CRT, обработчики исключений, подготавливает argc/argv/envp и уже только потом вызывает main.

Короче, я понимаю, что главная функция вызывается на 132 строке.

C
1
result = sub_1400CEAD0(v4, qword_140102018);

Перехожу в функцию sub_1400CEAD0. Да, теперь я вижу мой Hello World на 12 строке.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
__int64 sub_1400CEAD0()
{
  _QWORD *v0; // rbx
  __int64 v1; // rax
  __int64 v2; // rcx
  __int64 v3; // rdx
  __int64 v4; // rax
  __int64 (__fastcall *v6)(); // rax
  __int64 v7; // [rsp+28h] [rbp-10h]
 
  sub_14000E650();
  v0 = (_QWORD *)sub_1400CBAF0(&unk_1400D2B60, "Hello, World!");
  v1 = *(_QWORD *)(*v0 - 24LL);
  v2 = *(_QWORD *)((char *)v0 + v1 + 240);
  if ( !v2 )
    sub_1400CED00();
  if ( *(_BYTE *)(v2 + 56) )
  {
    v3 = (unsigned int)*(char *)(v2 + 67);
  }
  else
  {
    v7 = *(_QWORD *)((char *)v0 + v1 + 240);
    sub_14002D8A0();
    v3 = 10;
    v6 = *(__int64 (__fastcall **)())(*(_QWORD *)v7 + 48LL);
    if ( v6 != sub_14002E170 )
      v3 = (unsigned int)((char (__fastcall *)(__int64, __int64))v6)(v7, 10);
  }
  v4 = sub_140088AD0(v0, v3);
  sub_140088D70(v4);
  sub_1400860E0(&unk_1400D2800);
  return 0;
}
Custos, вот как ты делаешь, что у тебя псевдокод действительно в пару строк?

Вот я повторил в Ghidra, там тоже самое. Вот стартовая функция.

C
1
2
3
4
5
6
void entry0(void)
{
    *(undefined4 *)0x140102090 = 0;
    fcn.140001020();
    return;
}
Снова нужно перейти в функцию fcn.140001020, потом копаться в 140+ строках кода, потом перейти в функцию fcn.1400cead0.

Я даже специально поставил IDA Pro 9.2 в надежде тоже получить псевдокод в несколько строк как на твоем скрине, а оказалось, что эта прога ничем не лучше (имею в виду в плане кода, интерфейс конечно лучше), псевдокод такой же читаемости, что и у Ghidra, которая абсолютно бесплатна. Или научи, как получить такой краткий псевдокод.

Custos, IDA Pro в целом понравилась. Очень удобно переходить между псевдокодом и красивыми блоками ассемблерного кода. Assemble и применение патчей к exe тоже понравилось, визуально с помощью блоков все понятно. Не нужно даже закрывать открытый исполняемый файл, как это нужно x64dbg, при применении патчей, хотя я понимаю, почему это так - x64dbg - он же отладчик, запускает прогу, а ida pro производит стат. анализ без запуска проги.
0
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
08.01.2026, 17:41
Цитата Сообщение от Royal_X Посмотреть сообщение
и ты утверждаешь, что так просто найти.
Да, на винде я в основном работаю с компилятором MSVC и там найти свою main функцию просто. Потроха CRT выглядят достаточно шаблонно, и если часто с этим работаешь, то быстро добираешься до пользовательского кода пропуская все эти потроха.
Хотя даже в приведенном тобой листинге sub_140001020 вызов пользовательского main (sub_1400CEAD0) тоже сразу бросается в глаза.

Цитата Сообщение от Royal_X Посмотреть сообщение
Вот у тебя на скриншоте просто волшебство, в псевдокоде сразу видна строка hello world и ты утверждаешь, что так просто найти.
Все верно, это выхлоп дефолтной IDA 9.x версии для бинарника собранного MSVC. Кидаешь бинарник в IDA, идешь на entry point, быстренько пропускаешь CRT потроха и попадаешь в пользовательский main с принтом "Hello World".

Цитата Сообщение от Royal_X Посмотреть сообщение
Но и тут нет красивого Hello world, как у тебя.
По псевдокоду сгенерированного декомпилятором для sub_1400CEAD0 могу попробовать пованговать чисто "на глаз", что у тебя в твоей main функции было примерно такое:
C++
1
2
3
4
int main() {
  std::cout << "Hello, World!" << std::endl;
  return 0;
}
std::endl / перевод строки в iostream завязан на locale и facet std::ctype<char>, чтобы корректно "расширить" символ '\n' через widen().

Печать строки в поток:
C++
1
v0 = sub_1400CBAF0(&unk_1400D2B60, "Hello, World!");
unk_1400D2B60 - похоже на объект std::cout
sub_1400CBAF0 - фактически это operator<< (ostream&, const char*)

Достаем facet ctype из locale потока и получаем "widened" символ перевода строки
(это типичный паттерн libstdc++, если ctype уже инициализировал таблицу widen, то берем готовое значение, а иначе вызываем виртуальную widen())
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
v2 = *(_QWORD *)((char *)v0 + v1 + 240);
  if ( !v2 )
    sub_1400CED00();                                // бросить исключение/abort, если facet отсутствует
  if ( *(_BYTE *)(v2 + 56) )
  {
    v3 = (unsigned int)*(char *)(v2 + 67);   // кеш widen уже готов
  }
  else
  {
    v7 = *(_QWORD *)((char *)v0 + v1 + 240);
    sub_14002D8A0();                                // подготовка widen-таблицы
    v3 = 10;
    v6 = *(__int64 (__fastcall **)())(*(_QWORD *)v7 + 48LL);        // vtable call
    if ( v6 != sub_14002E170 )
      v3 = (unsigned int)((char (__fastcall *)(__int64, __int64))v6)(v7, 10);   // virtual widen('\n')
  }
operator<< / put(char)
C++
1
v4 = sub_140088AD0(v0, v3);
Это похоже на flush
C++
1
sub_140088D70(v4);



В моем же примере был обычный printf, из-за чего нет столько потрохов.
1
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6338 / 3071 / 1054
Регистрация: 01.06.2021
Сообщений: 11,786
08.01.2026, 18:17
Цитата Сообщение от Custos Посмотреть сообщение
В моем же примере был обычный printf, из-за чего нет столько потрохов.
да, я так и думал. Сишный код будет легче разбирать, чем крестовый из-за стандартной библиотеки, она неплохо захламляет код.

Но ты представь, каким трудночитаемым будет код игры на UE / C++. Там же свое API и на крестах.
Да, если будет цель взломать какую-то важную часть логики игры (например, механизм лицензирования) и если игра будет стоить свеч, то это всё осуществимо.
Но я выше писал про кражу всего игрового кода. Код на компилируемом языке нельзя вытащить в том виде, в котором его можно будет использовать для воссоздания оригинального проекта. Патчить, делать мелкие моды - да, можно. Но воссоздать проект - нет.
Я именно про это писал. Вот, если игра на Unity / C# Mono, то можно получить весь код в оригинальном виде. А учитывая, что ассеты тоже легко вытаскиваются, то по сути, можно просто украсть любую игру Unity C# Mono, которая без обфускации. Я вот свои игры начал на IL2CPP делать, вместо Mono.
Но вот, если ТС перейдет на С++, то тут проект никто не украдет. Хотя, даже на блюпринтах он никому не нужен. Там у него еще с ассетами нужно возиться много.


Custos, ida pro хороша, буду пользоваться ей, спасибо. Ghidra норм, но java интерфейс иногда бесит) Когда есть время, ассемблер изучаю. Не ставлю цели писать калькуляторы и прочие программы на ассемблере (в наше время оптимизаторы крестовых и сишных компиляторов выполняют дело лучше опытных знатоков ассемблера, так что нет смысла писать на ассемблере), а просто, чтобы иметь какие-то знания, чтобы разбираться в чужих кодах и патчить программы. ida pro буду использовать наряду с x64dbg и Cheat Engine (там я меняю куски кода, инжектируя в память. Ассемблерный код довольно простой, как в FASM).

Добавлено через 16 минут
Цитата Сообщение от Custos Посмотреть сообщение
что у тебя в твоей main функции было примерно такое
ну почти
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main()
{
    std::cout << "Hello, World!" << std::endl;
    std::cin.get();
}
0
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
08.01.2026, 18:43
Цитата Сообщение от Royal_X Посмотреть сообщение
std::cin.get();
Ага, это была строка
Code
1
sub_1400860E0(&unk_1400D2800);
, которую быстро не удалось понять.
Хотя можно было догадаться, что unk_1400D2800 - это один из объектов stdin/stdout/strerr, так как он лежит "близко" к stdout (unk_1400D2B60)

Добавлено через 5 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
она неплохо захламляет код
Да, но если часто с этим работать, то глаз уже начинает видеть знакомые шаблоны и мозг это "декомпилирует" в привычные C/C++ конструкции. Это как с обычным чтением, когда ты не пытаешься понять каждую букву отдельно, а сразу понимаешь целые слова и предложения уже целиком. Также у IDA есть FLIRT, что помогает разбирать шаблонные потроха вместо тебя.
1
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6338 / 3071 / 1054
Регистрация: 01.06.2021
Сообщений: 11,786
08.01.2026, 18:52
Custos, в Ghidra можно легко переходить между файлами в рамках одного проекта, т.е. можно одновременно открывать несколько бинарников и видеть их как единый проект. Как понимаю, в IDA Pro такого нет?
0
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
08.01.2026, 19:02
Цитата Сообщение от Royal_X Посмотреть сообщение
в Ghidra можно легко переходить между файлами в рамках одного проекта, т.е. можно одновременно открывать несколько бинарников и видеть их как единый проект. Как понимаю, в IDA Pro такого нет?
IDA "исторически" заточена под анализ одного бинарника. Один "проект/сеанс" - одна открытая база (.idb/.i64) для одного основного бинарника. У Ghidra проект изначально рассчитан на "папку" с множеством бинарников и удобное переключение между ними. Можно подгрузить (File --> Load file --> Additional binary file) второй файл в ту же базу, но он будет трактоваться как raw binary, даже если это PE/ELF/Mach-O, и адреса/сегменты придётся выставлять самому. То есть это не "второй полноценно распознанный модуль", а просто кусок байт в памяти базы.
Тут можно почитать официальный ответ насчет этого: https://hex-rays.com/blog/several-files-in-one-idb
1
Модератор
Эксперт Java
 Аватар для alecss131
2902 / 1407 / 413
Регистрация: 11.08.2017
Сообщений: 4,512
Записей в блоге: 2
09.01.2026, 12:04
Цитата Сообщение от Royal_X Посмотреть сообщение
программа, которая выводит hello world, со статической линковкой
Как по мне статически линковать рантайм ну такое себе, ну разве что на гнутых компиляторах имеет смысл, а вот в студии точно нет.
Цитата Сообщение от Royal_X Посмотреть сообщение
Сишный код будет легче разбирать, чем крестовый из-за стандартной библиотеки
Тут скажу даже больше, сишный printf при использовании всего с одной строкой без доп параметров заменяется на puts. У мелкософта в ucrt "небезопасные" функции (_CRT_SECURE_NO_WARNINGS) вынесены в отдельную либу (legacy_stdio_definitions.lib legacy_stdio_wide_specifiers.lib), тогда как ucrt состоит из трех либ ucrt.lib vcruntime.lib msvcrt.lib а плюсовая в msvcprt.lib

Цитата Сообщение от Royal_X Посмотреть сообщение
игры на UE / C++
Все же в плане взлома UE имхо куда проще чем приватные движки студий, ведь этот движок доступен любому да и еще в исходниках, можно будет куда легче отделять логику движка от игрового кода
Цитата Сообщение от Royal_X Посмотреть сообщение
игра на Unity / C# Mono
Тут даже сторонние защиты почти не эффективны. Думаю известна защита под названием Denuvo, которую почти не ломают, так вот Юнити в этом исключение, там она отламывается на раз два. Единственное исключение это одна игра из магазина EA - Origin, но там думаю основная загвоздка была в магазине.

Сейчас куча крупных студи с ААА проектами переходят на UE. Хотя мне нравится этот движок, но он становится очень прожорливым. Например я удивился, что игра 2023 года с 5.3 версией движка у меня при автоопределении выставляет низкие настройки и используется еще жуткий апскейл. Комп грузится на пределе, но зато большую часть времени 60фпс.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6338 / 3071 / 1054
Регистрация: 01.06.2021
Сообщений: 11,786
09.01.2026, 12:20
Цитата Сообщение от alecss131 Посмотреть сообщение
Как по мне статически линковать рантайм ну такое себе, ну разве что на гнутых компиляторах имеет смысл, а вот в студии точно нет.
да, я же писал, что компилировал с помощью GNU GCC (g++). согласен, если юзать MSVC, то лучше динамически

Цитата Сообщение от alecss131 Посмотреть сообщение
плане взлома UE
если под взломом подразумевать взлом части логики - например, механизма лицензирования/активации, или внедрение каких-то читов, или модификация игры, то на сегодняшний день от такого взлома нет никакой защиты. Какая бы была защита - такой взлом просто вопрос времени.

Но я в этой теме имею в виду полный взлом игры и получение доступ к оригинальному проекту, прям когда ты берешь игру и создаешь из нее проект, который ты можешь открыть в редакторе игрового движка. Вот игры на Unity Mono можно так делать, а вот игры на Unity IL2CPP - нет.

Цитата Сообщение от alecss131 Посмотреть сообщение
мне нравится этот движок, но он становится очень прожорливым
кстати, крайняя версия движка 5.7.1 у меня установилась как обновление поверх 5.7 и не пришлось заново скачивать весь движок. Я не знаю, теперь будет уже так. Если да, то значит разрабы UE наконец поумнели, а то раньше приходилось полностью скачивать новую версию и удалять старую.
0
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
09.01.2026, 17:04
Цитата Сообщение от alecss131 Посмотреть сообщение
а вот в студии точно нет
Зависит от ситуации. Если вы соло разработчик (у которого не так много времени, чтобы отвечать на тупейшие вопросы пользователей), а ваше приложение рассчитано на распространение среди широкой аудитории (а не B2B), то лучше линкуйте все статически.
В моем случае это игровая аудитория и она в своем большинстве невероятно тупая.
Вы можете написать сколько угодно инструкций установки со всеми ссылкам на нужные версии пакетов Visual C++ Redistributable, либо распространять эти пакеты вместе с своим приложением, чтобы пользователю оставалось лишь установить их. Всегда найдется куча аутистов не умеющих читать, либо не понимающих смысла написанного.

Решением проблемы для меня стала статическая линковка всех зависимостей. Незначительное увеличение размера финального бинарника вполне приемлемая цена за экономию вашего времени.

Добавлено через 19 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
если под взломом подразумевать взлом части логики - например, механизма лицензирования/активации, или внедрение каких-то читов, или модификация игры, то на сегодняшний день от такого взлома нет никакой защиты. Какая бы была защита - такой взлом просто вопрос времени.
Только даже в этой ситуации никто не отменяет старый добрый принцип Парето. Приложив даже минимальные усилия можно сильно сократить круг лиц, которым будет под силу подобное. А если постараться чуть больше, то, к примеру, читеров вообще можно загнать в область DMA, что увеличивает стоимость читов, а также сильно сокращает потенциальную аудиторию пользователей таких читов.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6338 / 3071 / 1054
Регистрация: 01.06.2021
Сообщений: 11,786
09.01.2026, 17:07
Цитата Сообщение от Custos Посмотреть сообщение
лучше линкуйте все статически
программы, компилированные mingw-w64-ucrt-x86_64-toolchain, я всегда линкую статически, иначе для самого обычного hello world нужно поставлять:
  • libgcc_s_seh-1.dll
  • libstdc++-6.dll
  • libwinpthread-1.dll

Зачем мне такое чудо? Статически линкуешь и едешь дальше)

Вот, программы, скомпилированные MSVC, еще можно линковать динамически, поскольку у многих юзеров Visual C++ Redistributable уже установлены. Даже если юзер явно их не устанавливал, то высока вероятность, что с какой-то прогой или игрой, эти компоненты уже были установлены.

Цитата Сообщение от Custos Посмотреть сообщение
Всегда найдется куча аутистов не умеющих читать, либо не понимающих смысла написанного.
я даже больше скажу, недавно я на другом форуме был свидетелем уникального явления - люди, скачивающие софт для реверс-инжиниринга, не могли прописать одну команду в консоли...спрашивали, как это делать.

Цитата Сообщение от Custos Посмотреть сообщение
сильно сократить круг лиц, которым будет под силу подобное
инди-игры и говно-игры никто не взламывает, даже если разраб выложит файлы проекта игры - никто качать не станет)))
если же это крутая ААА игра, и на эту игру есть спрос в мире геймеров и мододелов, то какой бы крутой ни была защита DRM, ее просто жестко порвут.
так что, выглядит смешно, когда разраб низкосортного софта тратит время на реализацию корявых методов защиты якобы для сужения круга лиц... у таких разрабов круг игроков чрезвычайно узкий, не то чтобы иметь круг тех, кто желает взломать игру
0
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
09.01.2026, 17:42
Цитата Сообщение от Royal_X Посмотреть сообщение
Статически линкуешь и едешь дальше)
Всегда так делаю, если предполагается "широкое" распространение приложения.

Цитата Сообщение от Royal_X Посмотреть сообщение
поскольку у многих юзеров Visual C++ Redistributable уже установлены. Даже если юзер явно их не устанавливал, то высока вероятность, что с какой-то прогой или игрой, эти компоненты уже были установлены.
У многих, но не у всех. А когда у вас несколько тысяч уникальных пользователей, то такое уже становится заметно и отнимает время. А еще бывает, что Visual C++ Redistributable установлен, но не той версии/разрядности.

В целом у статической линковки есть свои недостатки:
1) Бинарник заметно толще (но с нынешней скоростью интернета это зачастую не является проблемой)
2) Если уязвимость/баг в рантайме или библиотеке - при статике нужно пересобирать и перевыкатывать приложение целиком. При динамике часто достаточно, что у пользователя обновится общий runtime/библиотека.
3) Проблемы на границах модулей и "2 кучи". Главная практическая боль: если в процессе есть несколько модулей, которые собраны с разными CRT (часть /MT, часть /MD), или плагины/SDK. Память выделили в одном модуле, освободили в другом --> краши/утечки/heap corruption. То же касается объектов STL, new/delete, malloc/free, FILE*, локалей и т.д.
4) Дублирование глобального состояния: при статике в нескольких модулях могут появляться дубликаты. Разные экземпляры "глобальных" синглтонов из библиотек, разные таблицы локалей/кодировок, разные C++ exception runtime куски.

Об этом всем надо помнить, когда собираешь свое "Portable" приложение.

Добавлено через 9 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
если же это крутая ААА игра, и на эту игру есть спрос в мире геймеров и мододелов, то какой бы крутой ни была защита DRM, ее просто жестко порвут.
Задача DRM никогда не состояла в том, чтобы вообще предотвратить кряк игры. Её главная задача, чтобы предотвратить появление кряка в момент релиза игры и некоторое время после релиза (это момент, когда идет основная часть прибыли от продаж). Дальше, когда игра уже "отбилась", довольно часто сами её авторы снимают DRM.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
08.03.2026, 18:57  [ТС]

Lineedge (Semi-Alpha) 0.8M


Плохие новости - некоторые из ресурсов, использованных мной в Lineedge, были удалены с маркетплейса по непонятной причине, возможно, из-за нарушений, за которые возможны претензии и ко мне, поэтому пришлось как можно быстрее, в минимальном консистентном состоянии, выпускать патч, чтобы не загреметь. Я назвал его Lineedge (Semi-Alpha) 0.8M. Вот что изменилось:
- Заменены ресурсы с нарушениями лицензии, чтобы избежать претензий, нарушающие версии удалены.
- Добавлены новые враги - ROBRES - и новые постройки - склад ресурсов и другие, некоторые пока нельзя построить из-за невозможности добыть необходимые для постройки ресурсы.
- Исправлено большинство замеченных в версии 0.8 ошибок, в том числе существенно оптимизировано главное меню. Исправлена ли ошибка с камерой, проходящей сквозь стены, установить трудно, возможно, в каких-то случаях и вылезает.
- Исправлена серьезная ошибка, из-за которой нельзя было открыть ворота в EVENINGSIDE.
- Исправлены неадекватные тормоза на listen-сервере, из-за которых строить постройки было мукой (а без сервера строить постройки нельзя из-за особенностей World Partition - резкий переход в другую часть мира может вызвать неопределенное поведение).
- К сожалению, скачиваемый размер игры перешагнул долго державшуюся отметку в 3 ГБ и пошел дальше. Ничто не вечно...

Системные требования


Легенда: процессор (ядра x ГГц) / видеокарта (разбивка идет по моделям от NVIDIA, так как они знакомы большему числу пользователей) / RAM (ГБ) + подкачка (ГБ) / прочее.
Минимальные (обычные редакции, низкая графика, 1024x768 (меньшее разрешение не поддерживается), будут сбои, зависания и рассинхронизация): любой 64-разрядный (даже медленный процессор рано или поздно заданную ему программу выполнит), для речи в Windows нужна поддержка AVX и AVX2 / десктопная от GTX 950 или встроенная от 2020 года / 16+16 / VRAM * 2 + RAM (не подкачка) - не менее 16 ГБ, VRAM + RAM + подкачка - не менее 32 ГБ (в случае встроенной видеокарты - 16 ГБ RAM и 16 ГБ подкачки).
Средние (обычные редакции, средняя графика, 1920x1080): 4x3 / 3060 8 GB, не менее 8 ГБ VRAM / 24.
Рекомендуемые (обычные редакции, высокая графика, 1920x1080): 6x3.5 / 4060 Ti 16 GB, не менее 16 ГБ VRAM / 32.
Высокие (платиновая редакция, платиновая графика, 2560x1440): 8x5 / 5090 / 96 / DirectX 12, SM6, HDR.
Эпические (платиновая редакция, платиновая графика плюс прозрачность с помощью трассировки лучей и AO с помощью трассировки лучей, 3840x2160): 8x5 (не знаю, задействует ли игра больше 8 ядер) / 2x RTX PRO 6000 Blackwell / 128 / DirectX 12, SM6, HDR.

Замеченные, но не исправленные ошибки


1. Глобальное подключение может сразу не получиться. Не отчаивайтесь, пробуйте снова, особенно если у вас не очень быстрый компьютер. Надеюсь, в таких случаях, как минимум, выдается соответствующее сообщение (в отличие от прошлого выделенного сервера). (Примечание: если сообщение не выдается, но вместо вашего имени - EXITED, это некорректный вход, попробуйте еще раз. А если имя корректно, но вы не видите пейзажа, а только небо, вход корректен, нужно просто подождать.)
2. На медленном компьютере враги могут собираться "пачками" и не двигаться, а игрок - не реагировать сразу на нажатия кнопок. Это не баги, но, к счастью, и не фичи, это - лаги. На быстром компьютере, и если сервер не перегружен, их нет.
3. Во время установки после выбора одного или всех пользователей происходит распаковка, но ее прогресс не отображается, и на медленном компьютере может ничего видимого не происходить десятки минут. Если вы сомневаетесь, не вылетела ли установка - посмотрите в диспетчере задач.
4. В игре присутствуют негативные VFX, проявляющиеся, например, когда единица-маг применяет BASIC или при огибании ее магическим NATRE.
5. На клиенте может возникнуть иллюзия, что две KC стоят "одна в одной", но не сливаются, а случайным образом "лежат" друг на друге, наводя ужас на всех проходящих.
6. Невозможно подключиться к listen-серверу, при попытке это сделать игра зависает. При этом создание сервера и игра в соло работают.
7. Деревья (в частности, BYAROWS) визуально полупрозрачны и бесцветны, пока к ним не подойти вплотную.
8. Экваториальные деревья качаются неадекватно сильно.
9. Когда множество автомобилей находятся на маленькой территории с относительно гладкой нижней поверхностью (например, в гараже), они начинают скользить, затем сталкиваться, затем подпрыгивать, ударяться друг об друга и об стены гаража и разрушаться с мерзким звуком.
Можете не тестировать, это технический патч, главной цели уже достигший.
0
 Аватар для Nishen
1359 / 857 / 366
Регистрация: 26.02.2015
Сообщений: 3,831
30.03.2026, 09:24
Etyuhibosecyu, скажите, как с вами связаться по вопросам сотрудничества, хотели бы выпустить вашу игру на дисках. У вас есть такое в планах?
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
30.03.2026, 11:04  [ТС]
Цитата Сообщение от Nishen Посмотреть сообщение
скажите, как с вами связаться по вопросам сотрудничества
Цитата Сообщение от Правила
Не стоит просить или предлагать выслать ответ в icq, e-mail и другие средства общения. Эта просьба все равно не будет выполнена, а сообщение будет отредактировано модератором.
Так что связывайтесь на форуме, если это не насмешка. А я думаю, что она, если вы поленились даже прочитать главную страницу сайта.
Цитата Сообщение от Nishen Посмотреть сообщение
хотели бы выпустить вашу игру на дисках
На DVD? Да я бы не против, но сомневаюсь, что во второй половине 2020-х это кого-то заинтересует. Сейчас мало у кого и дисководы есть, что еще один аргумент в пользу того, что это ирония.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6338 / 3071 / 1054
Регистрация: 01.06.2021
Сообщений: 11,786
30.03.2026, 11:51
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Сейчас мало у кого и дисководы есть
вместе с игрой можешь поставлять внешний оптический привод, который подключается к любому устройству через USB
0
 Аватар для Noname2331
97 / 89 / 10
Регистрация: 22.12.2024
Сообщений: 597
30.03.2026, 12:21
Я бы без иронии закинул небольшую сумму денег, если бы автор объявил сбор на включение игры в реестр Минцифры в список обязательного к предустановке российского ПО.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
30.03.2026, 12:26  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
вместе с игрой можешь поставлять внешний оптический привод, который подключается к любому устройству через USB
Спасибо за шутку. А если серьезно, то моя игра выпускается на сайте и скачивается в несколько кликов, без необходимости куда-то ходить и Бог знает где что-то покупать. (Платиновая редакция продается прямо на сайте.)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.03.2026, 12:26

Генеральный план развития Lineedge
В настоящее время Lineedge является перспективной, быстро развивающейся, но все еще имеющей только...

Поздравьте с подключением Lineedge к системе контроля версий!
Кому-то эта цитата: - показалась бы мимолетно брошенными словами, не стоящими внимания. Но меня...

Оцените "лик" Lineedge
С каждым месяцем в Lineedge добавляется все больше красоты, и только в окне выбора репрезентации...

Где показать Lineedge, чтобы получить тестирование, а не флуд?
Показ Lineedge (Semi-Alpha) 0.74/0.75 закончился неудачей. Ни один человек не захотел обнаружить в...

Продам плату Stream Alpha Plus + Alpha Pro 2.0 + Tele 2.2 б/у
Плата Stream Alpha Plus немного б/у, CD-диск Alpho Pro 2.0, CD-диск TELE 2.2, USB-ключ защиты для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
480
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru