首页
社区
课程
招聘
几个星期前写的容错处理库,希望能互相启发
发表于: 2006-8-14 20:49 9142

几个星期前写的容错处理库,希望能互相启发

2006-8-14 20:49
9142

容错库范例

几个星期前写了一个容促处理的动态链接库(其实可以编译成静态的)
平时写程序(特别是用汇编),遇到调用系统API。总会有不成功的时候。
每次不成功,都要在后面加上一段处理的代码,十分麻烦。
于是冒出了开发容错库的想法。

随手写了一个功能比较简单的:
        1、遇到错误显示出错地址,错误号,错误号表示的错误,以及开发(调试)者的提示.
        2、调用开发者定义的容错函数(如果开发者给出)
        3、询问用户继续运行还是终止该进程。

================================================================================================
自从本菜鸟开发了这款动态连接库后,写任何windows的“技术”程序都离不开这个库。花了时间维护这个库确实是值得的。
编译的时候没有合并sections,使得体积稍稍大了点。由兴趣可以重新编译一下代码,将区段合并,体积估计可以达到2K左右。砍掉DOS头部(我曾经写过个软件砍DOS头的)则更小了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
调用细节:
动态库输出仅1个函数:
__stdcall WCheckError(LPTSTR,DWORD);
        函数的第一个参数是作者对于错误的说明、解释(将显示在容错对话框中)
        第二个参数是个 long __cdecl* 类型的回调函数指针。函数指针的唯一参数代表错误码(GetLastError返回码)。由于是__cdecl,也可以当作不带参数使用。该函数的返回值若为0,则不显示容错对话框;非0则显示容错窗口。
如果还不明白可以看看附带的代码例子
=======================

不知道是否有前辈写过这种库,互相交流一下经验。
源码下载:


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (12)
雪    币: 194
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
pop lptxt        ;lptxt做临时变量用一用,因为编译器暗中把ebp进栈了 :)
        POP jmpaddr
        ;pop eax
        ;mov jmpaddr,eax
        push jmpaddr
        push lptxt
        push eax
        push esi
        push edi
        push ebx
        push ecx
        push edx

                push 0B0C7B1B5h
                pop DWORD PTR szInjectedFileName
                push 0CCB3F8BDh
                pop DWORD PTR szInjectedFileName+4
                push 02020203Ah
                pop DWORD PTR szInjectedFileName+8

上面的两部分代码是什么作用啊, 看不懂哦.
2006-8-15 09:07
0
雪    币: 249
活跃值: (10)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
3
函数的开头有个 push ebp,mov ebp,esp
我要取的调用这个函数的地址(在堆栈顶层)被ebp又盖了一层。
所以先把ebp释放出来,于是被调用的地址就在栈顶了。
然后就是把那个地址给读取出来,为了简便,我用出栈、进栈的方式,获得堆栈顶层的数据
  push eax
  push esi
  push edi
  push ebx
  push ecx
  push edx
这几行是因为我忘记i386中保存所有寄存器的那条指令叫做什么了。所以只好手动多写几行(别笑话我)

-----------------------
    push 0B0C7B1B5h
    pop DWORD PTR szInjectedFileName
    push 0CCB3F8BDh
    pop DWORD PTR szInjectedFileName+4
    push 02020203Ah
    pop DWORD PTR szInjectedFileName+8

push进去的那几组数据是字符串:"当前进程:  "
我以前都是在DOS下才用汇编的。386以后可以直接用mov指令了.我的习惯还停留在8086阶段  其实用MOV代替更好。

push后的那些参数是按照DWORD把所有字节“高高低低”法则颠倒后的结果。(把一个汉字的编码倒回来)所以认不出本来面目了。
2006-8-15 10:55
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
4
看了下你附件的东西,整理的比较规范,感谢你与大家分享你的经验

提个建议:发表文章的时候,最好能有软件的演示效果,这样会让人感觉一目了然,针对你这篇文章,你可以给出几个提示框的效果,个人感觉这是个好习惯

错误提示一般是通过调用FormatMessage实现的,你的代码里也有这个函数

我一般都是直接嵌入下面代码的:
void GetErrorMessage ( DWORD dwErrorCode, char pMessage[] )
{
	HLOCAL hLocal = NULL ;
	FormatMessage ( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
		NULL,
		dwErrorCode,
		MAKELANGID ( LANG_ENGLISH, SUBLANG_ENGLISH_US),
		(PTSTR)&hLocal, 
		0,
		NULL 
		) ;
	
	if ( hLocal != NULL )
	{
		strcpy ( pMessage, (char*)hLocal ) ;
		LocalFree ( hLocal ) ;
	}
}

如果是在MFC中的话,直接改成成员函数即可
2006-8-15 11:37
0
雪    币: 249
活跃值: (10)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
5
最初由 北极星2003 发布

提个建议:发表文章的时候,最好能有软件的演示效果,这样会让人感觉一目了然,针对你这篇文章,你可以给出几个提示框的效果,个人感觉这是个好习惯

........


怪不得……吸取经验了
2006-8-15 11:59
0
雪    币: 179
活跃值: (131)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
6
先下来看看,最近wiaa好活跃啊
2006-8-15 17:00
0
雪    币: 249
活跃值: (10)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
7
前段时间写了一大堆程序,
只不过现在把他们同时帖出来了
2006-8-15 18:44
0
雪    币: 231
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习中,谢谢
2006-8-16 07:43
0
雪    币: 1731
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
呵呵!下来研究下!
2010-4-25 11:15
0
雪    币: 59
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
谢谢分享 下个学习下
2010-7-3 09:03
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
这个一定要学习一下 hoho
2010-7-30 08:52
0
雪    币: 15
活跃值: (135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
mark
2015-6-30 10:14
0
雪    币: 2775
活跃值: (1112)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
写个宏 或者 全局函数 或者直接用下断言 来检测参数都很方便的说~
2015-6-30 11:26
0
游客
登录 | 注册 方可回帖
返回
//