阅读:1737回复:4
wowocock:请看看!
szMsg0 db \"Hey,Hope U enjoy it!\",0
;;----------------------------------------- __Start: invokeInitCommonControls call delta delta: pop ebp ;得到delta地址 sub ebp,offset delta ;因为在其他程序中基址可能不是默认的所以需要重定位 mov dword ptr [ebp+offset appBase],ebp ;呵呵仔细想想 mov ecx,[esp] ;返回地址 xor edx,edx getK32Base: dec ecx ;逐字节比较验证 mov dx,word ptr [ecx+IMAGE_DOS_HEADER.e_lfanew] ;就是ecx+3ch test dx,0f000h ;Dos Header+stub不可能太大,超过4096byte jnz getK32Base ;加速检验 cmp ecx,dword ptr [ecx+edx+IMAGE_NT_HEADERS.OptionalHeader.ImageBase] jnz getK32Base ;看Image_Base值是否等于ecx即模块起始值, mov [ebp+offset k32Base],ecx ;如果是,就认为找到kernel32的Base值 lea edi,[ebp+offset aGetModuleHandle] lea esi,[ebp+offset lpApiAddrs] 我不太明白ecx中存的是什么内容,就不知道减一是作什么用的,还有我看了下pe文件头的资料上还是不明白这个的用意! 还有一点不明白,4096不是1000H吗,为什么是0F000H呢,(以前汇编没学好) 最好能说的详细一点,谢谢你了! |
|
|
沙发#
发布于:2004-05-14 09:09
我不太明白ecx中存的是什么内容,就不知道减一是作什么用的,还有我看了下pe文件头的资料上还是不明白这个的用意!
因为你的进程由PELOADER加载,而该PELOADER至少在WINDOWS下是位于KERNEL32中的,也就是说你进程结束的时候返回地址是位于KERNEL32中的某个地方,ECX中的[esp]就是该返回地址,一定在KERNEL32中. 所以你可以从该地址开始向前搜索直到找到KERNEL32的PE头为止. test dx,0f000h 表示屏蔽低12位,对齐到4K而已. |
|
|
板凳#
发布于:2004-05-15 20:16
高手,真的是高手!
|
|
|
地板#
发布于:2004-05-15 20:46
getK32Base:
dec ecx ;逐字节比较验证 mov dx,word ptr [ecx+IMAGE_DOS_HEADER.e_lfanew] ;就是ecx+3ch test dx,0f000h ;Dos Header+stub不可能太大,超过4096byte jnz getK32Base ;加速检验 能给我说明一下,内存中的存放是什么样的吗,我不太明白 test dx,0f000h,是这句话你说是对齐,我不太明白内存中的格式是什么样的 |
|
|
地下室#
发布于:2004-05-23 17:10
看来的确是高手。
|
|
|