好友
阅读权限30
听众
最后登录1970-1-1
|
本帖最后由 bester 于 2019-7-11 19:31 编辑
原理说明:GetLocalTime(系统时间),他的这个参数是一个记录着系统时间的一个指针,我们只需要修改里面包含的时间,大小是16个字节
参数类型:
Delphi:
_SYSTEMTIME = record
wYear: Word; //年
wMonth: Word; //月
wDayOfWeek: Word; //星期几
wDay: Word; //日
wHour: Word; //时
wMinute: Word; //分
wSecond: Word; //秒
wMilliseconds: Word; //毫秒
易语言:
.数据类型 精易_时间, 公开, , SYSTEMTIME
.成员 年, 短整数型, , "", wYear
.成员 月, 短整数型, , "", wMonth
.成员 星期, 短整数型, , "",
.成员 日, 短整数型, , "", wDay
.成员 时, 短整数型, , "", wHour
.成员 分, 短整数型, , "", wMinute
.成员 秒, 短整数型, , "", wSecond
.成员 毫, 短整数型, , "", wMilliseconds //短整数型=smallint 有符号16位,占2个字节,总共8个成员,所以8*2=16
ASMCode:
pushad //保护寄存器
pushfd //保护标志位
mov word ptr ss:[eax], 0x7E2 //年 7E2=2018年
mov word ptr ss:[eax+0x2], 0x7 //月 7=7月
mov word ptr ss:[eax+0x4], 0x4 //星期几 4=星期四
mov word ptr ss:[eax+0x6], 0xB //日 B=11日,B的10进制是11
mov word ptr ss:[eax+0x8], 0x11 // 时 11=17时,11的10进制是17
mov word ptr ss:[eax+0xA], 0x21 //分 21=33分
mov word ptr ss:[eax+0xC], 0x39 //秒 39=57秒
mov word ptr ss:[eax+0xE], 0x48 //毫 48=72毫秒
popfd //恢复标志位
popad //恢复寄存器
retn //返回
Hex: 60 9C 66 36 C7 00 E2 07 66 36 C7 40 02 07 00 66 36 C7 40 04 04 00 66 36 C7 40 06 0B 00 66 36 C7 40 08 11 00 66 36 C7 40 0A 21 00 66 36 C7 40 0C 39 00 66 36 C7 40 0E 48 00 9D 61 C3 //word版本,每次写2个字节 转成汇编就是上面的代码Hex:60 9C 36 C7 00 E2 07 07 00 36 C7 40 04 04 00 0B 00 36 C7 40 08 11 00 21 00 36 C7 40 0C 39 00 48 00 9D 61 C3 //Dword版本,每次写入4个字节,效率较高,共36个字节
易语言源码:需要精益模块,写内存字节集=writeprocessmemory,因为懒得用精益的写法,花里胡哨,直接用的API函数[Asm] 纯文本查看 复制代码 .版本 2
.程序集 窗口程序集_启动窗口
.子程序 _按钮1_被单击
.局部变量 pid, 整数型
.局部变量 hprocess, 整数型
.局部变量 apiaddr, 整数型
.局部变量 Bsize, 整数型
pid = 进程_名取ID (“取现行时间.exe”, )
hprocess = 进程_打开1 (pid)
apiaddr = GetProcAddress (LoadLibraryA (“KernelBase.dll”), “GetLocalTime”)
写内存字节集 (hprocess, apiaddr, 字节集_还原 (“609C36C700E207070036C7400404000B0036C740081100210036C7400C390048009D61C3”), 36, Bsize)
.子程序 字节集_还原, 字节集, 公开, 将一串十六进制文本还原为字节集。还原为字节集可以将默认的16进制文本转换成字节集。如“00BFAD00”可还原为{0,191,173,0}
.参数 原始16进制文本, 文本型, , 如“00BFAD00AFD4FD4F9E054F9FF91FC5FF2076FBAFDB071044”
.局部变量 字节集, 字节集
.局部变量 次数, 整数型
.局部变量 临时变量, 整数型
.变量循环首 (1, 取文本长度 (原始16进制文本), 2, 次数)
临时变量 = 进制_十六到十 (取文本中间 (原始16进制文本, 次数, 2))
字节集 = 字节集 + 到字节集 (到字节 (临时变量))
处理事件 ()
.变量循环尾 ()
返回 (字节集)
DELPHI源码:[Delphi] 纯文本查看 复制代码 var
Form1: TForm1;
asmcode:array [1..36]of string=('60','9C','36','C7','00' ,'E2' ,'07' ,'07' ,'00' ,'36' ,'C7' ,'40' ,'04' ,'04' ,'00' ,'0B' ,'00' ,'36', 'C7' ,'40' ,'08' ,'11' ,'00' ,'21' ,'00' ,'36' ,'C7' ,'40' ,'0C' ,'39' ,'00' ,'48' ,'00' ,'9D' ,'61' ,'C3');
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
apiaddr:Pointer;
pid:Integer;
Hprocess:Integer;
I:Integer;
ten:Integer;
wr:NativeUInt;
begin
apiaddr:=GetProcAddress(LoadLibrary('KernelBase.dll'),'GetLocalTime') ;
pid:=12324;
Hprocess:=OpenProcess(PROCESS_ALL_ACCESS,False,PID);
for I := 1 to 36 do
begin
ten:= StrToInt('$'+asmcode[i]) ;
WriteProcessMemory(Hprocess,Pointer(Integer(apiaddr)+i-1),Pointer(@ten),1,wr);
end;
end;
end.
最终效果:
|
免费评分
-
查看全部评分
|