| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4923 人关注过本帖
标题:求助:服务器异常报错,如何终止报错进程
只看楼主 加入收藏
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1091
专家分:2682
注 册:2015-12-30
收藏
得分:0 
回复 39楼 吹水佬
明白了,谢谢
2022-01-29 13:44
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用foxfans在2022-1-29 11:40:19的发言:

可以手动让eip+1即可跳过,一直忽略也不是办法,所以可以直接计算当前eip的内码长度,eip+这个长度,就直接跳过整块代码段,不用一直忽略.

指令长度,静态分析就可以看反编。动态分析就有点麻烦,指令长度与指令、操作数、寻址方式等有关,同一条指令但操作数用不同的寻址方式,其指令长度就会不一样,这样就要尽可能多地获取EIP的指令字节数来推算。

现在的问题是异常处理,已经抛出异常了,将EIP指向下一条指令也有可能继续抛出异常。既然是选择手动“忽略”,就让他忽略下去好了。
如果选择自动忽略,应该就可以解决LZ要关闭那个弹出窗口的问题。

2022-01-29 19:15
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏(1)
得分:0 
有个Debugger的代码可以参考一下
代码链接  http://pan.baidu.com/s/1qXYKjxU
其中\Debugger2\Debugger1\DeAsmEngine.cpp有个获取指令长度函数 GetCoodeLen
程序代码:
//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
// 函数名: GetCoodeLen
///功  能: 获取指令长度
// 形  参: HANDLE g_hCurrentProcess
// 形  参: const LPVOID lpAddress
//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
int GetCoodeLen(const SIZE_T lpAddress)
{
    // 1. 将调试程序的内存(OPCode)复制到本地
    SIZE_T  dwRetSize = 0;
    LPVOID lpRemote_Buf = new BYTE[32];
    ZeroMemory(lpRemote_Buf,32);
    ReadProcessMemory(g_hProcess,(LPVOID)lpAddress,lpRemote_Buf,32,&dwRetSize);

    // 2. 初始化反汇编引擎
    DISASM objDiasm;
    objDiasm.EIP = (UIntPtr)lpRemote_Buf; // 起始地址
    objDiasm.VirtualAddr = (UINT64)lpAddress;     // 虚拟内存地址(反汇编引擎用于计算地址)
    objDiasm.Archi = 0;                     // AI-X86
    objDiasm.Options = 0x000;                 // MASM

    // 3. 反汇编代码
    int nLen = Disasm(&objDiasm);
    delete[] lpRemote_Buf;
    return nLen;
}

2022-01-29 22:12
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
看了一下获取指令长度的算法,参考人家的代码再改改,不断完善吧
图片附件: 游客没有浏览图片的权限,请 登录注册

except.rar (14.85 KB)

程序代码:
#define MY_ERROR  0x401    && 自定义消息
DECLARE long AddException IN except long,long,long
DECLARE long RemoveException IN except
DECLARE long GetException IN except long
DECLARE long strlen IN msvcrt long
AddException(_screen.hWnd, MY_ERROR, 1)  && 0->全部忽略,1->提示选择
oErr = CREATEOBJECT("CError")
BINDEVENT(_screen.hWnd, MY_ERROR, oErr, "onError")
SYS(1079,1)
? 1234
SYS(2600,0,1," ")
? 5678
RemoveException()
CLEAR ALL
RETURN

DEFINE CLASS CError as Session
    PROCEDURE onError(hWnd,Msg,wParam,lParam)  && wParam指向EXCEPTION_RECORD结构的指针
        nCode = CTOBIN(SYS(2600,wParam,4),"4RS")
        pMsg = GetException(nCode)
        ? TRANSFORM(nCode,"@0"), SYS(2600,pMsg,strlen(pMsg))
        **QUIT
    ENDPROC
ENDDEFINE


[此贴子已经被作者于2022-1-31 14:16编辑过]

2022-01-31 12:09
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1732
专家分:3329
注 册:2012-2-29
收藏
得分:0 
回复 44楼 吹水佬
谢谢,新年快乐!
2022-01-31 19:45
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏(1)
得分:0 
疫情反复无常,1月8号、2月2号买了车票上北京都被劝回不给进京,只好呆在家练练手。
图片附件: 游客没有浏览图片的权限,请 登录注册

ErrDbg.rar (52.64 KB)

程序代码:
cDefPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefPath)
#define MY_ERROR  0x401    && 自定义消息
DECLARE long AddException IN errdbg long,string@,long,long
DECLARE long RemoveException IN errdbg 
DECLARE long GetException IN errdbg long
DECLARE long strlen IN msvcrt long
** AddException(nType, cOutFile, hWnd, uMsg) 注册异常处理
** 参数:
**   nType ..... 0->全部忽略跳过,1->提示选择中止、重试、忽略
**   cOutFile .. 输出异常信息的文件名,为空不输出
**   hWnd ...... 接收异常信息的窗口句柄,为 0 不接收
**   uMsg ...... 发送异常信息的用户自定义消息,为 0 不发送
AddException(1, cDefPath+"errinfo.txt", _screen.hWnd, MY_ERROR)
oErr = CREATEOBJECT("CError")
BINDEVENT(_screen.hWnd, MY_ERROR, oErr, "onError")
SYS(1079,1)
? 1111
fun1()
RemoveException()  && 注销异常处理
CLEAR ALL
RETURN

FUNCTION fun1()
    SYS(1079,1)
    ? 2222
    fun2() 
ENDFUNC

FUNCTION fun2()
    SYS(2600,0,1," ")
    ? 3333  
ENDFUNC

DEFINE CLASS CError as Session
    PROCEDURE onError(hWnd,Msg,wParam,lParam)  && wParam指向EXCEPTION_RECORD结构的指针
        nCode = CTOBIN(SYS(2600,wParam,4),"4RS")
        pMsg = GetException(nCode)
        ? TRANSFORM(nCode,"@0"), SYS(2600,pMsg,strlen(pMsg))
        FOR i=1 TO PROGRAM(-1)-1
            ? SPACE(i),PROGRAM(i)
        ENDFOR 
        **QUIT
    ENDPROC
ENDDEFINE


[此贴子已经被作者于2022-2-3 19:44编辑过]

2022-02-03 11:53
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1091
专家分:2682
注 册:2015-12-30
收藏
得分:0 
2022-02-03 19:45
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1732
专家分:3329
注 册:2012-2-29
收藏
得分:0 
谢谢!
2022-02-04 06:52
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:273
专家分:604
注 册:2014-6-12
收藏
得分:0 
十分感谢!
2022-02-10 14:56
快速回复:求助:服务器异常报错,如何终止报错进程
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044422 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved