冷月孤心 发表于 2023-10-2 21:20:59

Int3断点设置与移除函数

学习in3断点之余,感觉封装为函数调用有点方便。小白手记,大神飘过

void SetInt3Breakpoint(HANDLE hProcess, DWORD SetInt3address)
{
        DWORD oldProtect;
        VirtualProtect((LPVOID)SetInt3address, sizeof(BYTE), PAGE_EXECUTE_READWRITE, &oldProtect);
        originalByte = *(BYTE*)SetInt3address;
        BOOL VirtualProtectResult = VirtualProtect((LPVOID)SetInt3address, sizeof(BYTE), PAGE_EXECUTE_READWRITE, &oldProtect);
        if (VirtualProtectResult)
        {
                MessageBox(NULL, TEXT("SetInt3_VirtualProtect操作成功"), TEXT("提示"), NULL);
        }
        else
        {
                MessageBox(NULL, TEXT("SetInt3_VirtualProtect操作失败"), TEXT("提示"), NULL);
                DWORD dwError = GetLastError();
                VirtualProtectEx(hProcess, (LPVOID)SetInt3address, sizeof(BYTE), PAGE_EXECUTE_READWRITE, &oldProtect);
                BOOL VirtualProtectExResult = VirtualProtectEx(hProcess, (LPVOID)SetInt3address, sizeof(BYTE), PAGE_EXECUTE_READWRITE, &oldProtect);
                if (VirtualProtectExResult)
                {
                        MessageBox(NULL, TEXT("SetInt3_VirtualProtectEx操作成功"), TEXT("提示"), NULL);
                }
                else
                {
                        MessageBox(NULL, TEXT("SetInt3_VirtualProtectEx操作失败"), TEXT("提示"), NULL);
                        DWORD dwError = GetLastError();
                }
        }
        //WriteProcessMemory(hProcess, (LPVOID)SetInt3address, &KeyInfo, 0x1, NULL);
        memcpy((LPVOID)SetInt3address, KeyInfo, sizeof(KeyInfo));
        //BOOL writeResult = WriteProcessMemory(hProcess, (LPVOID)SetInt3address, &KeyInfo, 0x1, NULL);
        //if (writeResult)
        //{
        //        MessageBox(NULL, TEXT("SetInt3_address Int3写入成功"), TEXT("提示"), NULL);

        //}
        //else
        //{
        //        MessageBox(NULL, TEXT("SetInt3_address Int3写入失败"), TEXT("提示"), NULL);
        //        DWORD dwError = GetLastError();

        //}

        VirtualProtect((LPVOID)SetInt3address, sizeof(BYTE), oldProtect, &oldProtect);
        wsprintf(szBuffer, TEXT("Int3设置完成 *(BYTE*)SetInt3address= %#I32x"), *(BYTE*)SetInt3address);
        OutputDebugString(szBuffer);
        if (*(BYTE*)SetInt3address == 0xCC)
        {
                MessageBox(NULL, TEXT("Int3设置成功"), TEXT("提示"), NULL);
        }
}

void RemoveInt3Breakpoint(HANDLE hProcess, DWORD RemoveInt3address)
{
        DWORD oldProtect;
        VirtualProtect((LPVOID)RemoveInt3address, sizeof(BYTE), PAGE_EXECUTE_READWRITE, &oldProtect);
        BOOL VirtualProtectResult = VirtualProtect((LPVOID)RemoveInt3address, sizeof(BYTE), PAGE_EXECUTE_READWRITE, &oldProtect);
        if (VirtualProtectResult)
        {
                MessageBox(NULL, TEXT("Remove_VirtualProtect操作成功"), TEXT("提示"), NULL);
        }
    else
    {
      MessageBox(NULL, TEXT("Remove_VirtualProtect操作失败"), TEXT("提示"), NULL);
      DWORD dwError = GetLastError();
   
                VirtualProtectEx(hProcess, (LPVOID)RemoveInt3address, sizeof(BYTE), PAGE_EXECUTE_READWRITE, &oldProtect);
                BOOL VirtualProtectExResult = VirtualProtectEx(hProcess, (LPVOID)RemoveInt3address, sizeof(BYTE), PAGE_EXECUTE_READWRITE, &oldProtect);
                if (VirtualProtectExResult)
                {
                        MessageBox(NULL, TEXT("Remove_VirtualProtectEx操作成功"), TEXT("提示"), NULL);
                }
                else
                {
                        MessageBox(NULL, TEXT("Remove_VirtualProtectEx操作失败"), TEXT("提示"), NULL);
                        DWORD dwError = GetLastError();
                }
    }
      memcpy((LPVOID)RemoveInt3address, &originalByte, sizeof(originalByte));
                //WriteProcessMemory(hProcess, (LPVOID)RemoveInt3address, &originalByte, sizeof(BYTE), NULL);
/*                BOOL writeResult = WriteProcessMemory(hProcess, (LPVOID)RemoveInt3address, &originalByte, sizeof(BYTE), NULL);
                if (writeResult)
                {
                        MessageBox(NULL, TEXT("SetInt3address Int3还原成功"), TEXT("提示"), NULL);

                }
                else
                {
                        MessageBox(NULL, TEXT("SetInt3address Int3还原失败"), TEXT("提示"), NULL);
                        DWORD dwError = GetLastError();

                }*/
                VirtualProtect((LPVOID)RemoveInt3address, sizeof(BYTE), oldProtect, &oldProtect);
        wsprintf(szBuffer, TEXT("Int3执行完成 *(BYTE*)RemoveInt3address= %#I32x"), *(BYTE*)RemoveInt3address);
        OutputDebugString(szBuffer);
}

不破不立 发表于 2023-10-2 21:23:50

谢谢分享学习心得

LCC 发表于 2023-10-2 21:27:42

谢谢分享学习心得

飞天梦 发表于 2023-10-3 05:39:27

谢谢分享,学习

回归原点 发表于 2023-10-3 08:12:36


谢谢分享学习心得

szwanglei 发表于 2023-10-3 08:39:02

谢谢分享{:biggrin:}

desaiapi999 发表于 2023-10-3 09:46:28

谢谢分享学习心得,我也学习下{:lol:}

风轻云淡 发表于 2023-10-3 10:35:54

不可能 根本不可能学会

乐活 发表于 2023-10-3 10:44:04

过来学习,多谢分享

rensan 发表于 2023-10-3 13:24:27


谢谢分享学习心得
页: [1] 2
查看完整版本: Int3断点设置与移除函数