首页
社区
课程
招聘
[求助]如何用代码下个cc断点
发表于: 2016-3-19 18:16 4062

[求助]如何用代码下个cc断点

2016-3-19 18:16
4062
76B9FD1C    90              nop
76B9FD1D    90              nop
76B9FD1E >  8BFF            mov     edi,edi
76B9FD20    55              push    ebp
76B9FD21    8BEC            mov     ebp,esp
76B9FD23    6A 00           push    0x0
76B9FD25    FF75 14         push    dword ptr [ebp+0x14]
76B9FD28    FF75 10         push    dword ptr [ebp+0x10]
76B9FD2B    FF75 0C         push    dword ptr [ebp+0xC]              ; 1.004030CB
76B9FD2E    FF75 08         push    dword ptr [ebp+0x8]
76B9FD31    E8 A0FFFFFF     call    76B9FCD6                         ; MessageBoxExA

76B9FD1B    90              nop
76B9FD1C    90              nop
76B9FD1D    90              nop
76B9FD1E >  8BFF            mov     edi,edi
76B9FD20    CC              int3     <===我这里手动改了  怎麽触发不了断点呢
76B9FD21    8BEC            mov     ebp,esp
76B9FD23    6A 00           push    0x0
76B9FD25    FF75 14         push    dword ptr [ebp+0x14]
76B9FD28    FF75 10         push    dword ptr [ebp+0x10]
76B9FD2B    FF75 0C         push    dword ptr [ebp+0xC]              ; 1.004030CB
76B9FD2E    FF75 08         push    dword ptr [ebp+0x8]
76B9FD31    E8 A0FFFFFF     call    76B9FCD6                         ; MessageBoxExA

c语言有办法通过代码对软件下中断嘛?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
程序没有运行到哪个位置吧?INT3代码不行的话,还可以下硬件中断嘛!直接通过API设置CPU调试寄存器,设置好调试向量之后就可以了
2016-3-19 18:56
0
雪    币: 35
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
有运行到,但是一运行就蹦了,什麽api可以调用调试寄存器呢
2016-3-19 19:03
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
SetThreadContext可以设置的,我已经编写好调用这个api来设置调试寄存器的库了
2016-3-19 20:09
0
雪    币: 35
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
求代码^^
2016-3-19 22:46
0
雪    币: 39
活跃值: (2871)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
od->选项->调试设置->异常->忽略以下异常->去掉int 3前面的勾

2016-3-19 22:58
0
雪    币: 35
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不是 我是要用代碼下中断
2016-3-19 23:18
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
8
这是打包好的代码!DEMO制作一个给你!因为我测试好代码之后就删除了DEMO,为了省点空间,就删除了它,只留下了源代码和编译好的程序!

编译使用方法,需要用目录底下的Winternl.h替换掉VC的这个文件
上传的附件:
2016-3-19 23:21
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
9
这个是程序的DEMO

// DEMO.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>
#include "../../BPHookFunction/BPHookFunction/BPHookFunction.h"
#if _DEBUG
#if _WIN64
#define Debug DebugBreak();
#else
#define Debug _asm int 3
#endif
#else
#define Debug
#endif
#define DEBUG Debug
#define debug Debug
void Test1();
void Test2();
DWORD CALLBACK ThreadCreateCallBack(DWORD Tid,BOOL bCreate,LPTHREAD_START_ROUTINE lpStartAddress,PVOID ThreadData);
LONG WINAPI TopUnhandledExceptionFilter(
         struct _EXCEPTION_POINTERS *ExceptionInfo
)
{//如果HOOK设置正确,那么当运行到HOOK的函数时会回调这个函数
        //Debug; //这个是调试宏,在代码中添加这个会导致运行时会被调试器捕获,用于在设置调试寄存器之后绕过VC对调试寄存器的回调的捕获,方便调试
        //这个宏只是在DEBUG版本的程序中会起作用,如果不是DEBUG版本的程序,这个宏会被设置为空
#if _WIN64
        //::DebugBreak();
        //这里是64位程序回调的处理
        if(ExceptionInfo->ContextRecord->Rip==(DWORD64)Test1)//检查一下是否是需要HOOK的函数,如果不是就放过以便让回调继续传递下去
        {
                ExceptionInfo->ContextRecord->Rip=(DWORD64)Test2;//替换Rip寄存器,以便进行HOOK
        }else
        {
                return EXCEPTION_CONTINUE_SEARCH;//告诉系统,这个不是我需要处理的回调,请系统寻找别的回调
        }
       
#else
        //这里是32位程序回调的处理
        if(ExceptionInfo->ContextRecord->Eip==(DWORD)Test1)//检查一下是否是需要HOOK的函数,如果不是就放过以便让回调继续传递下去
        {
        ExceptionInfo->ContextRecord->Eip=(DWORD)Test2;//替换Eip寄存器,以便进行HOOK
        }
        else
        {
                return EXCEPTION_CONTINUE_SEARCH;//告诉系统,这个不是我需要处理的回调,请系统寻找别的回调
        }
#endif
         return EXCEPTION_CONTINUE_EXECUTION;//告诉系统,我已经处理好了,请不要回调别的处理程序
}
void Test1()
{
        ::MessageBox(0,_T("愿函数"),_T("愿函数"),0);
}
void Test2()
{
        ::MessageBox(0,_T("Hook"),_T("Hook"),0);
}
int _tmain(int argc, _TCHAR* argv[])
{
        DWORD Tid = ::GetCurrentThreadId();//取得本进程线程的ID
        Test1();//没有进行HOOK之前的函数
        InitHook();//初始化调试寄存器的HOOK,不调用这初始化函数的话,设置调试寄存器会失败的哦!
        SetThreadCreateCallBack(ThreadCreateCallBack);//设置线程创建回调,以便在线程创建时设置那个线程的调试寄存器
        SetHardWareBP(Tid,(DWORD)Test1,TopUnhandledExceptionFilter,0,0,1,1);//设置调试寄存器,进行调试寄存器的HOOK
        //第一个参数是需要设置寄存器的线程,第二个参数是HOOK的地址,第三个参数是异常回调,也就是当HOOK的函数调用时会回调的程序,HOOK的这个函数的寄存器和地址会保存在这个回调中
        /*
        第四个参数是使用的调试寄存器的序号,总共有4个寄存器可以使用,序号范围是0到3,第四个参数是HOOK的类型,保持默认就好,第五个参数是HOOK地址的大小,保持默认就好
        第六个参数是决定是否进行HOOK,如果这个参数是TRUE,就进行HOOK,如果这个参数是FALSE,就进行卸载HOOK的操作

        */
        Test1();//HOOK之后的函数,提示不能使用VC进行调试,因为VC会对调试器进行拦截,导致程序无法正确收到回调
        SetHardWareBP(Tid,(DWORD)Test1,TopUnhandledExceptionFilter,0,0,1,FALSE);
        Test1();//HOOK卸载之后的函数
        UnInitHook();
        return 0;
}
DWORD CALLBACK ThreadCreateCallBack(DWORD Tid,BOOL bCreate,LPTHREAD_START_ROUTINE lpStartAddress,PVOID ThreadData)
{
        if(bCreate)//在线程创建回调中,检查一下是否是线程创建
        {
                //如果确认是线程创建就进行调试寄存器HOOK,并且调用lpStartAddress指向的函数,这个函数的参数在ThreadData变量中,这个函数必须是在线程创建时调用,否则线程是不会创建成功的
                SetHardWareBP(Tid,(DWORD)Test1,TopUnhandledExceptionFilter,0,0,1,1);
        return lpStartAddress(ThreadData);//这个函数必须是在线程创建时调用,否则线程是不会创建成功的
        }
        return 0;//如果不是线程创建,那就简单了,直接返回0即可
}
2016-3-20 00:12
0
游客
登录 | 注册 方可回帖
返回
//