很奇怪的问题,求解答
程序代码:
.386 .model flat, stdcall option casemap :none include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib .data @dwret dd ? szcaption db 'xbn',0 sztext db '找到KERNEL32的PE标志!',0 sztext1 db '找到KERNEL32的MZ的标志',0 .code start: mov edi,[esp] and edi,0ffff0000h .repeat .if WORD ptr [edi]==IMAGE_DOS_SIGNATURE invoke MessageBox,NULL,offset sztext1,offset szcaption,MB_OK mov esi,edi add esi,[esi+003ch] .if WORD ptr [esi]==IMAGE_NT_SIGNATURE mov @dwret,edi invoke MessageBox,NULL,offset sztext,offset szcaption,MB_OK .break .endif .endif sub edi,010000h .break .if edi<070000000h .until FALSE mov eax,@dwret end start这个可以找到 但是
程序代码:
#include "windows.h" #include <stdio.h> #include "stdlib.h" void main(){ int a=1; _asm{ mov esi,[ebp+24] //因为在调用main函数的时候 是creatprocess 函数建立进程,利用这个栈的地址来取得creatprocess进程的地址,也就是DLL的地址空间了 and esi,0xffff0000 //页对齐 mmm: cmp dword ptr [esi],0x4d5a //比对MZ标志 用这个判定是否DLL文件的开始基地址 jz xxx sub esi,0x1000 //以页为单位进行搜索 jmp mmm xxx: mov [ebp-4],esi //将寻到的基地址值给变量a } printf("%d",a); }这个就会出错 为什么呢 上面C语言的 mov esi,[ebp+24] 这段 改成 mov esi,[esp]也是不行
程序代码:
#include "windows.h" #include <stdio.h> #include "stdlib.h" void main(){ int a=1; _asm{ mov esi,[ebp+4] //因为在调用main函数的时候 是creatprocess 函数建立进程,利用这个栈的地址来取得creatprocess进程的地址,也就是DLL的地址空间了 and esi,0xffff0000 //页对齐 mmm: cmp word ptr [esi],IMAGE_DOS_SIGNATURE //比对MZ标志 用这个判定是否DLL文件的开始基地址 jz xxx sub esi,0x10000 //以页为单位进行搜索 jmp mmm xxx: mov [ebp-4],esi //将寻到的基地址值给变量a } printf("%d",a); }
哈哈 我终于弄出来了
[ 本帖最后由 朱三哥 于 2012-12-12 16:09 编辑 ]