anti trick Ⅱ -- InString

2008-02-23 09:17:14来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

by 来自轻院的狼[Immlep]

这个不是什么新鲜的东西,不过我还没有见过有人在壳中使用的,用这个来做anti,它比FindWindow强很多了,不过这些东西说出来后,以后就没什么,可能以后你一看到类似的anti你就会很清楚了,另外这个anti调用的函数过多,代码长,挺不好的,本文中的例子(InString )是我引用现成的代码的,只不过做了一下简单的修改。思路是使用GetWindow循环获取系统的窗口的标题,查看标题中是否包含了要查找的关键字,如果发现,就做坏事,这个来检测Ollydbg也挺好的,可以检测"- [CPU - ",这样的字样,另外因为Ollydbg调试的时候会把被调试程序的名称显示在Ollydbg的窗口中,所以我们也可以检测“-debugme.exe-[”这样的字符(debugme.exe为被调试程序的名称,你可以用GetFullFilename等函数来获取被加壳后程序的名称),当然最好先给这些字符加密一下了。。

还有你可以用InString来做不anti的其它事情,这样可以防止调试者在InString做手脚,另外这个anti调用的函数,你最好也让它干一些有用的东西,不要只拿来做anti,很容易被hook的:)

我测试了一下,anti效果还是良好的,什么修改版的Od都被干掉了(当然不保证以后),SoftICE的loader也不例外:)
[code]
searchtext PROC
;;;;;;获取系统中所有窗口的标题
invoke GetDesktopWindow
invoke GetWindow,eax,GW_CHILD
@1:
mov hwindow,eax
invoke GetWindowText,hwindow,ADDR buff,200
cmp eax,0
jz skip1
;lea edi,offset buff
push offset buff2 ;我们要查找的窗口标题中包含的关键字,如"- [CPU - "
push offset buff ;;找到的窗口的中标题
push 1 ;从第一个字符找
call _InString
add esp,0ch
;invoke InString,1,addr buff,addr buff2
cmp eax,0
jz @F
invoke PostMessage,hwindow,WM_QUIT,0,0 ;在壳中做坏事不要这样做,很容易被跟踪出来的,自己想点新鲜的。
;invoke MessageBox,NULL,addr szdbtext1,addr szdbtext1,MB_OK
skip1:
@@:
invoke GetWindow,hwindow,GW_HWNDNEXT
cmp eax,NULL
jne @1
jmp loc111
;;;;;;获取系统中所有窗口的标题


;;;;InString我处理了重定位问题,,可以在壳中使用!!!代码好长!!汗个!!!!
_InString:
jmp @F
StartPos dd 0
lpszString dd 0
lpszSubStr dd 0
lnStrng dd 0
lnSubSt dd 0
reg1 dd 0
reg2 dd 0
Byte1 byte 0
@@:
push eax
mov eax,DWORD PTR [ESP 8]
mov [EBP OFFSET StartPos],eax
pop eax

push eax
mov eax,DWORD PTR [ESP 0ch]
mov [EBP OFFSET lpszString],eax
pop eax

push eax
mov eax,DWORD PTR [ESP 10h]
mov [EBP OFFSET lpszSubStr],eax
pop eax

push esi
push edi
push ebx

.if [EBP OFFSET StartPos] < 1
mov eax, -2 ; set eax -2
jmp @@Get_Outa_Here ; exit if less than 1
.endif

dec [EBP OFFSET StartPos] ; correct to 0 based index

mov eax,[EBP OFFSET lpszString]
call _lstrlen ;;;;;把原来的lstrlen函数也干掉!!!
mov [EBP OFFSET lnStrng], eax
push eax
mov eax,[EBP OFFSET lpszSubStr]
call _lstrlen
mov [EBP OFFSET lnSubSt], eax
pop eax

sub eax, [EBP OFFSET lnSubSt] ; subtract substr len from main string

; The following order is important.

.if eax >= [EBP OFFSET lnStrng] ; the substring is greater than the main string
mov eax,0
jmp @@Get_Outa_Here
.elseif [EBP OFFSET StartPos] == eax ; startpos at the last position accepted
jmp Same_Size
.elseif [EBP OFFSET StartPos] > eax ; startpos greater than the last position accepted
mov eax, 0
jmp @@Get_Outa_Here
.elseif eax == 0 ; the two strings have the same size
jmp Same_Size
.endif

mov esi, [EBP OFFSET lpszSubStr] ; get 1st byte in substring
mov bl, [esi]

; -------------------------------------------------------
; set maximum count as main string length minus substring
; -------------------------------------------------------

mov ecx, [EBP OFFSET lpszString]
add ecx, [EBP OFFSET lnStrng]
sub ecx, [EBP OFFSET lnSubSt]
inc ecx

mov esi, [EBP OFFSET lpszString] ; main string address
add esi, [EBP OFFSET StartPos] ; add starting position to esi

cld ; read forward

@@L1s: ; 8 cycles on no 1st char match
mov al, [esi] ; 1
inc esi ; 1
cmp al, bl ; 1 find 1st substring byte
je @F ; 1 - 3 compare subsequent bytes to
@@L1r:
cmp esi, ecx ; 1
jne @@L1s ; 3 - 1

mov eax, 0 ; return zero and exit if
jmp @@Get_Outa_Here ; match not found in string

; ------------------------------------------------
; do the comparison, main string is already in esi

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:[webservices开发]配置XFire

下一篇:Reading Design Patterns