首页
社区
课程
招聘
[例子]利用OD的BUG实现反调试
发表于: 2005-9-27 16:53 7413

[例子]利用OD的BUG实现反调试

2005-9-27 16:53
7413

根据Spring.W在下贴中的提示
http://bbs.pediy.com/showthread.php?s=&threadid=17132
我用RadASM写了个dll加入了异常处理,只要在你的源程序中加入
include system.inc
includelib system.lib
然后将system.dll放在你程序目录下,编译好你的程序用OD载入,发生异常时OD不能处理这个异常,而DLL中异常处理程序得不到处理权,程序会退出。如果不用OD调试,DLL中的异常处理程序处理异常好,程序能继续运行,各位大侠根据这个原理加入自己的代码来反调试
;***********************system.asm*******************************
.386
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
seh                        PROTO ;异常处理过程
TestFunc                        PROTO

.data
app                db 'SEH in DLL',0
msg1                db 'DLL_PROCESS_ATTACH',0
msg2                db 'DLL_PROCESS_DETACH',0
msg3                db 'DLL_THREAD_ATTACH',0
msg4                db 'DLL_THREAD_DETACH',0
msg5                db 'DLL_TESTFUNC',0
msg6                db 'DLL_EXCEPTION_PROC',0
num                dd 0
flag                dd 3
.code
;***********************DLL入口过程*******************************
DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
        mov eax,reason
        .if eax == DLL_PROCESS_ATTACH
                push offset seh
                call SetUnhandledExceptionFilter
                mov eax,200h
                cdq
fine:       
                div num
                invoke MessageBox,NULL,addr msg1,addr app,MB_OK
           .elseif eax == DLL_PROCESS_DETACH
                invoke MessageBox,NULL,addr msg2,addr app,MB_OK
                xor eax,eax
                ret
        .elseif eax == DLL_THREAD_ATTACH
                invoke MessageBox,NULL,addr msg3,addr app,MB_OK
        .elseif eax == DLL_THREAD_DETACH
                invoke MessageBox,NULL,addr msg4,addr app,MB_OK
                xor eax,eax
                ret
        .endif
       mov  eax,TRUE
       ret
DllEntry Endp
;*************************导出函数*******************************
TestFunc proc para:DWORD
    invoke MessageBox,NULL,addr msg5,addr app,MB_OK       
    ret 4
TestFunc endp
;***********************异常处理过程*******************************
seh proc
        .if flag
                mov num,1
                dec flag
                invoke MessageBox,NULL,addr msg6,addr app,MB_OK
                mov eax,-1
                ret
        .else
                xor eax,eax
                ret
        .endif
seh endp
;*******************************************************************
End DllEntry

;***********************system.def*******************************
LIBRARY   SYSTEM
EXPORTS   TestFunc

;***********************system.inc*******************************
TestFunc        PROTO
附件:system.rar


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 213
活跃值: (96)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
早1年出这个文章能好点,早被N多人用过的技术了
2005-9-27 17:01
0
雪    币: 233
活跃值: (130)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
严重学习
2005-9-27 21:51
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
GOOD!
2005-9-27 23:04
0
雪    币: 271
活跃值: (90)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
那位给翻译一下,比如用DELPHI举个例子--嘿嘿,ASM看不懂
2005-9-28 08:15
0
雪    币: 216
活跃值: (370)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
严重怀疑,你这个根本就不能运行。用个exe加载你的dll,不调试时也运行不了。你放个exe例子吧。不调试也运行不了的也叫反调试??
2005-9-28 09:34
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
7
我想楼主搞错,Dll中的异常用OD没法调试并不是Dll本身的问题,而是楼主用了SetUnhandledExceptionFilter作为异常句柄,这个异常本身就可以让OD无法进行调试下去,即使不用DLL用EXE也会出现同样问题(不用插件及去掉这个反跟踪),不过这个异常可以用一个UnExcept的插件搞定就可以用OD来调试了,不信楼主可以用线性的SHE异常试试,OD可以顺利通过这个异常进入到EXE入口处(我已测试过,没问题)。
2005-9-28 10:19
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
8
SetUnhandledExceptionFilter的问题。

操作系统处理异常,先找SEH,再搜索FS0链表,最后是SetUnhandledExceptionFilter,这个函数在调试器环境下特殊,用那个xx插件把操作系统对这个函数的特殊处理过滤掉就OK了。
2005-9-28 12:54
0
雪    币: 212
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
最初由 云重 发布
早1年出这个文章能好点,早被N多人用过的技术了

我才发现是我看到的是个老贴子,我落伍了
2005-9-28 15:25
0
雪    币: 212
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
最初由 goldenegg 发布
严重怀疑,你这个根本就不能运行。用个exe加载你的dll,不调试时也运行不了。你放个exe例子吧。不调试也运行不了的也叫反调试??

我只在98下测试通过,放个EXE上来,将它和system.dll放在一个目录,运行程序后按运行按钮载入system.dll附件:loaddll.rar
2005-9-28 15:26
0
雪    币: 212
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
最初由 小虾 发布
我想楼主搞错,Dll中的异常用OD没法调试并不是Dll本身的问题,而是楼主用了SetUnhandledExceptionFilter作为异常句柄,这个异常本身就可以让OD无法进行调试下去,即使不用DLL用EXE也会出现同样问题(不用插件及去掉这个反跟踪),不过这个异常可以用一个UnExcept的插件搞定就可以用OD来调试了,不信楼主可以用线性的SHE异常试试,OD可以顺利通过这个异常进入到EXE入口处(我已测试过,没问题)。

是的,不管是程序还是动态载入产生异常的DLL,OD都无法调试,我试试用自定义异常结构来产生异常,不用SetUnhandledExceptionFilter
2005-9-28 15:29
0
雪    币: 212
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
最初由 nbw 发布
SetUnhandledExceptionFilter的问题。

操作系统处理异常,先找SEH,再搜索FS0链表,最后是SetUnhandledExceptionFilter,这个函数在调试器环境下特殊,用那个xx插件把操作系统对这个函数的特殊处理过滤掉就OK了。

过滤是指让特殊处理通过还是忽略?
2005-9-28 15:30
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
13
最初由 aboil 发布

我只在98下测试通过,放个EXE上来,将它和system.dll放在一个目录,运行程序后按运行按钮载入system.dll附件:loaddll.rar

经过98和XP系统测试,XP好象是不能运行,98系统则没有问题。
2005-9-28 15:43
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
14
最初由 aboil 发布

过滤是指让特殊处理通过还是忽略?

是经过特殊处理。
楼主可以看看这篇文章:
http://bbs.pediy.com/showthread.php?s=&threadid=9023
2005-9-28 15:45
0
雪    币: 212
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
谢谢
2005-9-28 18:41
0
游客
登录 | 注册 方可回帖
返回
//