在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虚拟机自动化脱壳的方法