![]() |
#2
朱三哥2012-12-12 13:28
|

.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
这个可以找到 但是.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 <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);
}

#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);
}
#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 编辑 ]