首页
社区
课程
招聘
[求助]请高手教我怎样在c++下反跟踪
发表于: 2008-10-30 16:57 5112

[求助]请高手教我怎样在c++下反跟踪

2008-10-30 16:57
5112
我写了一个算法,经理让我实现反跟踪,我看了看加密与解密第二版看的一头雾水,一点头绪都没有 ,不知道该怎样实现。拜请高手帮帮我吧~~~~
程序是c++的,vs2005环境下,CLR控制台应用程序

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
完全的反跟踪几乎是不可能的,再厉害的反跟踪手段都可以被 反-反跟踪。只能是尽量增加跟踪的难度。

说一些通常的原理:

1.用运行时多态来替代条件判断语句;

2.代码扰乱,比如在发布时将所有函数名和变量名改为无意义的名字;

3.垃圾代码填充,比如在正常功能代码中间加入无意义的代码;

4.代码扭曲变形,特别是对常量的处理上,比如常量赋值语句,尽量用复杂难懂的等效语句来替代。

5.并行或异步逻辑,通过多线程,或定时器,将取得输入信息,对信息处理,以及输出信息的步骤延迟处理。

6.程序打散,将算法关键代码分散到程序的不同的地方,而不是集中在一个函数里。

7.定义无用的数据结构,比如一个结构中要用到4个域,你可以定义一个包含10个域的结构,并且有用的域和填充域混迭一起,不要只在结构的尾部填充。

8.对于填充的数据域,还要进行操作和访问,让跟踪人员无法准确推断出数据结构。

9.使用异常处理机制,来使程序执行流程难以跟踪。但注意引起异常的代码一定不要让人看出是故意引起的。

我能想到的先就这么多了。你还需要自己多多总结。
2008-10-30 18:04
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
3
楼上跟乌龟大师师出同门?
感觉写作风格很像.
2008-10-30 19:22
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
呵呵,是吗?哪里像啊??

我不认识他实际上。
2008-10-30 22:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
异常机制我也看来着 没看懂- -
能写一小段代码让我照葫芦画瓢么?
2008-10-31 08:31
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
__try {
                        int a=1/0;
                }
                __except(EXCEPTION_EXECUTE_HANDLER) {
                       ;在这加点什么东西
                }
2008-10-31 15:45
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
多谢多谢~~可是多写几个这样的代码就行了么
我们经理说比如最后的程序运行起来,最终代码你可以分为几段(他给我演示的时候用的汇编),比如三段,他让我先把1和3段异或一下,他说这样跟踪的人就看不懂啥意思了,然后再次运行的时候再异或一下,这样程序就正常运行了
这个怎么实现啊   尤其涉及到反汇编,我学的最差的其中就有它
还有 他让我设置一个计时器 说什么一旦运行超时 程序就退出来或者转到垃圾代码处 这个又怎么实现啊 计时器应该怎么设 我怎么才能发现别人在破解跟踪我的程序呢 是通过查看什么东西么还是要自己设置变量?
我是新手,刚上班,拜请各位大侠多多帮忙~~我家里网速慢,打开这个论坛很费劲,各位大侠可以加我qq1071291922 ,沟通及时些
洒泪感谢中
2008-10-31 17:06
0
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
8
偶也没看出来哪里像了,而且偶注册的日期比他晚很多
2008-10-31 17:30
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
9
像 int a = 1/0;这种代码,编译器根本就通不过,至少我的IntelC++Compiler不行。

而且这样的代码根本无法干扰破解者,一眼就可以看出来这里要用SEH了。

要使用异常来干扰破解者,一定要做得隐蔽。可以在深层的函数调用当中产生异常,而在外层处理异常,还可以使用嵌套异常处理。我这里举个小小的例子。虽然无法保证不被跟踪,至少会给破解者制造很大的麻烦。代码如下:

以下代码在我的编译器上工作正常,请自行包含正确的头文件。

程序采用递归调用fun1,在递归第二层时产生除0异常。

在fun2中捕获异常,并抛出一个整数。

在fun3中捕获这个整数,并用它调用fun1,这将再次抛出异常。

该异常被捕获后,如果没有检测到调试器,将某函数指针抛出。

最外层捕获这个函数指针,并用它执行必要的操作。

typedef  void (*pFunc)(void);

extern void keyfunction(void);

void fun1( int i)
{

     double f = (double) i;

     f *= 0.237;

     if ( i ^ ( i - i ) | 0x21 )
      {
           int j = (i+1) / i;
        
           fun1( j-1);
        
      }
       else

            return;
}

void fun2( )
{
      try
     {
              int j = 0x128;
              j *= 6;

             fun1 (j);
      }
      catch(...)
      {
             throw (int)3279;
      }

}

void fun3 ()
{

     try
     {
            fun2();
     }
     catch ( int i )
    {
         try
         {
              fun1(i);
         }
          catch(...)
         {

                  if ( !IsDebuggerPresent())
                throw (pFunc)keyfunction;
                 else
                throw;
         }
     }

}

int main()
{

try
{
     fun3();
}
catch( pFunc pf)
{
     (*pf)();
}
catch( ... )
{
    std::cout << "Ooops!!!" << std::endl;
    return -1;
}

return 0;
}

void keyfunction(void)
{
        std::cout     << "in keyfunction" << std::endl;
}

关于这个演示代码,其中函数指针可以用一个对象代替,在检测到调试器时,也可以抛出一个假的函函数指针,这样更具有迷惑性。

这样的异常处理,相信一般的破解者,是很难找到关键点了。

再结合其它的反调试技术,可以做到让有经验的破解者也不容易跟踪。

如果再购买商业的软件保护系统,可以说是到了BT程度了。
2008-10-31 22:14
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
10
再说两句。

像这样的代码,在软件工程学中,可以说是非常糟糕的。

但是它反跟踪真的很有效果。

作为一个逆向爱好者,我并不害怕软件作者采用复杂的反跟踪技术。

我的愿望其实是人们都用正版软件,所有破解都是严格限于技术圈子内部。

中国民众的知识产权意识还是差得不少,这需要很多时间。
2008-10-31 22:20
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
如果一个被加密的程序在运行时,任何调试工具都被禁止,那么要破解它是不可能的。 要做到这一点是不容易的,目前有很多流行的软件加密工具,但总是被Cracker破解,主要原因是在反跟踪反调试方面存在漏洞。
        方法:如果一个被加密的程序在运行时,每时每刻都要使用调试工具所必需使用的资源,那么任何调试工具都将被禁止或者不能与被加密程序同时运行。... ...

阅读全文:http://www.antidebuglib.com/article_cn.html

主    页: http://www.antidebuglib.com/

QQ:  86029535
2008-11-1 10:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
IsDebuggerPresent 要用这个函数 需要包含哪个头文件啊
2008-11-3 15:59
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
13
该函数在winbase.h中声明,一般包含了windows.h就可以引用。

查看头文件,该函数的声明被条件预编译指令包围:

#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
WINBASEAPI
BOOL
WINAPI
IsDebuggerPresent(
    VOID
    );
#endif

所以请检查对应的宏定义。

另外,我提供的概念性的代码,使用IsDebuggerPresent()只是为了说明可以在这一点上检测调试器,但实际中该函数几乎检测不出调试器的存在。所以具体应用中应该采用其它调试器检测技术,而不应该相信这个函数的返回值。

如果反汇编该函数,就知道它只是取TEB的对应域的值,该值几乎总是被调试器所修改。

关于调试器检测,有很多比较成熟的技术,请查找相关技术资料。
2008-11-3 22:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
谢谢书呆彭大哥~~如果方便的话,可不可以给俺留下个qq啊?
我好随时请教~我一定好好学习,坚决不拖彭大哥的后腿!大哥可怜可怜我吧
2008-11-4 08:35
0
游客
登录 | 注册 方可回帖
返回
//