首页
社区
课程
招聘
[求助]突破代码中的CreateEvent
发表于: 2008-11-22 13:29 4361

[求助]突破代码中的CreateEvent

2008-11-22 13:29
4361
各位朋友好,这是第一次在看雪发帖子学习,请大家多多指导。
下面代码为利用系统Event来限制程序多个实例运行。但是我想突破这个程序的限制,我在OD中下断点:
bp CreateEventA 但是后面却不知道怎样弄了,有哪位朋友,指点下,怎样突破这样的限制。谢谢了。
#include <stdio.h>
#include <windows.h>

int main(void)
{
	HANDLE handle = NULL;
	 handle = CreateEvent(NULL,TRUE,TRUE, "MyEvent");
	 if (GetLastError() == ERROR_ALREADY_EXISTS) //程序已经运行
	 {
		 printf("have run one \n");
		 CloseHandle(handle);
		 handle = NULL;
		 return -1;
	 }
	 else
	 {
		 printf("only one run ok \n");
	 }

     printf("Waiting for Press \"Enter\" key to quit...\n");
	 getc(stdin);

	 return 0;
}

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

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
2
if (GetLastError() == ERROR_ALREADY_EXISTS) //程序已经运行
也就说这句话GetLastError() == ERROR_ALREADY_EXISTS为真就说明有实例在进程中。
如果为假呢?

可以将这段代码用 nop填掉。
2008-11-22 19:35
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
明白是将这里nop掉,能否讲下怎样分析到这里 看了好多分析的文章,呵呵,就是不清楚怎么根据源代码配合OD来分析。
2008-11-22 19:59
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
如果是用自己写的程序做实验,可以使用OD进行源码调试。

只要程序编译和连接时带着调试信息就可以。

另外,源代码文件路径不能有中文。

方法:

首先配置编译器生成带调试信息的程序,如果是Debug模式,默认已经带有了。如果是Release模式,则按此配置:





然后在OD中,在CPU窗口中,最右侧的一栏,默认为“注释”,点击标题栏可以在“注释”、“源码”、“统计”三者切换。只要切换到“源码”栏即可。

上传的附件:
2008-11-22 20:14
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
非常感谢指点,
我开发工具是:VC 6.0 +SP6 
开发平台:WINXP SP2
OD版本:OllyICE 1.0 版本(原版本也试了)
在OD调试中,看不到源代码(已经切换到OD 的Source窗口)

VC的设置我比较熟悉,调试模式也设置了。

如果可以的话,能否加下我QQ:413982083
2008-11-22 20:33
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
6
不如在函数调用之前添加一个
_asm{ int 3};
呵呵,估计可以ok了.
2008-11-22 21:51
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
很有道理!确实可以了?
为什么加这个就可以了呢?
想知道下原理,嘿嘿。牛
2008-11-22 22:14
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
int 3是汇编指令,断点.
内联宏汇编,int表示触发软中断,3是中断号,
asm是C++的关键字,_asm则是编译器扩展的关键字,表示在此处插入汇编指令.
int 3 相当于 DebugBreak, 机器码就是CC

INT 00H —“0”作除数
INT 01H —单步中断
INT 02H —非屏蔽中断(NMI)
INT 03H —断点中断
INT 04H —算术溢出错误
INT 05H —打印屏幕和BOUND越界
INT 06H —非法指令错误
INT 07H —处理器扩展无效
INT 08H —时钟中断
INT 09H —键盘输入
INT 0BH —通信口(COM2:)
INT 0CH —通信口(COM1:)
INT 0EH —磁盘驱动器输入/输出
INT 11H —读取设备配置
INT 12H —读取常规内存大小(返回值AX为内存容量,以K为单位)
INT 18H —ROM BASIC
INT 19H —重启动系统
INT 1BH —CTRL+BREAK处理程序
INT 1CH —用户时钟服务
INT 1DH —指向显示器参数表指针
INT 1EH —指向磁盘驱动器参数表指针
INT 1FH —指向图形字符模式表指针
2008-11-22 22:25
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
00401025  |.  CC            int3
00401026  |?  CC            int3
00401027  |?  C745 FC 00000>mov     dword ptr [ebp-4], 0             ; HANDLE handle = NULL;
0040102E  |.  CC            int3                                     ; _asm{ int 3};
0040102F  |?  8BF4          mov     esi, esp                         ; handle = CreateEvent(NULL,TRUE,TRUE, "MyEvent");
00401031  |?  68 305A4100   push    00415A30
00401036  |?  6A 01         push    1
00401038  |?  6A 01         push    1
0040103A  |?  6A 00         push    0
0040103C  |?  FF15 58B14100 call    dword ptr [<&KERNEL32.CreateEven>
00401042  |?  3BF4          cmp     esi, esp
00401044  |?  E8 B7040000   call    _chkesp
00401049  |.  8945 FC       mov     dword ptr [ebp-4], eax
0040104C  |?  8BF4          mov     esi, esp                         ; if (GetLastError() == ERROR_ALREADY_EXISTS) //程序已经运行
0040104E  |?  FF15 54B14100 call    dword ptr [<&KERNEL32.GetLastErr>
00401054  |?  3BF4          cmp     esi, esp
00401056  |?  E8 A5040000   call    _chkesp
0040105B  |?  3D B7000000   cmp     eax, 0B7
00401060  |?  75 2C         jnz     short 0040108E
00401062  |?  68 385A4100   push    00415A38                         ; printf("have run one \n");
00401067  |?  E8 14040000   call    printf
0040106C  |.  83C4 04       add     esp, 4
0040106F  |?  8BF4          mov     esi, esp                         ; CloseHandle(handle);
00401071  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
2008-11-22 22:27
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
10
搂主学的很快.....嘿嘿..
2008-11-22 22:59
0
游客
登录 | 注册 方可回帖
返回
//