您的位置:

js反调试反debug,游戏反调试

js反调试反debug,游戏反调试

更新:

本文目录一览:

JS代码混淆了,怎么反混淆回去?

这不是混淆,只是使用16进制表示的ASCII码~

单独提取出字符串,在后面加上.toString()进行调试即可看到原本字符串。

你的这句转码后如下:

window["document"]["write"]('sc')

相当于:window.document.write('sc')

很有可能是输出一个script标签的代码段的开始。

谷歌浏览器js怎么打debug

首先请打开“谷歌浏览器”(废话),然后打开一个网页,按“F12”会出现一个控制台,找到一个叫做“Sources”,点击它OK,如果你的页面现在已经加载过JS脚本的话,那么应该可以看到一些JS文件了然后你可以在左侧侧栏的序号那些位置点击一下就设置成断

反调试是什么

免杀就不知道了.反调试就是禁止调试一般有这样的一些原理.一、反调试技术反调试技术是一种常见的反检测技术,因为恶意软件总是企图监视自己的代码以检测是否自己正在被调试。为做到这一点,恶意软件可以检查自己代码是否被设置了断点,或者直接通过系统调用来检测调试器。1.断点为了检测其代码是否被设置断点,恶意软件可以查找指令操作码0xcc(调试器会使用该指令在断点处取得恶意软件的控制权),它会引起一个SIGTRAP。如果恶意软件代码本身建立了一个单独的处理程序的话,恶意软件也可以设置伪断点。用这种方法恶意软件可以在被设置断点的情况下继续执行其指令。恶意软件也可以设法覆盖断点,例如有的病毒采用了反向解密循环来覆盖病毒中的断点。相反,还有的病毒则使用汉明码自我纠正自身的代码。汉明码使得程序可以检测并修改错误,但是在这里却使病毒能够检测并清除在它的代码中的断点。2.计算校验和恶意软件也可以计算自身的校验和,如果校验和发生变化,那么病毒会假定它正在被调试,并且其代码内部已被放置断点。VAMPiRE是一款抗反调试工具,可用来逃避断点的检测。VaMPiRE通过在内存中维护一张断点表来达到目的,该表记录已被设置的所有断点。该程序由一个页故障处理程序(PFH),一个通用保护故障处理程序(GPFH),一个单步处理程序和一个框架API组成。当一个断点被触发的时候,控制权要么传给PFH(处理设置在代码、数据或者内存映射I/O中的断点),要么传给GPFH(处理遗留的I/O断点)。单步处理程序用于存放断点,使断点可以多次使用。3.检测调试器在Linux系统上检测调试器有一个简单的方法,只要调用Ptrace即可,因为对于一个特定的进程而言无法连续地调用Ptrace两次以上。在Windows中,如果程序目前处于被调试状态的话,系统调用isDebuggerPresent将返回1,否则返回0。这个系统调用简单检查一个标志位,当调试器正在运行时该标志位被置1。直接通过进程环境块的第二个字节就可以完成这项检查,以下代码为大家展示的就是这种技术:mov eax, fs:[30h]move eax, byte [eax+2]test eax, eax jne @DdebuggerDetected在上面的代码中,eax被设置为PEB(进程环境块),然后访问PEB的第二个字节,并将该字节的内容移入eax。通过查看eax是否为零,即可完成这项检测。如果为零,则不存在调试器;否则,说明存在一个调试器。如果某个进程为提前运行的调试器所创建的,那么系统就会给ntdll.dll中的堆操作例程设置某些标志,这些标志分别是FLG_HEAP_ENABLE_TAIL_CHECK、FLG_HEAP_ENABLE_FREE_CHECK和FLG_HEAP_VALIDATE_PARAMETERS。我们可以通过下列代码来检查这些标志:mov eax, fs:[30h]mov eax, [eax+68h]and eax, 0x70test eax, eaxjne @DebuggerDetected在上面的代码中,我们还是访问PEB,然后通过将PEB的地址加上偏移量68h到达堆操作例程所使用的这些标志的起始位置,通过检查这些标志就能知道是否存在调试器。检查堆头部内诸如ForceFlags之类的标志也能检测是否有调试器在运行,如下所示:mov eax, fs:[30h]mov eax, [eax+18h] ;process heapmov eax, [eax+10h] ;heap flagstest eax, eaxjne @DebuggerDetected上面的代码向我们展示了如何通过PEB的偏移量来访问进程的堆及堆标志,通过检查这些内容,我们就能知道Force标志是否已经被当前运行的调试器提前设置为1了。另一种检测调试器的方法是,使用NtQueryInformationProcess这个系统调用。我们可以将ProcessInformationClass设为7来调用该函数,这样会引用ProcessDebugPort,如果该进程正在被调试的话,该函数将返回-1。示例代码如下所示。push 0

push 4

push offset isdebugged

push 7 ;ProcessDebugPort

push -1

call NtQueryInformationProcess

test eax, eax

jne @ExitError

cmp isdebugged, 0

jne @DebuggerDetected在本例中,首先把NtQueryInformationProcess的参数压入堆栈。这些参数介绍如下:第一个是句柄(在本例中是0),第二个是进程信息的长度(在本例中为4字节),接下来是进程信息类别(在本例中是7,表示ProcessDebugPort),下一个是一个变量,用于返回是否存在调试器的信息。如果该值为非零值,那么说明该进程正运行在一个调试器下;否则,说明一切正常。最后一个参数是返回长度。使用这些参数调用NtQueryInformationProcess后的返回值位于isdebugged中。随后测试该返回值是否为0即可。另外,还有其他一些检测调试器的方法,如检查设备列表是否含有调试器的名称,检查是否存在用于调试器的注册表键,以及通过扫描内存以检查其中是否含有调试器的代码等。另一种非常类似于EPO的方法是,通知PE加载器通过PE头部中的线程局部存储器(TLS)表项来引用程序的入口点。这会导致首先执行TLS中的代码,而不是先去读取程序的入口点。因此,TLS在程序启动就可以完成反调试所需检测。从TLS启动时,使得病毒得以能够在调试器启动之前就开始运行,因为一些调试器是在程序的主入口点处切入的。4.探测单步执行恶意软件还能够通过检查单步执行来检测调试器。要想检测单步执行的话,我们可以把一个值放进堆栈指针,然后看看这个值是否还在那里。如果该值在那里,这意味着,代码正在被单步执行。当调试器单步执行一个进程时,当其取得控制时需要把某些指令压入栈,并在执行下一个指令之前将其出栈。所以,如果该值仍然在那里,就意味着其它正在运行的进程已经在使用堆栈。下面的示例代码展示了恶意软件是如何通过堆栈状态来检测单步执行的:Mov bp,sp;选择堆栈指针Push ax ;将ax压入堆栈Pop ax ;从堆栈中选择该值Cmp word ptr [bp -2],ax ;跟堆栈中的值进行比较Jne debug ;如果不同,说明发现了调试器。 如上面的注释所述,一个值被压入堆栈然后又被弹出。如果存在调试器,那么堆栈指针–2位置上的值就会跟刚才弹出堆栈的值有所不同,这时就可以采取适当的行动。5.在运行时中检测速度衰减通过观察程序在运行时是否减速,恶意代码也可以检测出调试器。如果程序在运行时速度显著放缓,那就很可能意味着代码正在单步执行。因此如果两次调用的时间戳相差甚远,那么恶意软件就需要采取相应的行动了。Linux跟踪工具包LTTng/LTTV通过观察减速问题来跟踪病毒。当LTTng/LTTV追踪程序时,它不需要在程序运行时添加断点或者从事任何分析。此外,它还是用了一种无锁的重入机制,这意味着它不会锁定任何Linux内核代码,即使这些内核代码是被跟踪的程序需要使用的部分也是如此,所以它不会导致被跟踪的程序的减速和等待。6.指令预取如果恶意代码篡改了指令序列中的下一条指令并且该新指令被执行了的话,那么说明一个调试器正在运行。这是指令预取所致:如果该新指令被预取,就意味着进程的执行过程中有其他程序的切入。否则,被预取和执行的应该是原来的指令。7.自修改代码恶意软件也可以让其他代码自行修改(自行修改其他代码),这样的一个例子是HDSpoof。这个恶意软件首先启动了一些异常处理例程,然后在运行过程中将其消除。这样一来,如果发生任何故障的话,运行中的进程会抛出一个异常,这时病毒将终止运行。此外,它在运行期间有时还会通过清除或者添加异常处理例程来篡改异常处理例程。在下面是HDSpoof清除全部异常处理例程(默认异常处理例程除外)的代码。exception handlers before:0x77f79bb8 ntdll.dll:executehandler2@20 + 0x003a

0x0041adc9 hdspoof.exe+0x0001adc9

0x77e94809 __except_handler3exception handlers after:0x77e94809 __except_handler30x41b770: 8b44240c mov eax,dword ptr [esp+0xc]

0x41b774: 33c9 xor ecx,ecx

0x41b776: 334804 xor ecx,dword ptr [eax+0x4]

0x41b779: 334808 xor ecx,dword ptr [eax+0x8]

0x41b77c: 33480c xor ecx,dword ptr [eax+0xc]

0x41b77f: 334810 xor ecx,dword ptr [eax+0x10]

0x41b782: 8b642408 mov esp,dword ptr [esp+0x8]

0x41b786: 648f0500000000 pop dword ptr fs:[0x0] 下面是HDSpoof创建一个新的异常处理程序的代码。0x41f52b: add dword ptr [esp],0x9ca0x41f532: push dword ptr [dword ptr fs:[0x0]0x41f539: mov dword ptr fs:[0x0],esp8.覆盖调试程序信息一些恶意软件使用各种技术来覆盖调试信息,这会导致调试器或者病毒本身的功能失常。通过钩住中断INT 1和INT 3(INT 3是调试器使用的操作码0xCC),恶意软件还可能致使调试器丢失其上下文。这对正常运行中的病毒来说毫无妨碍。另一种选择是钩住各种中断,并调用另外的中断来间接运行病毒代码。下面是Tequila 病毒用来钩住INT 1的代码:new_interrupt_one: push bp mov bp,sp cs cmp b[0a],1 ;masm mod. needed je 0506 ;masm mod. needed cmp w[bp+4],09b4 ja 050b ;masm mod. needed push ax push es les ax,[bp+2] cs mov w[09a0],ax ;masm mod. needed cs mov w[09a2],es ;masm mod. needed cs mov b[0a],1 pop es pop ax and w[bp+6],0feff pop bp iret一般情况下,当没有安装调试器的时候,钩子例程被设置为IRET。V2Px使用钩子来解密带有INT 1和INT 3的病毒体。在代码运行期间,会不断地用到INT 1和INT 3向量,有关计算是通过中断向量表来完成的。一些病毒还会清空调试寄存器(DRn的内容。有两种方法达此目的,一是使用系统调用NtGetContextThread和NtSetContextThread。而是引起一个异常,修改线程上下文,然后用新的上下文恢复正常运行,如下所示: push offset handlerpush dword ptr fs:[0]mov fs:[0],espxor eax, eaxdiv eax ;generate exceptionpop fs:[0]add esp, 4;continue execution;...handler:mov ecx, [esp+0Ch] ;skip divadd dword ptr [ecx+0B8h], 2 ;skip divmov dword ptr [ecx+04h], 0 ;clean dr0mov dword ptr [ecx+08h], 0 ;clean dr1mov dword ptr [ecx+0Ch], 0 ;clean dr2mov dword ptr [ecx+10h], 0 ;clean dr3mov dword ptr [ecx+14h], 0 ;clean dr6mov dword ptr [ecx+18h], 0 ;clean dr7xor eax, eaxret上面的第一行代码将处理程序的偏移量压入堆栈,以确保当异常被抛出时它自己的处理程序能取得控制权。之后进行相应设置,包括用自己异或自己的方式将eax设为0,以将控制权传送给该处理程序。div eax 指令会引起异常,因为eax为0,所以AX将被除以零。该处理程序然后跳过除法指令,清空dr0-dr7,同样也把eax置0,表示异常将被处理,然后恢复运行。9.解除调试器线程我们可以通过系统调用NtSetInformationThread从调试器拆卸线程。为此,将ThreadInformationClass设为0x11(ThreadHideFromDebugger)来调用NtSetInformationThread,如果存在调试器的话,这会将程序的线程从调试器拆下来。以下代码就是一个例子:push 0push 0push 11h ;ThreadHideFromDebuggerpush -2call NtSetInformationThread在本例中,首先将NtSetInformationThread的参数压入堆栈,然后调用该函数来把程序的线程从调试器中去掉。这是因为这里的0用于线程的信息长度和线程信息,传递的-2用于线程句柄,传递的11h用于线程信息类别,这里的值表示ThreadHideFromDebugger。10.解密解密可以通过各种防止调试的方式来进行。有的解密依赖于特定的执行路径。如果这个执行路径没被沿用,比如由于在程序中的某个地方启动了一个调试器,那么解密算法使用的值就会出错,因此程序就无法正确进行自身的解密。HDSpoof使用的就是这种技术。一些病毒使用堆栈来解密它们的代码,如果在这种病毒上使用调试器,就会引起解密失败,因为在调试的时候堆栈为INT 1所用。使用这种技术的一个例子是W95/SK病毒,它在堆栈中解密和构建其代码;另一个例子是Cascade病毒,它将堆栈指针寄存器作为一个解密密钥使用。代码如下所示:lea si, Start ; position to decryptmov sp, 0682 ; length of encrypted bodyDecrypt:xor [si], si ; decryption key/counter 1xor [si], sp ; decryption key/counter 2inc si ; increment one counterdec sp ; decrement the otherjnz Decrypt ; loop until all bytes are decryptedStart: ; Virus body对于Cascade病毒如何使用堆栈指针来解密病毒体,上面代码中的注释已经做了很好的说明。相反,Cryptor病毒将其密钥存储在键盘缓冲区中,这些密钥会被调试器破坏。Tequila使用解密器的代码作为解密钥,因此如果解密器被调试器修改后,那么该病毒就无法解密了。下面是Tequila用于解密的代码:perform_encryption_decryption: mov bx,0 mov si,0960 mov cx,0960 mov dl,b[si] xor b[bx],dl inc si inc bx cmp si,09a0 jb 0a61 ;masm mod. needed mov si,0960 loop 0a52 ;masm mod. needed retthe_file_decrypting_routine: push cs pop ds mov bx,4 mov si,0964 mov cx,0960 mov dl,b[si] add b[bx],dl inc si inc bx cmp si,09a4 jb 0a7e ;masm mod. needed mov si,0964 loop 0a6f ;masm mod. needed jmp 0390 ;masm mod. needed人们正在研究可用于将来的新型反调试技术,其中一个项目的课题是关于多处器计算机的,因为当进行调试时,多处理器中的一个会处于闲置状态。这种新技术使用并行处理技术来解密代码。二、逆转录病毒逆转录病毒会设法禁用反病毒软件,比如可以通过携带一列进程名,并杀死正在运行的与表中同名的那些进程。许多逆转录病毒还把进程从启动列表中踢出去,这样该进程就无法在系统引导期间启动了。这种类型的恶意软件还会设法挤占反病毒软件的CPU时间,或者阻止反病毒软件连接到反病毒软件公司的服务器以使其无法更新病毒库。三、混合技术W32.Gobi病毒是一个多态逆转录病毒,它结合了EPO和其他一些反调试技术。该病毒还会在TCP端口666上打开一个后门。Simile(又名Metaphor)是一个非常有名的复合型病毒,它含有大约14,000行汇编代码。这个病毒通过寻找API调用ExitProcess()来使用EPO,它还是一个多态病毒,因为它使用多态解密技术。它的90%代码都是用于多态解密,该病毒的主体和多态解密器在每次感染新文件时,都会放到一个半随机的地方。Simile的第一个有效载荷只在3月、6月、9月或12月份才会激活。在这些月份的17日变体A和B显示它们的消息。变体C在这些月份的第18日显示它的消息。变体A和B中的第二个有效载荷只有在五月14日激活,而变体C中的第二个有效载荷只在7月14日激活。Ganda是一个使用EPO的逆转录病毒。它检查启动进程列表,并用一个return指令替换每个启动进程的第一个指令。这会使所有防病毒程序变得毫无用处。四、小结本文中,我们介绍了恶意软件用以阻碍对其进行逆向工程的若干反调试技术,同时介绍了逆转录病毒和各种反检测技术的组合。我们应该很好的理解这些技术,只有这样才能够更有效地对恶意软件进行动态检测和分析。

如何进行js的debug

console.debug("setHelpContentPanel:%o",args);

Firebug一共有Console,HTML,CSS,Script,DOM,NET六个Tab,着重说一下Console的用法。

其实我们对于Console应该非常熟悉,因为这里是Firebug给出各种信息的窗口,而这也正是Console的主要用途,日志记录(Logging)。

除此之外,Console还提供了通过命令行方式来调试Javascript的方法。下面就来学习一下Console的用法。

1、Firefox的日志记录(Logging

in

Firefox)。

通过Console的记录方法,我们可以不再使用烦人的alert或者document.write方法来进行调试。Firebug提供了五种日志的类型:

◆console.log:记录一行信息,无任何图标提示;

◆console.debug:记录一行信息,带超链接,可以链接到语句调用的地方;

◆console.error():向控制台中写入错误信息,带错误图标显示和高亮代码链接;

◆console.info():向控制台中写入提示信息,带信息图标显示和高亮代码链接;

◆console.warn():向控制台中写入警告信息,带警告图标显示和高亮代码链接;

consle打印字符串支持字符串替换,使用起来就像c里面的printf(“%s",a),支持的类型包括:

%s

string,字符串

%d,%i 整型

%f 浮点

%o

对象

如果使用%o的话,对象就会用绿色的超链接表示出来,单击后会将你带到DOM视图。

2、分组(Grouping)。

如果某一类的信息特别多时,分组就有利于逻辑的划分。使用上很简单,参见代码。

function

consoleGroup(){ var groupname = "Group 1"; console.group("Message group %s",

groupname); console.log("This is the 1 message in %s", groupname);

console.log("This is the 2 message in %s", groupname); console.log("This is the

3 message in %s", groupname); console.groupEnd(); goupname = "Group 2";

console.group("Message group %s", goupname); console.log("This is the 1 message

in %s", goupname); var subgroupname = "Sub group 1"; console.group("Message

group %s",subgroupname); console.log("This is the 1 message in %s",

subgroupname); console.log("This is the 2 message in %s", subgroupname);

console.log("This is the 3 message in %s", subgroupname); console.groupEnd();

console.log("This is the 2 message in %s", goupname); console.groupEnd();

}

3、console.dir和console.dirxml

console.dir可以将一个对象的所有方法和属性打印出来,这个方法无疑是非常有用的,我们不再需要object.toString这样的方法支持了,只要有firebug,查看对象也变得很轻松。

同时,我们也可以将页面中的元素作为一个对象打印出来,但是你要小心,因为这将输出众多的信息,可能你会迷失在繁杂的信息中而找不到自己需要的条目。

我们可以通过分组将这些大量的信息放入一个分组中,这样可以在逻辑上更清楚一些。

function

consoleDir(){ function Car(){ this.Model = "Old Model"; this.getManu =

function(){ return "Toyota"; } } var objCar = new Car(); console.dir(objCar);

console.dir(zoo); var groupname = "Css Style"; console.group("The button Style",

groupname); console.dir(document.getElementById('consoledir').style, groupname);

console.groupEnd(); }

console.dirxml

打印出HTML元素的XML表示形式.

4、断言(console.assert())。

console.assert()可以用来判断一个表达式是否正确,如果错误,他就会打印错误信息在控制台窗口中。

5、追踪(console.trace())。

console.trace()是一个非常有趣的功能。我们先来看看官方的解释:打印Javascript执行时刻的堆栈追踪。

这个函数可以打印出程序执行时从起点到终点的路径信息。比如如果我们想知道某个函数是何时和如何被执行的,我们将console.trace()放在这个函数中,我们就能够的看到这个函数被执行的路径。这个函数在调试其他人的源代码时非常有用。

6、计时(Timing)。

console.time(timeName)可以用来计时,这个在我们需要知道代码执行效率的时候特别有用,就不用自己造轮子了。

function

consoleTime(){ var timeName = "timer1"; console.time(timeName); var a = 0;

for(var i = 0; i 100; i++){ for(var j = 0; j 100; j++){//

console.log('Hello world'); a = a + 1; } } console.log("a = %d", a);

console.timeEnd(timeName); }

7、Javascript分析器(Javascript

Profiler)。

我们可以通过代码console.profile('profileName')或者单击Profiler标签来进行Javascript代码

执行的分析。这个功能有点类似于console.time(),可以帮助我们评估代码的表现,但是能够提供比console.time()更详细的信息。

有三种方法可以调用Javascript

profiler。一种是在代码中写入分析脚本,一种是单击profile标签,最后还可以在命令行下输入命令来执行。执行后,可以看到详细的输出结果,下面对各项进行一些说明:

Function

Column:显示调用的函数名称;

Call Column:显示调用次数;

Percent

Column:显示消耗的时间比;

Own Time:显示函数内部语句执行的时间,不包括调用其他函数的时间;

Time

Column:显示函数从开始到结束的执行时间;

Avg Column:平均时间。Avg = Own /

Call;

Min Max Column:显示最小和最大时间;

File

Column:函数所在的文件;

8、其他的一些选项。

在Console

Tab的最右侧有一个Options的选项,在这里可以自己定义需要显示的错误,其内容很好理解,这里就不多说了。有一点就是Firebug1.3以后,多了Show

Chrome Errors和Show Chrome Message 等几个选项,这几个选项还没有验证过其具体的作用

js反调试反debug,游戏反调试

本文目录一览: 1、JS代码混淆了,怎么反混淆回去? 2、谷歌浏览器js怎么打debug 3、反调试是什么 4、如何进行js的debug JS代码混淆了,怎么反混淆回去? 这不是混淆,只是使用16进制

2023-12-08
cocos反编译jsc,cocos2djsc反编译

2022-11-25
jssdk调试,如何调试js

2022-11-25
js调试命令详解(js调试器)

本文目录一览: 1、如何用用命令行开启nodejs搭建web服务器 2、利用JavaScript 调用打印命令详解 3、jshint 详解 4、跪求汇编语语言命令详解 5、JS有什么关键字 如何用用命

2023-12-08
java反射调用,java反射调用方法

2023-01-06
java调用反法,java中取反

2022-11-17
js混淆反编译,js代码反混淆

2022-11-24
crack.js反混淆,js代码反混淆

2022-11-24
js在线调试工具安卓(java在线调试工具)

本文目录一览: 1、Android webview加载的页面怎样调试JS 2、JavaScript如何调试有哪些建议和技巧附五款有用的调试工具 3、什么Js调试工具比较好? 4、安卓系统浏览器怎样打开

2023-12-08
印象笔记记录java学习(Java成长笔记)

2022-11-12
微信jssdk调试(微信调试代码)

本文目录一览: 1、微信朋友圈JSSDK分享自定义图片文字 2、微信公众号开发之如何使用JSSDK 3、【求帮助】 微信JSSDK 分享接口,调用没反应 4、uniapp中调用微信jssdk 微信朋友

2023-12-08
java反射,java反射调用方法

2023-01-04
js开启调试,js浏览器调试

本文目录一览: 1、如何使用firefox进行网页js调试 2、如何调试JS? 3、如何进行js的debug 4、怎么在ie里打开javascript调试 如何使用firefox进行网页js调试 1、

2023-12-08
反射java,反射java调用方法

2022-12-01
js代码页面按钮没有反应(jsp提交按钮没反应)

本文目录一览: 1、js 点击按钮没反应 2、js代码运行点击按钮没反应 3、jsp页面点击button没有反应 4、js里button点了没反应? 5、js中按钮点击没有反应 6、有的时候点击网页上

2023-12-08
java调试jar包(java调用jar包)

2022-11-12
js调试技巧大全,js调试工具和方法如何使用

本文目录一览: 1、JavaScript如何调试有哪些建议和技巧附五款有用的调试工具 2、如何进行html调试和js脚本调试 3、有哪些 JS 调试技巧 4、有哪些 JS 调试技巧? 5、如何调试JS

2023-12-08
uniapp调试js,uniapp调试工具

2022-11-24
反编译java,反编译java游戏

2023-01-04
关于cocos2dxjsb调试的信息

本文目录一览: 1、cocos2dx 可以使用js开发吗 2、cocos2dx怎么用 3、cocos2dx3.10 怎么运行cocos2dx库 4、cocos2dx 2.2.1工程编译android版

2023-12-08