首页
社区
课程
招聘
关于汇编读取自身末尾问题
发表于: 2007-6-8 16:44 4733

关于汇编读取自身末尾问题

2007-6-8 16:44
4733
在DELPHI下可以好简单的读取自身尾部的信息,现在用汇编写出来,不知怎么不成功了,可以读取另一个文件尾部信息,可是就不能读取自身尾部信息,打开自己时建立内存就出错了.希望各位高手帮忙看下,那里出错了或是少了那些重要代码.
代码如下:
DELPHI

var
f: file;
each_size: array[1..2] of char;
str: array[1..255] of char;
Setstr: string;
len, i: integer;
begin
FileMode := 0; //设置文件模式,否则会不允许修改
assignfile(f, paramstr(0)); //打开自己
Reset(f, 1);
seek(f, filesize(f) - 1); //移动到末尾-1,因为最后一个字节记录的是配置长度,不是配置数据
BlockRead(f, each_size, 1); //读出长度
len :=ord(each_size[i]); //计算总长度
seek(f, filesize(f) - 1 - len); //将指针移动到配置数据开始的地方
for i := 1 to 255 do
str[i] := ' ';
blockread(f, str, len); //读出所有配置数据
setstr:=str;
messagebox(0,pchar(setstr),'hehe',mb_ok);
CloseFile(f); //关闭
end;

end.

MASM:
.386
.model flat,stdcall
option casemap:none
include     windows.inc
include     user32.inc
includelib   user32.lib
include     kernel32.inc
includelib   kernel32.lib

MapViewFile PROTO :LPSTR ;函数声明

.data?
hFile dd ?
pMapView dd ?
hMapView dd ?
szU db 156 dup(?)       ;这里是你自己设定要修改的内容!
sza dd ?

szFileName db 156 dup(?)

.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;读取尾部信息,
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MapViewFile proc uses ebx esi edi,lpProcessAddress:LPSTR
mov edi,lpProcessAddress   ;获得初始偏移地址
add edi,sza    ;获取字符串地址
invoke lstrcpy,addr szU,edi   ;拷贝替换
ret
MapViewFile endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke    GetModuleFileName, NULL, addr szFileName, MAX_PATH
invoke CreateFile,addr szFileName,GENERIC_READ or GENERIC_WRITE,\ ;打开它
FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,OPEN_EXISTING, \         
FILE_ATTRIBUTE_NORMAL,NULL               
.if eax!=INVALID_HANDLE_VALUE
mov hFile, eax ;保存句柄         
invoke CreateFileMapping,hFile,NULL,PAGE_READWRITE,0,0,NULL ;建立内存共享
.if eax!=NULL
mov hMapView,eax ;保存句柄
invoke MapViewOfFile,hMapView,FILE_MAP_WRITE,0,0,NULL ;读取内存共享
.if eax!=NULL
mov pMapView,eax ;保存句柄
invoke    SetFilePointer,hFile,-50,0,FILE_END
mov sza,eax
invoke MapViewFile,pMapView   ;修改服务端内存里内容
.endif
invoke UnmapViewOfFile,pMapView ;解除文件映射
.endif
invoke CloseHandle,hMapView   ;关闭内存映射文件
.endif
invoke CloseHandle,hFile     ;关闭文件
invoke MessageBox,0,addr szU,0,MB_OK
invoke ExitProcess,eax
end start

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 189
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
打开的时候只设置读取权限试试
2007-6-8 22:01
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个我也试了,这样是可以建内存,可是读取还是没有成功,有那位写个这样的代码共享下,让小弟参考参考
2007-6-8 22:36
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
你读取的是不是exe的尾部附加数据?尾部的附加数据用用映像是不会被加载的。要使用ReadFile才行。
2007-6-10 10:05
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢版主的提醒,现在问题解决了.
代码写成这样就行,呵呵
    invoke    SetFilePointer, hFile,-10, 0,FILE_END  
    invoke    ReadFile, hFile, addr szU,10, addr dwNumBytes, NULL
2007-6-10 12:33
0
游客
登录 | 注册 方可回帖
返回
//