ΠΠΎΠ»Π½ΠΎΠ΅ Code Review: BusEngine (BuslikDrev/BusEngine)
ΠΠ²ΡΠΎΡ: ΠΡΡΠ»ΡΠΊΠΡΡΡ
ΠΠΈΡΠ΅Π½Π·ΠΈΡ: MIT
Π―Π·ΡΠΊ: C# (.NET Framework 4.7.1+, netstandard2.0)
Π Π°Π·ΠΌΠ΅Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ: ~250MB (Π²ΠΊΠ»ΡΡΠ°Ρ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊΠΈ MSBuild + Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ)
Π‘ΡΡΠΎΠΊ C# ΠΊΠΎΠ΄Π°: ~23,000
π΄ CRITICAL β ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ
1. RCE (Remote Code Execution) ΡΠ΅ΡΠ΅Π· Process.Start ΠΈΠ· Π±ΡΠ°ΡΠ·Π΅ΡΠ°
Π€Π°ΠΉΠ»: BusEngine/Code/Plugin/Program.cs, ΡΡΡΠΎΠΊΠ° 151
} else if (t == "_linkgo|") {
System.Diagnostics.Process.Start(message.Substring(8));
Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ message ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡ ΠΈΠ· Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ CefSharp-Π±ΡΠ°ΡΠ·Π΅ΡΠ° ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ»Π±ΡΠΊ OnPostMessage. ΠΡΠ±Π°Ρ Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΠ°, Π·Π°Π³ΡΡΠΆΠ΅Π½Π½Π°Ρ Π² Π΄Π²ΠΈΠΆΠΎΠΊ, ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π° Ρ
ΠΎΡΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΡΠΎΠ±Ρ JavaScript Π²Π½ΡΡΡΠΈ ΠΈΠ³ΡΡ ΠΎΡΠΏΡΠ°Π²ΠΈΠ» _linkgo|cmd.exe /c ... β ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ.
Π‘ΡΠ΅ΠΏΠ΅Π½Ρ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ: ΠΏΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π°Π΄ ΠΌΠ°ΡΠΈΠ½ΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅: whitelist ΡΠ°Π·ΡΠ΅ΡΡΠ½Π½ΡΡ
URL/ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ², ΠΠ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΡΡΡΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄ Π² Process.Start.
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠ°Π±Π»ΠΎΠ½Π°Ρ
:
Templates/cs/Launcher/Code/Plugin/Program.cs:132
Templates/cs/CubesOpenGL/Code/CubesOpenGL/Program.cs:1913 (Π±ΠΎΠ»Π΅Π΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ Ρ ProcessStartInfo, Π½ΠΎ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π±Π΅Π· Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ)
2. WMI Injection
Π€Π°ΠΉΠ»: BusEngine/Code/BusEngine/BusEngine.cs, ΡΡΡΠΎΠΊΠ° 2555
query.Query = new ObjectQuery(
"SELECT * FROM Win32_LogicalDisk WHERE Name='" +
BusEngine.Engine.EngineDirectory.Substring(0, 2) + "' OR Name='" +
BusEngine.Engine.EditorDirectory.Substring(0, 2) + "'");
ΠΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΡ Π½Π΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΡ
ΠΏΡΡΠ΅ΠΉ Π² WMI-Π·Π°ΠΏΡΠΎΡ. ΠΡΠ»ΠΈ Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅Ρ EngineDirectory ΠΈΠ»ΠΈ EditorDirectory β Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ WMI-Π·Π°ΠΏΡΠΎΡΠ°.
3. fixgithub.cs β 11,177 ΡΡΡΠΎΠΊ ASCII-Π°ΡΡΠ°, 0 ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°
Π€Π°ΠΉΠ»: BusEngine/Code/fixgithub.cs β 1.7 MB.
Π€Π°ΠΉΠ» ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ 12+ ΠΊΠΎΠΏΠΈΠΉ ASCII-Π»ΠΎΠ³ΠΎΡΠΈΠΏΠ° Π² Π±Π»ΠΎΡΠ½ΡΡ
ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ
ΠΈ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΊΠΎΠ΄Π°. ΠΠΈ ΠΊΠ»Π°ΡΡΠΎΠ², Π½ΠΈ Π½Π΅ΠΉΠΌΡΠΏΠ΅ΠΉΡΠΎΠ², Π½ΠΈ using. ΠΡΠΎ ΠΌΡΡΡΠ²ΡΠΉ Π³ΡΡΠ·, ΠΊΠΎΡΠΎΡΡΠΉ:
- ΠΠ°ΠΌΠ΅Π΄Π»ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ (ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΠΏΠ°ΡΡΠΈΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ)
- Π£Π²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π½Π° 1.7 MB
- ΠΠ°ΡΠΎΡΡΠ΅Ρ ΠΏΠΎΠΈΡΠΊ ΠΏΠΎ ΠΊΠΎΠ΄Ρ
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ: ΡΠ΄Π°Π»ΠΈΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ.
π΄ HIGH β ΠΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ
4. God Object: BusEngine.cs β 10,105 ΡΡΡΠΎΠΊ, 50+ ΠΊΠ»Π°ΡΡΠΎΠ² Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅
ΠΠ΄ΠΈΠ½ ΡΠ°ΠΉΠ» ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ: Engine, AI, Audio, Browser, Camera, Canvas, Color, Core, FlowGraph, Layer, Level, Localization, Log, Material, Matrix2-4x3, Model, Object, Physics, Plugin, Rendering, Shader, Ajax, Json, File, Timer, Canvas (UI), Vector2-4, Video, ProjectDefault, Device, Form, IPlugin...
ΠΡΠΎΠ±Π»Π΅ΠΌΡ:
- ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎ (0 unit-ΡΠ΅ΡΡΠΎΠ²)
- ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ ΠΏΠΎ ΡΠ°ΠΉΠ»Ρ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΠΌΠΈΠ½ΡΡΡ Π΄Π°ΠΆΠ΅ Π² IDE
- ΠΡΠ±ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΈΡΠΊΡΠ΅Ρ ΡΠ»ΠΎΠΌΠ°ΡΡ Π½Π΅ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»
- ΠΠΎΠ³Π½ΠΈΡΠΈΠ²Π½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ° Π½Π° Π½ΠΎΠ²ΡΡ
ΠΊΠΎΠ½ΡΡΠΈΠ±ΡΡΡΠΎΡΠΎΠ² Π·Π°ΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π°
- ΠΠ»Π°ΡΡ-Π·Π°Π³Π»ΡΡΠΊΠ°
internal class G (ΡΡΡΠΎΠΊΠ° 6759) β Π½Π΅Π²Π½ΡΡΠ½ΠΎΠ΅ ΠΈΠΌΡ
5. ΠΠ°ΡΡΠΎΠ²ΠΎΠ΅ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°
| Π€Π°ΠΉΠ» |
Π‘ΡΡΠΎΠΊ |
ΠΠ΄Π΅Π½ΡΠΈΡΠ΅Π½ |
Game/Game.cs |
278 |
|
Editor/Editor.cs |
274 |
β¨ 99% |
Π Π°Π·Π»ΠΈΡΠ°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ:
- GUID ΠΌΡΡΡΠ΅ΠΊΡΠ° (
0968cb8e... vs 28cb03ec...)
Engine.Platform ("Windows" vs "WindowsEditor")
Π¨Π°Π±Π»ΠΎΠ½Ρ (Launcher/Code/Plugin/Program.cs ΠΈ Plugin/Program.cs) ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ OnPostMessage.
ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅: Π²ΡΠ½Π΅ΡΡΠΈ ΠΎΠ±ΡΠΈΠΉ Initialize + Form Π² shared library.
6. ΠΠ°ΡΠΈΡΡΠ΅ API-ΠΊΠ»ΡΡΠΈ
Π€Π°ΠΉΠ»: Plugin/Program.cs, ΡΡΡΠΎΠΊΠΈ 119-121
System.Environment.SetEnvironmentVariable("google_api_key", "123");
System.Environment.SetEnvironmentVariable("google_default_client_id", "123.apps.googleusercontent.com");
System.Environment.SetEnvironmentVariable("google_default_client_secret", "123-123");
Π₯ΠΎΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΉΡΠ°Ρ Π·Π°Π³Π»ΡΡΠΊΠΈ, ΡΠ°ΠΌ ΠΏΠ°ΡΡΠ΅ΡΠ½ ΠΎΠΏΠ°ΡΠ΅Π½. API-ΠΊΠ»ΡΡΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Ρ
ΡΠ°Π½ΠΈΡΡΡΡ Π² ΠΊΠΎΠ΄Π΅.
7. ΠΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ GC.Collect Π½Π° ΡΠ°ΠΉΠΌΠ΅ΡΠ΅
Π€Π°ΠΉΠ»: BusEngine.cs, ΡΡΡΠΎΠΊΠΈ 3043-3045
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.GC.Collect(); // ΠΠΠΠΠΠ« ΠΏΠΎΠ΄ΡΡΠ΄!
ΠΠ°ΠΆΠ΄ΡΠ΅ N ΡΠ΅ΠΊΡΠ½Π΄ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 5) Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΡΠ±ΠΎΡΠΊΠ° ΠΌΡΡΠΎΡΠ° β Π΄Π²Π°ΠΆΠ΄Ρ. ΠΡΠΎ ΡΠΈΠΌΠΏΡΠΎΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΌΡΡΡΡ, Π° Π½Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. ΠΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠΈΠ·Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π°.
π‘ MEDIUM β ΠΠ°ΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ΄Π°
8. Π§ΡΠ΅Π·ΠΌΠ΅ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ dynamic β 35 Π²Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ
ΠΡΠ΅ ΠΊΠΎΠ»Π±ΡΠΊΠΈ Ajax-ΠΊΠ»Π°ΡΡΠ° ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ dynamic:
public delegate void Success(dynamic data = null, dynamic xhr = null);
public delegate void Error(dynamic xhr = null, string textStatus = null, dynamic thrownError = null);
Π’Π΅ΡΡΠ΅ΡΡΡ ΡΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ. ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΠΌΠ΅ΡΡΠΎ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ.
9. 512 ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² new β GC pressure
ΠΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΠΉ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ°Π΄Ρ β Π²ΠΊΠ»ΡΡΠ°Ρ Paint-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ. ΠΡΠΈ 60 FPS = ~30,000 new/ΡΠ΅ΠΊ β ΡΠ΅ΡΡΡΠ·Π½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ° Π½Π° GC.
10. ΠΡΠΎΠ±Π»Π΅ΠΌΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ
- 28 try / 14 catch β ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° Π±Π»ΠΎΠΊΠΎΠ² try Π±Π΅Π· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ (ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ catch ΠΏΡΠΈ finally, Π½ΠΎ Π·Π΄Π΅ΡΡ ΠΈ finally ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½Π΅ΠΊΠΎΠ½ΡΠΈΡΡΠ΅Π½ΡΠ½ΠΎ)
- Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ»Ρ:
Commands, FPSCPU, FPSGPU, FPSKEY β Π³ΠΎΠ½ΠΊΠΈ Π΄Π°Π½Π½ΡΡ
Task.Factory.StartNew Π±Π΅Π· ConfigureAwait β deadlock-ΡΠΈΡΠΊ Π² UI-ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅
- Π’ΡΠΈ ΠΊΠΎΠΏΠΈΠΈ ΠΏΠ»Π°Π³ΠΈΠ½-Π»ΠΎΠ°Π΄Π΅ΡΠ° (ΡΡΡΠΎΠΊΠΈ 5854-5953) β ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ
typ (1/2/3), Π²ΡΠ±ΠΎΡ Π·Π°Ρ
Π°ΡΠ΄ΠΊΠΎΠΆΠ΅Π½ (typ = 3)
11. ΠΠ°ΡΡΡΠ΅Π½ΠΈΠ΅ IDisposable β 43 ΡΡΡΠ½ΡΡ
.Dispose()
ΠΠΌΠ΅ΡΡΠΎ using β ΡΡΡΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ .Dispose(). ΠΡΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠ΅ΡΡΡΡΡ ΡΡΠ΅ΠΊΠ°ΡΡ:
System.Threading.Tasks.Task[] tasks = ...;
// ... ΡΠ°Π±ΠΎΡΠ° Ρ tasks ...
foreach (System.Threading.Tasks.Task tt in tasks) {
tt.Dispose(); // ΡΡΠ΅ΡΡΡ Π΅ΡΠ»ΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎ ΡΡΠΎΠ³ΠΎ
}
12. Π‘ΡΡΠΎΠΊΠΎΠ²Π°Ρ ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΡ Π² ΡΠΈΠΊΠ»Π°Ρ
β 176 +=
ΠΠΎΡΠΎΠΆΠ΄Π°Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΡ
ΡΡΡΠΎΠΊ. ΠΡΠΆΠ΅Π½ StringBuilder.
13. ΠΡΠ»Π°Π΄ΠΎΡΠ½ΡΠΉ ΠΊΠΎΠ΄ Π² ΡΠ΅Π»ΠΈΠ·Π΅ β 124 Π²ΡΠ·ΠΎΠ²Π° Console.*
Console.WriteLine, Console.Beep() β Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΏΠΎΠ΄ #if DEBUG.
14. Environment.Exit(0) Π² Shutdown
public static void ShutdownStatic(bool nagibator = false) {
// ...
if (nagibator) {
System.Environment.Exit(0); // ΠΆΡΡΡΠΊΠΎΠ΅ ΡΠ±ΠΈΠΉΡΡΠ²ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°
}
}
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ Ρ ΠΈΠ³ΡΠΈΠ²ΡΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ nagibator. Environment.Exit Π½Π΅ Π΄Π°ΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡΡ ΡΠΈΠ½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°ΠΌ ΠΈ finally-Π±Π»ΠΎΠΊΠ°ΠΌ.
15. Unsafe P/Invoke Π±Π΅Π· ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ
[DllImport("ntdll.dll", SetLastError = true)]
private static extern bool NtSetTimerResolution(...);
ΠΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π±Π΅Π· ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Marshal.GetLastWin32Error(). ΠΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ΅ ΡΠ°ΠΉΠΌΠ΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅Π²Π΅ΡΠ½ΠΎ Π±Π΅Π· Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠΈ.
π’ LOW β Π‘ΡΠΈΠ»Ρ ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
| ΠΡΠΎΠ±Π»Π΅ΠΌΠ° |
ΠΠ΅ΡΠ°Π»ΠΈ |
| ΠΠ°ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄ |
~30% ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ β ΠΌΡΡΡΠ²ΡΠΉ ΠΊΠΎΠ΄ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ
|
| ΠΠ΅Π»ΠΎΡΡΡΡΠΊΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ |
ΠΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ ΠΌΠ΅ΠΆΠ΄ΡΠ½Π°ΡΠΎΠ΄Π½ΡΠΉ Π²ΠΊΠ»Π°Π΄ |
| 0 ΡΠ΅ΡΡΠΎΠ² |
ΠΡΠΈ 23K ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π° β Π»ΡΠ±ΠΎΠΉ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³ ΡΠΈΡΠΊΠΎΠ²Π°Π½ |
| ΠΠ΅Ρ README |
ΠΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅, ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΏΠΎ ΡΠ±ΠΎΡΠΊΠ΅ |
internal class G |
ΠΠ°Π³Π»ΡΡΠΊΠ° Ρ Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ |
| ΠΠ³ΡΠΎΠ²ΡΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΡ |
nagibator, Π¨Π΅Π΄Π΅Π²Ρ.busproject Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°Ρ
|
| CefSharp Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ |
~100MB+ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊΠΎΠ² Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ |
π Π‘Π²ΠΎΠ΄Π½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° ΠΌΠ΅ΡΡΠΈΠΊ
| ΠΠ΅ΡΡΠΈΠΊΠ° |
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ |
| Π‘ΡΡΠΎΠΊ C# ΠΊΠΎΠ΄Π° |
~23,000 |
| Π‘ΡΡΠΎΠΊ Π² fixgithub.cs (ΠΌΡΡΠΎΡ) |
11,177 |
| ΠΠ»Π°ΡΡΠΎΠ² Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ |
50+ |
new Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΠΉ |
512 |
dynamic ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΉ |
35 |
try Π±Π΅Π· catch |
14 |
IDisposable Π±Π΅Π· using |
43 |
| Console.* Π² ΠΊΠΎΠ΄Π΅ |
124 |
| Task.Factory.StartNew |
12 |
| GC.Collect() ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎ |
2Γ ΠΊΠ°ΠΆΠ΄ΡΠ΅ 5 ΡΠ΅ΠΊ |
| RCE-ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠ΅ΠΉ |
1 (ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΎ) |
| WMI-ΠΈΠ½ΡΠ΅ΠΊΡΠΈΠΉ |
1 |
| Unit-ΡΠ΅ΡΡΠΎΠ² |
0 |
π§ ΠΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½ΡΠΉ ΠΏΠ»Π°Π½ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΉ
ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ (Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ)
- β Π£Π΄Π°Π»ΠΈΡΡ
fixgithub.cs β 1.7MB ΠΌΡΡΠΎΡΠ°
- β RCE Fix β whitelist URL Π²
Process.Start ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π½ΡΠΉ Π·Π°ΠΏΡΠ΅Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈΠ· Π±ΡΠ°ΡΠ·Π΅ΡΠ°
- β WMI Injection Fix β ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΈΠ»ΠΈ ΡΠ°Π½ΠΈΡΠΈΠ·Π°ΡΠΈΡ ΠΏΡΡΠ΅ΠΉ
ΠΡΡΠΎΠΊΠΈΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ
- ΠΡΠ½Π΅ΡΡΠΈ ΠΎΠ±ΡΠΈΠΉ ΠΊΠΎΠ΄ Game/Editor Π² Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ
- Π£Π±ΡΠ°ΡΡ
GC.Collect() β Π½Π°ΠΉΡΠΈ ΡΡΠ΅ΡΠΊΠΈ ΡΠ΅ΡΠ΅Π· memory profiler
- Π£Π±ΡΠ°ΡΡ
Environment.Exit() β Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π½Π° Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΉ shutdown
- ΠΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ API-ΠΊΠ»ΡΡΠΈ Π² ΠΊΠΎΠ½ΡΠΈΠ³-ΡΠ°ΠΉΠ» (Ρ .gitignore)
Π‘ΡΠ΅Π΄Π½ΠΈΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ
- ΠΠ°ΠΌΠ΅Π½ΠΈΡΡ
dynamic Π½Π° ΡΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ DTO Π² Ajax-ΠΊΠΎΠ»Π±ΡΠΊΠ°Ρ
- Π Π°Π·Π±ΠΈΡΡ
BusEngine.cs β ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΊΠ»Π°ΡΡΡ Π½Π° ΡΠ°ΠΉΠ»
- ΠΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ΅ΡΡΡ β ΠΌΠΈΠ½ΠΈΠΌΡΠΌ Π½Π° Vector/Math/Matrix
- ΠΠ°ΠΌΠ΅Π½ΠΈΡΡ ΡΡΡΠ½ΡΠ΅
.Dispose() Π½Π° using
- Π‘ΡΡΠΎΠΊΠΎΠ²ΡΠ΅ Π±ΠΈΠ»Π΄Π΅ΡΡ Π²ΠΌΠ΅ΡΡΠΎ ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΠΈ Π² ΡΠΈΠΊΠ»Π°Ρ
- Π£Π±ΡΠ°ΡΡ
Console.* ΠΏΠΎΠ΄ #if DEBUG
- ΠΠΎΠ±Π°Π²ΠΈΡΡ
ConfigureAwait(false) Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΠΉ ΠΊΠΎΠ΄
ΠΠΈΠ·ΠΊΠΈΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ
- README Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠΌΠΈ ΠΏΠΎ ΡΠ±ΠΎΡΠΊΠ΅
- ΠΠΎΡΠΈΡΡΠΈΡΡ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄
- ΠΠ½Π³Π»ΠΈΠΉΡΠΊΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π΄Π»Ρ ΠΌΠ΅ΠΆΠ΄ΡΠ½Π°ΡΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π°
ΠΠ±ΡΠ°Ρ ΠΎΡΠ΅Π½ΠΊΠ°
ΠΡΠΎ ΡΠΎΠ»ΡΠ½ΡΠΉ indie-ΠΏΡΠΎΠ΅ΠΊΡ Ρ Π°ΠΌΠ±ΠΈΡΠΈΠΎΠ·Π½ΡΠΌ ΡΠ°Π·ΠΌΠ°Ρ
ΠΎΠΌ β 3D-Π΄Π²ΠΈΠΆΠΎΠΊ, ΡΠ΅Π΄Π°ΠΊΡΠΎΡ, Π»Π°ΡΠ½ΡΠ΅Ρ, ΠΏΠ»Π°Π³ΠΈΠ½Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Android. ΠΠ²ΡΠΎΡ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ Π³Π»ΡΠ±ΠΎΠΊΠΎΠ΅ Π·Π½Π°Π½ΠΈΠ΅ C#, WinAPI, ΡΠ΅ΡΠ»Π΅ΠΊΡΠΈΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΎΠ΅ΠΊΡ ΡΡΡΠ°Π΄Π°Π΅Ρ ΠΎΡ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΏΡΠΎΠ±Π»Π΅ΠΌ solo-ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ: God Object, ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΡΠ΅ΡΡΠΎΠ², Π·Π°ΡΠΈΡΡΠ΅ ΡΠ΅ΠΊΡΠ΅ΡΡ, ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΠΉ ΠΊΠΎΠ΄ Π² ΡΠ΅Π»ΠΈΠ·Π΅.
ΠΡΠΎΠ΅ΠΊΡ ΠΠ Π³ΠΎΡΠΎΠ² ΠΊ production-ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±Π΅Π· ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ RCE-ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ ΠΈ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³Π°. ΠΠΎΡΠ»Π΅ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π» Π²ΡΡΠΎΠΊΠΈΠΉ β Π΄Π²ΠΈΠΆΠΎΠΊ ΡΠΆΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³, ΡΠΈΠ·ΠΈΠΊΡ, Π·Π²ΡΠΊ (LibVLC), Π²ΠΈΠ΄Π΅ΠΎ, UI (WinForms), Π±ΡΠ°ΡΠ·Π΅Ρ (CefSharp), ΡΠ΅ΡΡ (Ajax/HttpClient), ΠΏΠ»Π°Π³ΠΈΠ½Ρ.
Review Π²ΡΠΏΠΎΠ»Π½Π΅Π½ Π°Π³Π΅Π½ΡΠΎΠΌ Hermes Agent. 12.07.2026.
ΠΠΎΠ»Π½ΠΎΠ΅ Code Review: BusEngine (BuslikDrev/BusEngine)
ΠΠ²ΡΠΎΡ: ΠΡΡΠ»ΡΠΊΠΡΡΡ
ΠΠΈΡΠ΅Π½Π·ΠΈΡ: MIT
Π―Π·ΡΠΊ: C# (.NET Framework 4.7.1+, netstandard2.0)
Π Π°Π·ΠΌΠ΅Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ: ~250MB (Π²ΠΊΠ»ΡΡΠ°Ρ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊΠΈ MSBuild + Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ)
Π‘ΡΡΠΎΠΊ C# ΠΊΠΎΠ΄Π°: ~23,000
π΄ CRITICAL β ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ
1. RCE (Remote Code Execution) ΡΠ΅ΡΠ΅Π· Process.Start ΠΈΠ· Π±ΡΠ°ΡΠ·Π΅ΡΠ°
Π€Π°ΠΉΠ»:
BusEngine/Code/Plugin/Program.cs, ΡΡΡΠΎΠΊΠ° 151Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
messageΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΠΈΠ· Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ CefSharp-Π±ΡΠ°ΡΠ·Π΅ΡΠ° ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ»Π±ΡΠΊOnPostMessage. ΠΡΠ±Π°Ρ Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΠ°, Π·Π°Π³ΡΡΠΆΠ΅Π½Π½Π°Ρ Π² Π΄Π²ΠΈΠΆΠΎΠΊ, ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π° Ρ ΠΎΡΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΡΠΎΠ±Ρ JavaScript Π²Π½ΡΡΡΠΈ ΠΈΠ³ΡΡ ΠΎΡΠΏΡΠ°Π²ΠΈΠ»_linkgo|cmd.exe /c ...β ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ.Π‘ΡΠ΅ΠΏΠ΅Π½Ρ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ: ΠΏΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π°Π΄ ΠΌΠ°ΡΠΈΠ½ΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅: whitelist ΡΠ°Π·ΡΠ΅ΡΡΠ½Π½ΡΡ URL/ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ², ΠΠ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΡΡΡΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄ Π²
Process.Start.ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠ°Π±Π»ΠΎΠ½Π°Ρ :
Templates/cs/Launcher/Code/Plugin/Program.cs:132Templates/cs/CubesOpenGL/Code/CubesOpenGL/Program.cs:1913(Π±ΠΎΠ»Π΅Π΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΡProcessStartInfo, Π½ΠΎ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π±Π΅Π· Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ)2. WMI Injection
Π€Π°ΠΉΠ»:
BusEngine/Code/BusEngine/BusEngine.cs, ΡΡΡΠΎΠΊΠ° 2555ΠΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΡ Π½Π΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΡ ΠΏΡΡΠ΅ΠΉ Π² WMI-Π·Π°ΠΏΡΠΎΡ. ΠΡΠ»ΠΈ Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅Ρ
EngineDirectoryΠΈΠ»ΠΈEditorDirectoryβ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ WMI-Π·Π°ΠΏΡΠΎΡΠ°.3.
fixgithub.csβ 11,177 ΡΡΡΠΎΠΊ ASCII-Π°ΡΡΠ°, 0 ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°Π€Π°ΠΉΠ»:
BusEngine/Code/fixgithub.csβ 1.7 MB.Π€Π°ΠΉΠ» ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ 12+ ΠΊΠΎΠΏΠΈΠΉ ASCII-Π»ΠΎΠ³ΠΎΡΠΈΠΏΠ° Π² Π±Π»ΠΎΡΠ½ΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ ΠΈ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΊΠΎΠ΄Π°. ΠΠΈ ΠΊΠ»Π°ΡΡΠΎΠ², Π½ΠΈ Π½Π΅ΠΉΠΌΡΠΏΠ΅ΠΉΡΠΎΠ², Π½ΠΈ
using. ΠΡΠΎ ΠΌΡΡΡΠ²ΡΠΉ Π³ΡΡΠ·, ΠΊΠΎΡΠΎΡΡΠΉ:Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ: ΡΠ΄Π°Π»ΠΈΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ.
π΄ HIGH β ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ
4. God Object:
BusEngine.csβ 10,105 ΡΡΡΠΎΠΊ, 50+ ΠΊΠ»Π°ΡΡΠΎΠ² Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ΠΠ΄ΠΈΠ½ ΡΠ°ΠΉΠ» ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ: Engine, AI, Audio, Browser, Camera, Canvas, Color, Core, FlowGraph, Layer, Level, Localization, Log, Material, Matrix2-4x3, Model, Object, Physics, Plugin, Rendering, Shader, Ajax, Json, File, Timer, Canvas (UI), Vector2-4, Video, ProjectDefault, Device, Form, IPlugin...
ΠΡΠΎΠ±Π»Π΅ΠΌΡ:
internal class G(ΡΡΡΠΎΠΊΠ° 6759) β Π½Π΅Π²Π½ΡΡΠ½ΠΎΠ΅ ΠΈΠΌΡ5. ΠΠ°ΡΡΠΎΠ²ΠΎΠ΅ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°
Game/Game.csEditor/Editor.csΠ Π°Π·Π»ΠΈΡΠ°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ:
0968cb8e...vs28cb03ec...)Engine.Platform("Windows"vs"WindowsEditor")Π¨Π°Π±Π»ΠΎΠ½Ρ (
Launcher/Code/Plugin/Program.csΠΈPlugin/Program.cs) ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈOnPostMessage.ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅: Π²ΡΠ½Π΅ΡΡΠΈ ΠΎΠ±ΡΠΈΠΉ
Initialize+FormΠ² shared library.6. ΠΠ°ΡΠΈΡΡΠ΅ API-ΠΊΠ»ΡΡΠΈ
Π€Π°ΠΉΠ»:
Plugin/Program.cs, ΡΡΡΠΎΠΊΠΈ 119-121Π₯ΠΎΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΉΡΠ°Ρ Π·Π°Π³Π»ΡΡΠΊΠΈ, ΡΠ°ΠΌ ΠΏΠ°ΡΡΠ΅ΡΠ½ ΠΎΠΏΠ°ΡΠ΅Π½. API-ΠΊΠ»ΡΡΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Ρ ΡΠ°Π½ΠΈΡΡΡΡ Π² ΠΊΠΎΠ΄Π΅.
7. ΠΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ GC.Collect Π½Π° ΡΠ°ΠΉΠΌΠ΅ΡΠ΅
Π€Π°ΠΉΠ»:
BusEngine.cs, ΡΡΡΠΎΠΊΠΈ 3043-3045ΠΠ°ΠΆΠ΄ΡΠ΅ N ΡΠ΅ΠΊΡΠ½Π΄ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 5) Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΡΠ±ΠΎΡΠΊΠ° ΠΌΡΡΠΎΡΠ° β Π΄Π²Π°ΠΆΠ΄Ρ. ΠΡΠΎ ΡΠΈΠΌΠΏΡΠΎΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΌΡΡΡΡ, Π° Π½Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. ΠΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠΈΠ·Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π°.
π‘ MEDIUM β ΠΠ°ΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ΄Π°
8. Π§ΡΠ΅Π·ΠΌΠ΅ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
dynamicβ 35 Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉΠΡΠ΅ ΠΊΠΎΠ»Π±ΡΠΊΠΈ Ajax-ΠΊΠ»Π°ΡΡΠ° ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ
dynamic:Π’Π΅ΡΡΠ΅ΡΡΡ ΡΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ. ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΠΌΠ΅ΡΡΠΎ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ.
9. 512 ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ²
newβ GC pressureΠΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΠΉ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ°Π΄Ρ β Π²ΠΊΠ»ΡΡΠ°Ρ
Paint-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ. ΠΡΠΈ 60 FPS = ~30,000new/ΡΠ΅ΠΊ β ΡΠ΅ΡΡΡΠ·Π½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ° Π½Π° GC.10. ΠΡΠΎΠ±Π»Π΅ΠΌΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ
Commands,FPSCPU,FPSGPU,FPSKEYβ Π³ΠΎΠ½ΠΊΠΈ Π΄Π°Π½Π½ΡΡTask.Factory.StartNewΠ±Π΅Π·ConfigureAwaitβ deadlock-ΡΠΈΡΠΊ Π² UI-ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅typ(1/2/3), Π²ΡΠ±ΠΎΡ Π·Π°Ρ Π°ΡΠ΄ΠΊΠΎΠΆΠ΅Π½ (typ = 3)11. ΠΠ°ΡΡΡΠ΅Π½ΠΈΠ΅ IDisposable β 43 ΡΡΡΠ½ΡΡ
.Dispose()ΠΠΌΠ΅ΡΡΠΎ
usingβ ΡΡΡΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ.Dispose(). ΠΡΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠ΅ΡΡΡΡΡ ΡΡΠ΅ΠΊΠ°ΡΡ:12. Π‘ΡΡΠΎΠΊΠΎΠ²Π°Ρ ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΡ Π² ΡΠΈΠΊΠ»Π°Ρ β 176
+=ΠΠΎΡΠΎΠΆΠ΄Π°Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΡ ΡΡΡΠΎΠΊ. ΠΡΠΆΠ΅Π½
StringBuilder.13. ΠΡΠ»Π°Π΄ΠΎΡΠ½ΡΠΉ ΠΊΠΎΠ΄ Π² ΡΠ΅Π»ΠΈΠ·Π΅ β 124 Π²ΡΠ·ΠΎΠ²Π°
Console.*Console.WriteLine,Console.Beep()β Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΏΠΎΠ΄#if DEBUG.14.
Environment.Exit(0)Π² ShutdownΠΠ°ΡΠ°ΠΌΠ΅ΡΡ Ρ ΠΈΠ³ΡΠΈΠ²ΡΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ
nagibator.Environment.ExitΠ½Π΅ Π΄Π°ΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡΡ ΡΠΈΠ½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°ΠΌ ΠΈfinally-Π±Π»ΠΎΠΊΠ°ΠΌ.15. Unsafe P/Invoke Π±Π΅Π· ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ
ΠΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π±Π΅Π· ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ
Marshal.GetLastWin32Error(). ΠΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ΅ ΡΠ°ΠΉΠΌΠ΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅Π²Π΅ΡΠ½ΠΎ Π±Π΅Π· Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠΈ.π’ LOW β Π‘ΡΠΈΠ»Ρ ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
internal class Gnagibator,Π¨Π΅Π΄Π΅Π²Ρ.busprojectΠ² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°Ρπ Π‘Π²ΠΎΠ΄Π½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° ΠΌΠ΅ΡΡΠΈΠΊ
newΠ°Π»Π»ΠΎΠΊΠ°ΡΠΈΠΉdynamicΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΉtryΠ±Π΅Π·catchusingπ§ ΠΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½ΡΠΉ ΠΏΠ»Π°Π½ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΉ
ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ (Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ)
fixgithub.csβ 1.7MB ΠΌΡΡΠΎΡΠ°Process.StartΠΈΠ»ΠΈ ΠΏΠΎΠ»Π½ΡΠΉ Π·Π°ΠΏΡΠ΅Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈΠ· Π±ΡΠ°ΡΠ·Π΅ΡΠ°ΠΡΡΠΎΠΊΠΈΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ
GC.Collect()β Π½Π°ΠΉΡΠΈ ΡΡΠ΅ΡΠΊΠΈ ΡΠ΅ΡΠ΅Π· memory profilerEnvironment.Exit()β Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π½Π° Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΉ shutdownΠ‘ΡΠ΅Π΄Π½ΠΈΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ
dynamicΠ½Π° ΡΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ DTO Π² Ajax-ΠΊΠΎΠ»Π±ΡΠΊΠ°ΡBusEngine.csβ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΊΠ»Π°ΡΡΡ Π½Π° ΡΠ°ΠΉΠ».Dispose()Π½Π°usingConsole.*ΠΏΠΎΠ΄#if DEBUGConfigureAwait(false)Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΠΉ ΠΊΠΎΠ΄ΠΠΈΠ·ΠΊΠΈΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ
ΠΠ±ΡΠ°Ρ ΠΎΡΠ΅Π½ΠΊΠ°
ΠΡΠΎ ΡΠΎΠ»ΡΠ½ΡΠΉ indie-ΠΏΡΠΎΠ΅ΠΊΡ Ρ Π°ΠΌΠ±ΠΈΡΠΈΠΎΠ·Π½ΡΠΌ ΡΠ°Π·ΠΌΠ°Ρ ΠΎΠΌ β 3D-Π΄Π²ΠΈΠΆΠΎΠΊ, ΡΠ΅Π΄Π°ΠΊΡΠΎΡ, Π»Π°ΡΠ½ΡΠ΅Ρ, ΠΏΠ»Π°Π³ΠΈΠ½Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Android. ΠΠ²ΡΠΎΡ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ Π³Π»ΡΠ±ΠΎΠΊΠΎΠ΅ Π·Π½Π°Π½ΠΈΠ΅ C#, WinAPI, ΡΠ΅ΡΠ»Π΅ΠΊΡΠΈΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΎΠ΅ΠΊΡ ΡΡΡΠ°Π΄Π°Π΅Ρ ΠΎΡ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ solo-ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ: God Object, ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΡΠ΅ΡΡΠΎΠ², Π·Π°ΡΠΈΡΡΠ΅ ΡΠ΅ΠΊΡΠ΅ΡΡ, ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΠΉ ΠΊΠΎΠ΄ Π² ΡΠ΅Π»ΠΈΠ·Π΅.
ΠΡΠΎΠ΅ΠΊΡ ΠΠ Π³ΠΎΡΠΎΠ² ΠΊ production-ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±Π΅Π· ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ RCE-ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³Π°. ΠΠΎΡΠ»Π΅ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π» Π²ΡΡΠΎΠΊΠΈΠΉ β Π΄Π²ΠΈΠΆΠΎΠΊ ΡΠΆΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³, ΡΠΈΠ·ΠΈΠΊΡ, Π·Π²ΡΠΊ (LibVLC), Π²ΠΈΠ΄Π΅ΠΎ, UI (WinForms), Π±ΡΠ°ΡΠ·Π΅Ρ (CefSharp), ΡΠ΅ΡΡ (Ajax/HttpClient), ΠΏΠ»Π°Π³ΠΈΠ½Ρ.
Review Π²ΡΠΏΠΎΠ»Π½Π΅Π½ Π°Π³Π΅Π½ΡΠΎΠΌ Hermes Agent. 12.07.2026.