首页
社区
课程
招聘
[求助][求助]《软件加密技术内幕》中INT1反调试在VS2008中生成的Release版本不能执行
发表于: 2012-2-28 10:05 5529

[求助][求助]《软件加密技术内幕》中INT1反调试在VS2008中生成的Release版本不能执行

2012-2-28 10:05
5529
在VS2008中编译,有如下错误:
1>正在编译...
1>int1.cpp
1>c:\int1\int1.cpp(35) : warning C4733: 内联 asm 分配到“FS:0”: 处理程序未注册为安全处理程序
1>c:\int1\int1.cpp(40) : warning C4733: 内联 asm 分配到“FS:0”: 处理程序未注册为安全处理程序

首先,这个注册安全处理程序要调用什么函数注册?

其次,生成的DEBUG版本程序功能正常,RELEASE版本的点击无反应。
用OD挂上去看了一下,没看太明白。
有能解释一下的吗?

==============================================================
附上原代码:
/*--------------------------------------------------------------
   int1.cpp -- 利用int 1检测SoftICE
                           (c) www.pediy.com 段钢, 2003
  --------------------------------------------------------------*/

#include <windows.h>

BOOL SoftICELoaded();

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{

        if( SoftICELoaded() )
                MessageBox(NULL,TEXT ("SoftICE is active!"),TEXT ("OK"),MB_ICONEXCLAMATION);
        else
            MessageBox(NULL,TEXT ("Can't find SoftICE with this method!"),TEXT ("Error"),MB_ICONEXCLAMATION);

        return 0;
}

//////////////////////////////////////////////////////////////////////
// 此法仅Windows 2000/XP系统有效,实际操作时,还必须加入判断操作系统的代码
//////////////////////////////////////////////////////////////////////

BOOL SoftICELoaded()
{
        int mark=0;
        _asm {
               

                        push offset handler
                        push dword ptr fs:[0]        // 建立SEH链
                        mov  dword ptr fs:[0],esp
                        xor  eax,eax
                        int 1              // 如果SICE已启动,且存在3级调试器,则不发生异常,否则发生异常
                        inc  eax
                        inc  eax
                        pop  dword ptr fs:[0]
                        add esp,4
                        or   eax,eax
                        jz   found
                        cmp mark, 0
            jnz   found
                        jmp  Nofound

        handler:           // 异常回调处理函数               
                    mov ebx,[esp+0ch]
                        add dword ptr [ebx+0b8h],02h  // CONTEXT.EIP+2
                    mov ebx,[esp+4]
                        cmp [ebx], 80000004h  // 0C0000005正常,80000004被调试
                        jz Table
                        inc mark         
     Table:                       
                        xor eax,eax
                        ret                           //表示已经修复,从现在的CONTEXT.EIP处执行
       
                        }
Nofound:
                return FALSE;       
               
found:
                return TRUE;

}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
问题原因大概如下:
VS6生成的SoftICELoaded():
00401040   $  55            PUSH EBP
00401041   .  8BEC          MOV EBP,ESP
00401043   .  51            PUSH ECX
00401044   .  53            PUSH EBX
00401045   .  56            PUSH ESI
00401046   .  57            PUSH EDI

00401047   .  C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0

VS2008生成的SoftICELoaded():
00401000   $  55            PUSH EBP
00401001   .  8BEC          MOV EBP,ESP
00401003   .  51            PUSH ECX
00401004   .  53            PUSH EBX
00401005   .  C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0

压栈个数不同,后面所有的栈计算,需要加上这个delta

继续晕,加了delta还是不行。
2012-2-28 11:10
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
问题已解决,在这里找到了答案:
http://hi.baidu.com/znjcx/blog/item/412ebc087dd214db62d986e2.html

=============================================================
在vs2008环境下编译一个seh的例子

编译提示:warning C4733: 内联 asm 分配到“FS:0”: 处理程序未注册为安全处理程序

生成好的exe怎么都进入不了seh.

以为自己代码问题,在radasm下作了一个发现没问题,

后来找到一个微软的说明

http://msdn.microsoft.com/zh-cn/library/9a89h429(VS.80).aspx

是safeseh的问题

在链接器命令行中加入/SAFESEH:NO就可以了,不过还是有警告,可以不管也可以设置忽略

#pragma warning(disable:4733)
2012-2-29 15:44
0
游客
登录 | 注册 方可回帖
返回
//