首页
论坛
专栏
课程

[调试逆向] [求助]逆向一个涵数有些不解,请指导下

2007-11-7 17:55 8905

[调试逆向] [求助]逆向一个涵数有些不解,请指导下

2007-11-7 17:55
8905
如下
.text:00493370 sub_493370      proc near               ; CODE XREF: sub_445D00+90p
.text:00493370                                         ; sub_445D00+9Ep ...
.text:00493370
.text:00493370 var_C           = dword ptr -0Ch
.text:00493370 var_4           = dword ptr -4
.text:00493370
.text:00493370                 mov     eax, large fs:0
.text:00493376                 mov     cl, byte ptr dword_A75DA0
.text:0049337C                 push    0FFFFFFFFh
.text:0049337E                 push    offset loc_60B26E
.text:00493383                 push    eax
.text:00493384                 mov     eax, 1
.text:00493389                 test    cl, al
.text:0049338B                 mov     large fs:0, esp
.text:00493392                 jnz     short loc_4933BA
.text:00493394                 or      dword_A75DA0, eax
.text:0049339A                 push    eax
.text:0049339B                 mov     ecx, offset unk_A75D10
.text:004933A0                 mov     [esp+10h+var_4], 0
.text:004933A8                 call    sub_4932E0
.text:004933AD                 push    offset sub_8F7140 ; void (*)(void)
.text:004933B2                 call    _atexit
.text:004933B7                 add     esp, 4
.text:004933BA
.text:004933BA loc_4933BA:                             ; CODE XREF: sub_493370+22j
.text:004933BA                 mov     ecx, [esp+0Ch+var_C]
.text:004933BD                 mov     eax, offset unk_A75D10
.text:004933C2                 mov     large fs:0, ecx
.text:004933C9                 add     esp, 0Ch
.text:004933CC                 retn
.text:004933CC sub_493370      endp

可能是太菜的原因,反复看了这段代码 mov     eax, large fs:0 可能是传说中的异常处理吧
涵数似乎是判断地址byte ptr dword_A75DA0 的字节是否为本,如果为0就 or      dword_A75DA0, eax把这个字节置为1,然后进行一些必要的类似初始化(猜的),加之有异常,分析起来晕呼晕呼,不知道我对这涵数的理解是否正确,请指点下

[公告][征集寄语] 看雪20周年年会 | 感恩有你,一路同行

最新回复 (17)
linxer 11 2007-11-7 22:42
2
0
从这行看可能是一个类对象,因为设置ecx后并没有直接使用,而是调用了一个函数
text:0049339B                 mov     ecx, offset unk_A75D10

class_type fun()
{
        static class_type _IDonotKnowName;
        int nTemp = -1;
        char _cl = dword_A75DA0;        //这个变量用于控制静态对象只初始化(构造)一次

        try
        {
                if(0 == (_cl & 0x01))
                {
                        dword_A75DA0 |= 1;
                        nTemp = 0;
                        _IDonotKnowName.class_type::class_type(0); //调用构造函数(call sub_4932E0)
                        _atexit(sub_8F7140);        //这个是保证静态对象在程序结束时要析构
                }
        }
        catch(...)
        {
                call loc_60B26E;
        }

        return _IDonotKnowName;
}

至于怎么抛出异常,偶就不知道了,代码里看不出来
还有就是上面代码中的那个nTemp我也没明白为什么会有这个,不知道是作者代码中的东西,还是编译器搞上去有特殊用途的

作者真实的代码可能
class_type fun()
{
  static class_type _IDonotKnowName(0);

  return _IDonotKnowName;
}

其它的都是编译器加上去的
十三少 2 2007-11-7 22:56
3
0
不知道的还以为你买了asm2c插件了。
linxer 11 2007-11-7 23:10
4
0
刚搞来的,这是处女试
十三少 2 2007-11-7 23:14
5
0
向cn学习。
wangdell 6 2007-11-8 00:16
6
0
!!!厉害,厉害
呵呵,只写一个厉害,系统竟然不让发贴。
foxabu 13 2007-11-8 01:04
7
0
--- f:\projects\classlearning2\classlearning2\classlearning2.cpp ---------------
// ClassLearning2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
class StaticClass
{
public :
        StaticClass(int i)
00401000  push        ecx  
00401001  push        esi  
00401002  mov         esi,ecx
        {
                __asm {mov eax,eax}
00401004  mov         eax,eax
                StaticClass(1);
00401006  push        1   
00401008  lea         ecx,[esp+0Bh]
0040100C  call        StaticClass::StaticClass (401000h)
        }
00401011  mov         eax,esi
00401013  pop         esi  
00401014  pop         ecx  
00401015  ret         4   
--- 无源文件 -----------------------------------------------------------------------
00401018  int         3   
00401019  int         3   
0040101A  int         3   
0040101B  int         3   
0040101C  int         3   
0040101D  int         3   
0040101E  int         3   
0040101F  int         3   
--- f:\projects\classlearning2\classlearning2\classlearning2.cpp ---------------
        ~StaticClass()
        {
        }
};
StaticClass * Test()
{
00401020  mov         eax,dword ptr fs:[00000000h]
00401026  push        0FFFFFFFFh
00401028  push        offset __ehhandler$?Test@@YAPAVStaticClass@@XZ (40186Eh)
0040102D  push        eax  
        static StaticClass myclass(1);
0040102E  mov         eax,1
00401033  mov         dword ptr fs:[0],esp
0040103A  test        byte ptr [$S1 (40337Ch)],al
00401040  jne         Test+48h (401068h)
00401042  or          dword ptr [$S1 (40337Ch)],eax
00401048  push        eax  
00401049  mov         ecx,offset myclass (403378h)
0040104E  mov         dword ptr [esp+0Ch],0
00401056  call        StaticClass::StaticClass (401000h)
0040105B  push        offset `Test'::`2'::`dynamic atexit destructor for 'myclass'' (401880h)
00401060  call        atexit (40112Dh)
00401065  add         esp,4
        try
        {       
        }catch(...)
        {
        }
        return &myclass;
}
00401068  mov         ecx,dword ptr [esp]
0040106B  mov         eax,offset myclass (403378h)
00401070  mov         dword ptr fs:[0],ecx
00401077  add         esp,0Ch
0040107A  ret              
--- 无源文件 -----------------------------------------------------------------------
0040107B  int         3   
0040107C  int         3   
0040107D  int         3   
0040107E  int         3   
0040107F  int         3   
--- f:\projects\classlearning2\classlearning2\classlearning2.cpp ---------------
int _tmain(int argc, _TCHAR* argv[])
{
        Test();
00401080  call        Test (401020h)
        return 0;
00401085  xor         eax,eax
}
00401087  ret

从以上代码看的出来
要达到这个编译优化
构造函数应该是传得1 如果在默认优化设置下
且也不是返回一个对象
而是这个对象的指针。因为如果是对象 会调用拷贝函数

VC8 Release 编译
LZ的代码应该是VC6的 默认没有 ESP CHECK
njmdk 2007-11-8 01:43
8
0
真是谢谢楼上 linxer 以及 foxabu的代码和指点,我最喜欢就是看用代码来解释,很详细,我慢慢消化消化^o^
还有感谢十三上次给我的代码,让我受益非浅

还有个问题
对于
.text:00493370 var_C           = dword ptr -0Ch
.text:00493370 var_4           = dword ptr -4
看似乎是这个涵数中使用的局部变量,但是汇编代码中并没有看到类似 sub esp,0ch 之类的东西,怎么理解这种情况呢
foxabu 13 2007-11-8 01:56
9
0
.text:0049337C                 push    0FFFFFFFFh
.text:0049337E                 push    offset loc_60B26E
.text:00493383                 push    eax
十三少 2 2007-11-8 08:37
10
0
一个是普通变量,另一个被SHE拿去用了。
so
int nTemp = -1;这句是没必要写的,因为是编译器生成的。
njmdk 2007-11-8 11:10
11
0
对于这局部变量基本懂了,虽然没用类似 sub esp,0ch 显式申明,但几个push实际上已经是在申明的同时初试话这些变量了,嘿嘿 又长见识了
linxer 11 2007-11-8 15:21
12
0
这个帖子被加精了,偶就再说两句吧,让它完美点

.text:0049337C                 push    0FFFFFFFFh
.text:0049337E                 push    offset loc_60B26E
.text:00493383                 push    eax

这三行代码是vc SEH异常处理用的,昨天晚上看的时候按标准的异常处理项了,就多出一个nTemp = -1了, 这是一个阔展了的SEH异常处理项

sub esp,0ch 就是跟上面三行代码对着来的

罗云彬的win32汇编里 和 看雪的软件加密技术内幕里都有详尽论述
kanxue 8 2007-11-8 15:38
13
0
操作失误,应是设置优秀帖,己纠正过来了。
njmdk 2007-11-8 16:09
14
0
看见精心里还扑嗵扑嗵了半天,刚煮熟的鸭子又飞了,下次多煮几只
12321 2007-11-9 14:22
15
0
十三少也喜欢SHE啊?
当哩个当 2007-11-9 14:39
16
0
我也喜欢SHE
Kendiv 2007-12-8 22:29
17
0
why not try to hex-rays?
foxabu 13 2007-12-9 00:45
18
0
LZ发帖的时候还没有免费版的
游客
登录 | 注册 方可回帖
返回