Vysvětlení kodu – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Vysvětlení kodu – .NET – Fórum – Programujte.comVysvětlení kodu – .NET – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Mutagen0
Super člen
29. 1. 2013   #1
-
0
-

Zdravím, dostal se mi do ruky kod na "upravení hry" neboli zvětšuje v ní hrací okno a chci se zeptat jestli by mě někdo vysvětlil co to přesně dělá, že to pak opravdu funguje?

public class GameWindowSize
    {
        private const int width = 1024;
        private const int height = 720;

        public GameWindowSize()//TODO: asi neni moc rychly, pustit v jinym threadu? dost mozna by se to mohlo ukladat
        {
            try
            {
                int offset;
                if (FindPattern(sizePatternOld, out offset))
                {
                    int sizeOffset = Patch((IntPtr)offset, true);

                    Marshal.WriteInt32((IntPtr)sizeOffset, 0, width);
                    Marshal.WriteInt32((IntPtr)sizeOffset, 4, height);
                    Debug.WriteLine("Actual GameWindowSize patched.", "GameWindowSize");

                    if (!FindPattern(thingiePattern, out offset))
                        throw new Exception("Old thingie pattern not found!");
                    Marshal.WriteInt32(Marshal.ReadIntPtr((IntPtr)offset, 25), width);
                    Marshal.WriteInt32(Marshal.ReadIntPtr((IntPtr)offset, 35), height);
                    Debug.WriteLine("Old thingie patched.", "GameWindowSize");
                }
                else if (FindPattern(sizePatternNew, out offset))
                    Patch((IntPtr)offset, false);
                else
                    throw new Exception("SetGameWindowSize pattern not found!");
            }
            catch (Exception ex) { ExceptionDialog.Show(ex, "GameWindowSize exception."); }
        }

        private int Patch(IntPtr offset, bool old)
        {
            Debug.WriteLine("SetGameWindowSize " + (old ? "old" : "new") + " pattern found.", "GameWindowSize");

            uint oldProtect;
            if (!VirtualProtect(offset, 22, 0x40, out oldProtect))
                throw new Win32Exception();

            int sizeOffset = Marshal.ReadInt32(offset, old ? 0x16 : 0x18);

            Marshal.WriteByte(offset, 0, 0xC7);
            Marshal.WriteByte(offset, 1, 0x05);
            Marshal.WriteInt32(offset, 2, sizeOffset);
            Marshal.WriteInt32(offset, 6, width);

            Marshal.WriteByte(offset, 10, 0xC7);
            Marshal.WriteByte(offset, 11, 0x05);
            Marshal.WriteInt32(offset, 12, sizeOffset + 4);
            Marshal.WriteInt32(offset, 16, height);

            Marshal.WriteByte(offset, 20, (byte)(old ? 0xC3 : 0xEB));//old ? retn : jmp short -27
            Marshal.WriteByte(offset, 21, unchecked((byte)-27));

            Debug.WriteLine("SetGameWindowSize patched.", "GameWindowSize");
            return sizeOffset;
        }

        [DllImport("kernel32.dll")]
        private static extern bool VirtualProtect(IntPtr lpAddress, uint dwSize, uint flNewProtect, out uint lpflOldProtect);

        private bool FindPattern(byte[] pattern, out int offset)
        {
            ProcessModule module = Process.GetCurrentProcess().MainModule;
            for (offset = module.BaseAddress.ToInt32(); offset < module.BaseAddress.ToInt32() + module.ModuleMemorySize - pattern.Length; offset++)
                for (int x = 0; x < pattern.Length; x++)
                {
                    if (pattern[x] != 0xFF && Marshal.ReadByte((IntPtr)offset, x) != pattern[x])
                        break;
                    if (x == pattern.Length - 1)
                        return true;
                }
            return false;
        }

        private readonly byte[] sizePatternOld = new byte[]
                                        {
                                            0x3D, 0x20, 0x03, 0x00, 0x00,   //cmp   eax, 320h
                                            0x75, 0x1D,                     //jnz   0x1D
                                            0x8B, 0x4C, 0x24, 0x08,         //mov   ecx, [esp+arg_4]
                                            0xB8, 0x58, 0x02, 0x00, 0x00,   //mov   eax, 258h
                                            0x3B, 0xC8,                     //cmp   ecx, eax
                                            0x75, 0x10                      //jnz   0x10
                                        };

        private readonly byte[] sizePatternNew = new byte[]
                                        {
                                            0x3D, 0x20, 0x03, 0x00, 0x00,   //cmp   eax, 320h
                                            0x75, 0xE8,                     //jnz   0xE8
                                            0x56,                           //push  esi
                                            0x8B, 0x74, 0x24, 0x0C,         //mov   esi, [esp+4+arg_4]
                                            0xB8, 0x58, 0x02, 0x00, 0x00,   //mov   eax, 258h
                                            0x3B, 0xF0,                     //cmp   esi, eax
                                            0x5E,                           //pop   esi
                                            0x75, 0xD9                      //jnz   0xD9
                                        };

        private readonly byte[] thingiePattern = new byte[]
                                                 {
                                                     0xA0, 0xFF, 0xFF, 0xFF, 0x00, 
                                                     0x83, 0xEC, 0x08,
                                                     0xA8, 0x01,
                                                     0x75, 0x1B,
                                                     0x0C, 0x01,
                                                     0xA2, 0xFF, 0xFF, 0xFF, 0x00,
                                                     0xE8, 0xFF, 0xFF, 0xFF, 0x00
                                                 };
    }

Kdyžtak pro představu to vypadá takhle,

Jak jistě vidíte ten "čtverec" tak takhle to bylo velky něž jsem aplikoval kod, a chci vědět co přesně dělá abych popřípadě mohl ten "čtverec" odstranit protože tam docela vadí. (nebo zvětšit s tím hracím polem) Děkuji

Nahlásit jako SPAM
IP: 89.190.90.–
Reklama
Reklama
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 152 hostů

Podobná vlákna

Vysvětlení kódu v C# — založil balaam

Vysvětlení kódu — založil ingiraxo

Seznam - vysvětlení — založil Pepa

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý