ExceptionInfo

本文介绍了一个用于获取异常信息的方法,该方法通过遍历异常堆栈跟踪来收集详细信息,并将其整理为字符串形式以便进一步处理或记录。此方法适用于Java应用程序中异常的诊断与报告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * 
 *
 * Date: Sep 6, 2013 3:25:10 PM
 * 
 */


package com.scb.razor.integration.mail;


/**
 * TODO: Briefly explain what this class does
 * 
 * @author 1466811
 * 
 */


public class ExceptionInfo
{
    public static String getExceptionInfo(Exception e)
    {
        assert (e != null);


        StringBuffer msg = new StringBuffer("");
        
        msg.append(e.toString() + "\n");


        int length = e.getStackTrace().length;        


        if (length > 0)
        {
            for (int i = 0; i < length; i++)
            {
                msg.append("\t" + e.getStackTrace()[i] + "\n");
            }
        }
        
        return msg.toString();
    }
    
    public static void main(String[] args)
    {
        System.out.println("It works!");
    }
}
第一个消息框的文本还是AAA#include <windows.h> #include <iostream> // 全局变量 DWORD g_BreakpointAddr = 0; // Hook目标地址 PVOID g_VehHandler = nullptr; // VEH句柄 // VEH异常处理函数 LONG WINAPI MyExceptionHandler(PEXCEPTION_POINTERS ExceptionInfo) { if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP) { if ((DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress == g_BreakpointAddr) { std::cout << ">>> MessageBoxA Hooked! <<<\n"; // 获取参数 const char* text = (const char*)ExceptionInfo->ContextRecord->Rcx; const char* caption = (const char*)ExceptionInfo->ContextRecord->Rdx; std::cout << "Text: " << (text ? text : "NULL") << "\n"; std::cout << "Caption: " << (caption ? caption : "NULL") << "\n"; // 修改参数(演示如何篡改) if (text && strcmp(text, "aaa") == 0) { ExceptionInfo->ContextRecord->Rcx = (DWORD)"HACKED!"; } // 跳过原始调用(设置返回值) ExceptionInfo->ContextRecord->Rax = IDOK; // 继续执行(跳过2字节的call指令) ExceptionInfo->ContextRecord->Rip += 2; return EXCEPTION_CONTINUE_EXECUTION; } } return EXCEPTION_CONTINUE_SEARCH; } int main() { // 1. 获取MessageBoxA地址 HMODULE hUser32 = LoadLibraryA("user32.dll"); if (!hUser32) { std::cerr << "Failed to load user32.dll\n"; return 1; } g_BreakpointAddr = (DWORD)GetProcAddress(hUser32, "MessageBoxA"); if (!g_BreakpointAddr) { std::cerr << "Failed to find MessageBoxA\n"; return 1; } std::cout << "MessageBoxA address: 0x" << std::hex << g_BreakpointAddr << "\n"; // 2. 设置硬件断点 CONTEXT ctx = { 0 }; ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS; ctx.Dr0 = g_BreakpointAddr; // 断点地址 ctx.Dr7 = 0x00000001; // DR0启用执行断点 if (!SetThreadContext(GetCurrentThread(), &ctx)) { std::cerr << "SetThreadContext failed: " << GetLastError() << "\n"; return 1; } // 3. 注册VEH异常处理 g_VehHandler = AddVectoredExceptionHandler(1, MyExceptionHandler); if (!g_VehHandler) { std::cerr << "AddVectoredExceptionHandler failed\n"; return 1; } std::cout << "VEH handler registered. Testing hook...\n\n"; // 4. 测试Hook MessageBoxA(NULL, "aaa", "Original Caption", MB_OK); MessageBoxA(NULL, "bbb", "Another Test", MB_OK); // 5. 清理 RemoveVectoredExceptionHandler(g_VehHandler); std::cout << "\nHook unregistered. Program exiting.\n"; return 0; }
07-25
#include <windows.h> #include <iostream> #include <cstring> DWORD_PTR g_BreakpointAddr = 0; PVOID g_VehHandler = nullptr; bool g_needReenable = false; // 全局标志,用于单步异常处理 LONG WINAPI MyExceptionHandler(PEXCEPTION_POINTERS ExceptionInfo) { if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP) { if ((DWORD_PTR)ExceptionInfo->ExceptionRecord->ExceptionAddress == g_BreakpointAddr) { // 硬件断点触发 std::cout << ">>> MessageBoxA Hooked! <<<\n"; // 获取参数 const char* text = (const char*)ExceptionInfo->ContextRecord->Rdx; const char* caption = (const char*)ExceptionInfo->ContextRecord->R8; std::cout << "Text: " << (text ? text : "NULL") << "\n"; std::cout << "Caption: " << (caption ? caption : "NULL") << "\n"; // 修改参数 if (text && strcmp(text, "bbb") == 0) { ExceptionInfo->ContextRecord->Rdx = (DWORD_PTR)"HACKED!"; } // 禁用硬件断点(防止递归) ExceptionInfo->ContextRecord->Dr7 &= ~0x00000001; // 设置单步执行 ExceptionInfo->ContextRecord->EFlags |= 0x100; // 设置标志,表示需要在单步异常中重新启用硬件断点 g_needReenable = true; return EXCEPTION_CONTINUE_EXECUTION; } else if (g_needReenable) { // 单步异常触发(在MessageBoxA的第一条指令之后) // 重新启用硬件断点 ExceptionInfo->ContextRecord->Dr7 |= 0x00000001 | 0x00000400; // 清除单步标志 ExceptionInfo->ContextRecord->EFlags &= ~0x100; // 重置标志 g_needReenable = false; return EXCEPTION_CONTINUE_EXECUTION; } } return EXCEPTION_CONTINUE_SEARCH; } int main() { HMODULE hUser32 = LoadLibraryA("user32.dll"); if (!hUser32) { std::cerr << "Failed to load user32.dll\n"; return 1; } g_BreakpointAddr = (DWORD_PTR)GetProcAddress(hUser32, "MessageBoxA"); if (!g_BreakpointAddr) { std::cerr << "Failed to find MessageBoxA\n"; return 1; } std::cout << "MessageBoxA address: 0x" << std::hex << g_BreakpointAddr << "\n"; CONTEXT ctx = { 0 }; ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS; ctx.Dr0 = g_BreakpointAddr; ctx.Dr7 = 0x00000001 | 0x00000400; // 启用DR0 if (!SetThreadContext(GetCurrentThread(), &ctx)) { std::cerr << "SetThreadContext failed: " << GetLastError() << "\n"; return 1; } g_VehHandler = AddVectoredExceptionHandler(1, MyExceptionHandler); if (!g_VehHandler) { std::cerr << "AddVectoredExceptionHandler failed\n"; return 1; } std::cout << "VEH handler registered. Testing hook...\n\n"; // 测试 MessageBoxA(NULL, "aaa", "Original Caption", MB_OK); MessageBoxA(NULL, "bbb", "Another Test", MB_OK); RemoveVectoredExceptionHandler(g_VehHandler); std::cout << "\nHook unregistered. Program exiting.\n"; return 0; } 分析代码
最新发布
07-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值