簡體   English   中英

無法在進程 dll 模塊的入口點寫入 1 個字節

[英]Cant write 1 byte at the entry point of a process dll module

你好所以我的問題有點奇怪..我試圖用這個寫內存:

WriteProcessMemory(intptr pHandle, intptr lpBaseAddr, byte[] lpBuffer, uint nSize, int lpNbrOfBytesWritten);

有一個進程叫做:proc.exe 這個進程有很多模塊。

bim 感興趣的模塊稱為 mod.dll。

所以我在這里嘗試做的是:寫入具有操作碼的入口點的第一個字節: dec ebp等於 D4 ithink 為 1 個字節。

所以首先我得到了 process[0].modules 列表...在 tbat 列表中找到我的 mod.dll .. 得到它的 baseAddress 然后就是它。

因為那個地址是入口點 addr 對嗎?

所以我做了一個字節數組,它基本上只包含 1 個字節: 0xC3這是一個ret 所以應該沒問題。 但遺憾的是它以某種方式返回 false ......當我通過olleDbg手動執行它時,它工作正常。

然后我想我可能在編碼時犯了一個錯誤......所以我嘗試在另一個模塊上寫入內存..這次的不同地址不在入口點..有點像 testmod.dll+4E..

他的時間有 5 個字節..所以是的,我將第一個字節作為 C3 並作為 NOP 或 90 年代休息......並且它工作正常。

代碼 :

 try
        {
            if ((p = mem.OpenProcess(MY_ACCESS.PROCESS_ALL_ACCESS, false, mem.GetProcess("proc")[0].Id)) != IntPtr.Zero)
            {
                //Mod base address
                int z       = (int)get_Mod_BaseAddr("proc", "mod.dll");
                string s    = Convert.ToString(z, 16);
                int zz      = Convert.ToInt32(s, 16);
                WINTR_Z     += zz; // wintr_z had 0x0 before

                //WINTR_C
                WINTR       += WINTR_Z; // WINTR had 0xFA... before

                //STTER
                z           = (int)get_Mod_BaseAddr("proc", "mod1.dll");
                s           = Convert.ToString(z, 16);
                zz          = Convert.ToInt32(s, 16);
                STTER       += zz; // WINTR had 0xsome_hex... before


                byte[] _BYP_WINTR_Z = { 0xC3 }; // (does not work)the ret to override dec ebp
                byte[] _BYP_WINTR   = { 0xC3, 0x90, 0x90, 0x90, 0x90 }; // same module (mod.dll) but diffrent address writing 5 bytes here works fine
                byte[] _BYP_STTER   = { 0xC3, 0x90, 0x90, 0x90, 0x90 }; // diffrent module (mod1)  writing 5 bytes also works fine .



                if (!mem.WriteProcessMemory(p, (IntPtr)WINTR_Z, _BYP_WINTR_Z, (uint)_BYP_WINTR_Z.Length, 0)) return false; // does not Work(false)
                if (!mem.WriteProcessMemory(p, (IntPtr)WINTR, _BYP_WINTR, (uint)_BYP_WINTR.Length, 0)) return false; // works(true)
                if (!mem.WriteProcessMemory(p, (IntPtr)STTER, _BYP_STTER, (uint)_BYP_STTER.Length, 0)) return false; // works(true)

                return true;
            }

        }

有什么幫助嗎?

嘗試在WriteProcessMemory之前使用VirtualProtectEx來更改對指定進程虛擬地址空間中已提交頁面區域的保護。 喜歡,

VirtualProtectEx(p, (IntPtr)WINTR_Z, dwSize, PAGE_EXECUTE_WRITECOPY, ref OldProtect)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM