能力值:
(RANK:260 )
|
-
-
2 楼
完全的反跟踪几乎是不可能的,再厉害的反跟踪手段都可以被 反-反跟踪。只能是尽量增加跟踪的难度。
说一些通常的原理:
1.用运行时多态来替代条件判断语句;
2.代码扰乱,比如在发布时将所有函数名和变量名改为无意义的名字;
3.垃圾代码填充,比如在正常功能代码中间加入无意义的代码;
4.代码扭曲变形,特别是对常量的处理上,比如常量赋值语句,尽量用复杂难懂的等效语句来替代。
5.并行或异步逻辑,通过多线程,或定时器,将取得输入信息,对信息处理,以及输出信息的步骤延迟处理。
6.程序打散,将算法关键代码分散到程序的不同的地方,而不是集中在一个函数里。
7.定义无用的数据结构,比如一个结构中要用到4个域,你可以定义一个包含10个域的结构,并且有用的域和填充域混迭一起,不要只在结构的尾部填充。
8.对于填充的数据域,还要进行操作和访问,让跟踪人员无法准确推断出数据结构。
9.使用异常处理机制,来使程序执行流程难以跟踪。但注意引起异常的代码一定不要让人看出是故意引起的。
我能想到的先就这么多了。你还需要自己多多总结。
|
能力值:
( LV9,RANK:180 )
|
-
-
3 楼
楼上跟乌龟大师师出同门?
感觉写作风格很像.
|
能力值:
(RANK:260 )
|
-
-
4 楼
呵呵,是吗?哪里像啊??
我不认识他实际上。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
异常机制我也看来着 没看懂- -
能写一小段代码让我照葫芦画瓢么?
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
__try {
int a=1/0;
}
__except(EXCEPTION_EXECUTE_HANDLER) {
;在这加点什么东西
}
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
多谢多谢~~可是多写几个这样的代码就行了么
我们经理说比如最后的程序运行起来,最终代码你可以分为几段(他给我演示的时候用的汇编),比如三段,他让我先把1和3段异或一下,他说这样跟踪的人就看不懂啥意思了,然后再次运行的时候再异或一下,这样程序就正常运行了
这个怎么实现啊 尤其涉及到反汇编,我学的最差的其中就有它
还有 他让我设置一个计时器 说什么一旦运行超时 程序就退出来或者转到垃圾代码处 这个又怎么实现啊 计时器应该怎么设 我怎么才能发现别人在破解跟踪我的程序呢 是通过查看什么东西么还是要自己设置变量?
我是新手,刚上班,拜请各位大侠多多帮忙~~我家里网速慢,打开这个论坛很费劲,各位大侠可以加我qq1071291922 ,沟通及时些
洒泪感谢中
|
能力值:
(RANK:280 )
|
-
-
8 楼
偶也没看出来哪里像了,而且偶注册的日期比他晚很多
|
能力值:
(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程度了。
|
能力值:
(RANK:260 )
|
-
-
10 楼
再说两句。
像这样的代码,在软件工程学中,可以说是非常糟糕的。
但是它反跟踪真的很有效果。
作为一个逆向爱好者,我并不害怕软件作者采用复杂的反跟踪技术。
我的愿望其实是人们都用正版软件,所有破解都是严格限于技术圈子内部。
中国民众的知识产权意识还是差得不少,这需要很多时间。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
IsDebuggerPresent 要用这个函数 需要包含哪个头文件啊
|
能力值:
(RANK:260 )
|
-
-
13 楼
该函数在winbase.h中声明,一般包含了windows.h就可以引用。
查看头文件,该函数的声明被条件预编译指令包围:
#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
WINBASEAPI
BOOL
WINAPI
IsDebuggerPresent(
VOID
);
#endif
所以请检查对应的宏定义。
另外,我提供的概念性的代码,使用IsDebuggerPresent()只是为了说明可以在这一点上检测调试器,但实际中该函数几乎检测不出调试器的存在。所以具体应用中应该采用其它调试器检测技术,而不应该相信这个函数的返回值。
如果反汇编该函数,就知道它只是取TEB的对应域的值,该值几乎总是被调试器所修改。
关于调试器检测,有很多比较成熟的技术,请查找相关技术资料。
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
谢谢书呆彭大哥~~如果方便的话,可不可以给俺留下个qq啊?
我好随时请教~我一定好好学习,坚决不拖彭大哥的后腿!大哥可怜可怜我吧
|
|
|