| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 675 人关注过本帖
标题:很奇怪的问题,求解答
只看楼主 加入收藏
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
结帖率:62.07%
收藏
已结贴  问题点数:20 回复次数:4 
很奇怪的问题,求解答
程序代码:
.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 编辑 ]
2012-12-12 13:17
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
收藏
得分:0 
发错位置了 ,能不能放到汇编区去啊

哥,破你无线很难的,不要老是改,少看路由器上的灯,你会死啊
2012-12-12 13:28
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:10 
因为在调用main函数的时候 是creatprocess 函数建立进程,利用这个栈的地址来取得creatprocess进程的地址,也就是DLL的地址空间了

C语言的main之前有很多代码 是C运行时的 所以你上面的这个叙述不对。。。
2012-12-12 14:02
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
收藏
得分:0 
  在运行main 之前他要弄个 40个字节大小的栈空间然后 填充10个 cccccccc  然后就回去程序的基点 main 这个地方了 然后进入 main 里面开始执行程序
他上面怎么干的 我就不知道了
然后就开始设置 EBP和ESP 去了。我把ebp+56 还是运行部起来

哥,破你无线很难的,不要老是改,少看路由器上的灯,你会死啊
2012-12-12 14:50
suijishu
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:66
专家分:144
注 册:2012-12-1
收藏
得分:10 
膜拜大牛!!!膜拜大作!!!
2012-12-12 16:00
快速回复:很奇怪的问题,求解答
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037875 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved