首页
社区
课程
招聘
[旧帖] [求助]搞N天了,怎么逆向编写出应用了VC下SEH的程序结构? 0.00雪花
发表于: 2009-2-20 21:49 3941

[旧帖] [求助]搞N天了,怎么逆向编写出应用了VC下SEH的程序结构? 0.00雪花

2009-2-20 21:49
3941
我写了一个简单的触发异常的main函数,编译后静态反汇编就不知道怎么该还原代码!特别是_except块中的代码和过滤器表达式中的代码的地址不知道怎么找。请大家帮帮我。谢谢。

附源代码和反汇编代码(部分)
#include <windows.h>
#include <stdio.h>

EXCEPTION_DISPOSITION __cdecl _except_handler(
                                struct _EXCEPTION_RECORD *ExceptionRecord,
                            void *EstablisherFrame,
                            struct _CONTEXT *ContextRecord,
                            struct _DISPATCHER_CONTEXT *DispatcherContext
                    )
{
        printf("Home Grown handler:Exception Code:%08X Exception Flags %X",
                ExceptionRecord->ExceptionCode,ExceptionRecord->ExceptionFlags);
       
        if(ExceptionRecord->ExceptionFlags & 1)
                printf(" EH_NONCONTINUABLE");
        if(ExceptionRecord->ExceptionFlags & 2)
                printf(" EH_UNWINDING");
        if(ExceptionRecord->ExceptionFlags & 4)
                printf(" EH_EXIT_UNWIND");
        if(ExceptionRecord->ExceptionFlags & 8)
                printf(" EH_STACK_INVALID");
        if(ExceptionRecord->ExceptionFlags & 0x10)
                printf(" EH_NESTED_CALL");
        printf("\n");
       
        return ExceptionContinueSearch;
}

void HomeGrownFrame(void)
{
        DWORD handler = (DWORD)_except_handler;
        __asm
        {
                push handler
                push fs:[0]
                mov fs:[0],esp
        }
        *(PDWORD)0 = 0;
        printf("I should never get here!\n");
        __asm
        {
                mov eax,[esp]
                mov fs:[0],eax
                add esp,8
        }
}

int main()
{
        __try
        {
                HomeGrownFrame();
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
                printf("Caught the exception in main()\n");
        }
        return 0;
}

.text:00401100 ; int __cdecl main(int argc, const char **argv, const char *envp)
.text:00401100 _main           proc near               ; CODE XREF: ___tmainCRTStartup+15Ap
.text:00401100
.text:00401100 var_18          = dword ptr -18h
.text:00401100 var_10          = dword ptr -10h
.text:00401100 var_8           = dword ptr -8
.text:00401100 var_4           = dword ptr -4
.text:00401100 argc            = dword ptr  8
.text:00401100 argv            = dword ptr  0Ch
.text:00401100 envp            = dword ptr  10h
.text:00401100
.text:00401100                 push    ebp
.text:00401101                 mov     ebp, esp        ; EBP-00 : _ebp
.text:00401103                 push    0FFFFFFFEh      ; EBP-04 trylevel
.text:00401105                 push    offset dword_40B320 ; EBP-08 scopetable数组指针
.text:0040110A                 push    offset __except_handler4 ; EBP-0C handler函数地址
.text:0040110F                 mov     eax, large fs:0
.text:00401115                 push    eax             ; EBP-10 指向前一个EXCEPTION_REGISTRATION结构
.text:00401116                 sub     esp, 8          ; EBP-14 指向一个EXCEPTION_POINTERS结构
.text:00401116                                         ; EBP-18 ESP
.text:00401119                 push    ebx
.text:0040111A                 push    esi
.text:0040111B                 push    edi
.text:0040111C                 mov     eax, dword_40C0D4
.text:00401121                 xor     [ebp+var_8], eax ; scopetable = 44BF19B0
.text:00401124                 xor     eax, ebp
.text:00401126                 push    eax
.text:00401127                 lea     eax, [ebp+var_10]
.text:0040112A                 mov     large fs:0, eax ; 安装EXCEPTION_REGISTRATION结构
.text:00401130                 mov     [ebp+var_18], esp ; 保存所有prolog代码执行完毕之后的堆栈指针(ESP)
.text:00401133                 mov     [ebp+var_4], 0  ; trylevel = 0
.text:0040113A                 call    sub_4010B0
.text:0040113F                 mov     [ebp+var_4], 0FFFFFFFEh
.text:00401146                 jmp     short loc_401165
.text:00401148 ; ---------------------------------------------------------------------------
.text:00401148                 mov     eax, 1
.text:0040114D                 retn
.text:0040114E ; ---------------------------------------------------------------------------
.text:0040114E                 mov     esp, [ebp+var_18]
.text:00401151                 push    offset aCaughtTheExcep ; "Caught the exception in main()\n"
.text:00401156                 call    sub_401179      ; printf函数
.text:0040115B                 add     esp, 4
.text:0040115E                 mov     [ebp+var_4], 0FFFFFFFEh
.text:00401165
.text:00401165 loc_401165:                             ; CODE XREF: _main+46j
.text:00401165                 xor     eax, eax
.text:00401167                 mov     ecx, [ebp+var_10]
.text:0040116A                 mov     large fs:0, ecx
.text:00401171                 pop     ecx
.text:00401172                 pop     edi
.text:00401173                 pop     esi
.text:00401174                 pop     ebx
.text:00401175                 mov     esp, ebp
.text:00401177                 pop     ebp
.text:00401178                 retn

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
晕,没人解答。是不是我问得不对还是?就是说,在没有源代码的情况下怎么把汇编代码还原回去?我现在的问题是不知道怎么在汇编中定位__except执行块的代码。
2009-2-21 15:39
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
3
我也不懂,不是不想帮你.不过你可以先Google一下.
2009-2-21 15:54
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢你的回复,我找了很久没有找到,所以才来这上面提问题的.

我知道它的结构大致是:
;struct _EXCEPTION_REGISTRATION{
;   struct _EXCEPTION_REGISTRATION *prev;
;   void (*handler)(    PEXCEPTION_RECORD,
;                   PEXCEPTION_REGISTRATION,
;                   PCONTEXT,
;                  PEXCEPTION_RECORD);
;  struct scopetable_entry *scopetable;
;  int trylevel;
;  int _ebp;
;  PEXCEPTION_POINTERS xpointers;
;};

而scopetable[trylevel]->lpfnFilter是过滤表达式的函数,scopetable[trylevel]->lpfnHandler是__except块中的代码.可是我在汇编中定位不到,不知道是怎么回事?scopetable的结构是这样的:
typedef struct _SCOPETABLE
{
   DWORD previousTryLevel;
   DWORD lpfnFilter;
   DWORD lpfnHandler;
} SCOPETABLE, *PSCOPETABLE;

按上面汇编的分析scopetable=44BF19B0,trylevel = 0,然后scopetable[trylevel]->lpfnHandler呢?它的值该怎么算?即便算出来好象也是错误的.
2009-2-21 16:10
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
HELP!!
2009-2-22 19:57
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
Help!!
2009-2-23 09:28
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
HELP!!
2009-2-23 19:44
0
雪    币: 263
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
看dword_40B320指向的表,多看几个vc6的就知道怎么找了
2009-2-23 19:51
0
游客
登录 | 注册 方可回帖
返回
//