Cheat Engine Forum Index Cheat Engine
The Official Site of Cheat Engine
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 


[Feature request] System date/time spoofing

 
Post new topic   Reply to topic    Cheat Engine Forum Index -> Cheat Engine
View previous topic :: View next topic  
Author Message
Polynomial
Grandmaster Cheater
Reputation: 5

Joined: 17 Feb 2008
Posts: 524
Location: Inside the Intel CET shadow stack

PostPosted: Sat Aug 30, 2025 10:55 pm    Post subject: [Feature request] System date/time spoofing Reply with quote

It'd be really useful to be able to spoof the system date & time. Naturally we could manually go through and hook the GetSystemTime, GetSystemTimeAsFileTime, GetLocalTime, and similar APIs by hand, but having a convenient feature to spoof the time to a fixed (unchanging) time, fixed offset (add or subtract a timespan), or locked between a monotonic range (i.e. specify two datetime values to always loop between) would be significantly more convenient. This could be implemented as a companion feature to speedhack.

Quite a few games have offline events tied to specific dates and times, so being able to stay within them would be very useful. For example, D2R's terror zones change every hour, and when playing offline the zones are based on the local system time being fed into a lookup table, so by hooking the time APIs it would allow a player to loop over the same zone over and over.

The usual advice I see is to "simply" change the system's date/time by hand, but this breaks TLS timestamp validation globally once your time skew goes outside the tolerance range, so it breaks most network communications. This would be particularly problematic for games that have seasonal events, since you'd be changing your system time by many months and thus guarantee that the TLS validation would break.
Back to top
View user's profile Send private message
lux
How do I cheat?
Reputation: 0

Joined: 28 Mar 2016
Posts: 7

PostPosted: Mon Sep 08, 2025 1:04 pm    Post subject: Reply with quote

There's established third party software for this like RunAsDate(64). Maybe TimeTweaker.
Back to top
View user's profile Send private message
AylinCE
Grandmaster Cheater Supreme
Reputation: 37

Joined: 16 Feb 2017
Posts: 1516

PostPosted: Mon Sep 08, 2025 3:54 pm    Post subject: This post has 1 review(s) Reply with quote

I think I can code this with the CE and "runCommand()" command.

The only question is: Should I make it a GUI (form) with edit boxes and buttons that accept and apply loops and time interval inputs?

Okay, I'll do that.

EDIT:

This seems to be working fine.

Code:
if dtmForm1 then dtmForm1.Destroy() dtmForm1=nil end
DP1=getScreenDPI()/96
dtmForm1=createForm()
dtmForm1.height=200*DP1 dtmForm1.width=295*DP1 dtmForm1.left=490*DP1 dtmForm1.top=300*DP1
dtmForm1.PopupMode=0 dtmForm1.caption="By AylinCE Trainers"
dtmForm1.Position="poDesktopCenter" dtmForm1.ShowInTaskBar="stAlways"
dtmForm1.BorderStyle="bsSingle"
--[==[
dtmForm1.BorderStyle="bsNone"
dtmForm1.setLayeredAttributes(0x000100, 255, LWA_COLORKEY | LWA_ALPHA )
dtmForm1.Color=0x000100
Object.OnMouseDown=function() dtmForm1.DragNow() end
--]==]
-------------------------
local dTbl = {}
----------------------- dTbl.nwLbl1 ----- 
dTbl.nwLbl1=createLabel(dtmForm1)
dTbl.nwLbl1.AutoSize=false
dTbl.nwLbl1.height=20*DP1 dTbl.nwLbl1.width=65*DP1 dTbl.nwLbl1.left=5*DP1 dTbl.nwLbl1.top=36*DP1
dTbl.nwLbl1.caption="NewDate: "
dTbl.nwLbl1.alignment="taLeftJustify"
dTbl.nwLbl1.Font.Style="fsBold" dTbl.nwLbl1.Font.Size=-14*DP1
-----------------------
----------------------- dTbl.nwEdt1 ----- 
dTbl.nwEdt1=createEdit(dtmForm1)
dTbl.nwEdt1.AutoSize=false
dTbl.nwEdt1.height=23*DP1 dTbl.nwEdt1.width=24*DP1 dTbl.nwEdt1.left=75*DP1 dTbl.nwEdt1.top=34*DP1
dTbl.nwEdt1.text=""
dTbl.nwEdt1.alignment="taLeftJustify"
dTbl.nwEdt1.Font.Style="fsBold" dTbl.nwEdt1.Font.Size=0*DP1
-----------------------
----------------------- dTbl.nwEdt2 ----- 
dTbl.nwEdt2=createEdit(dtmForm1)
dTbl.nwEdt2.AutoSize=false
dTbl.nwEdt2.height=23*DP1 dTbl.nwEdt2.width=24*DP1 dTbl.nwEdt2.left=105*DP1 dTbl.nwEdt2.top=34*DP1
dTbl.nwEdt2.text=""
dTbl.nwEdt2.alignment="taLeftJustify"
dTbl.nwEdt2.Font.Style="fsBold" dTbl.nwEdt2.Font.Size=0*DP1
-----------------------
----------------------- dTbl.nwEdt3 ----- 
dTbl.nwEdt3=createEdit(dtmForm1)
dTbl.nwEdt3.AutoSize=false
dTbl.nwEdt3.height=23*DP1 dTbl.nwEdt3.width=50*DP1 dTbl.nwEdt3.left=135*DP1 dTbl.nwEdt3.top=34*DP1
dTbl.nwEdt3.text=""
dTbl.nwEdt3.alignment="taLeftJustify"
dTbl.nwEdt3.Font.Style="fsBold" dTbl.nwEdt3.Font.Size=0*DP1
-----------------------
----------------------- dTbl.nwEdt4 ----- 
dTbl.nwEdt4=createEdit(dtmForm1)
dTbl.nwEdt4.AutoSize=false
dTbl.nwEdt4.height=23*DP1 dTbl.nwEdt4.width=24*DP1 dTbl.nwEdt4.left=195*DP1 dTbl.nwEdt4.top=34*DP1
dTbl.nwEdt4.text=""
dTbl.nwEdt4.alignment="taLeftJustify"
dTbl.nwEdt4.Font.Style="fsBold" dTbl.nwEdt4.Font.Size=0*DP1
-----------------------
----------------------- dTbl.nwEdt5 ----- 
dTbl.nwEdt5=createEdit(dtmForm1)
dTbl.nwEdt5.AutoSize=false
dTbl.nwEdt5.height=23*DP1 dTbl.nwEdt5.width=24*DP1 dTbl.nwEdt5.left=225*DP1 dTbl.nwEdt5.top=34*DP1
dTbl.nwEdt5.text=""
dTbl.nwEdt5.alignment="taLeftJustify"
dTbl.nwEdt5.Font.Style="fsBold" dTbl.nwEdt5.Font.Size=0*DP1
-----------------------
----------------------- dTbl.nwLbl2 ----- 
dTbl.nwLbl2=createLabel(dtmForm1)
dTbl.nwLbl2.AutoSize=false
dTbl.nwLbl2.height=23*DP1 dTbl.nwLbl2.width=24*DP1 dTbl.nwLbl2.left=255*DP1 dTbl.nwLbl2.top=34*DP1
dTbl.nwLbl2.caption="00"
dTbl.nwLbl2.alignment="taLeftJustify"
dTbl.nwLbl2.Font.Style="fsBold" dTbl.nwLbl2.Font.Size=-18*DP1
-----------------------
----------------------- dTbl.nwLbl3 ----- 
dTbl.nwLbl3=createLabel(dtmForm1)
dTbl.nwLbl3.AutoSize=false
dTbl.nwLbl3.height=20*DP1 dTbl.nwLbl3.width=97*DP1 dTbl.nwLbl3.left=5*DP1 dTbl.nwLbl3.top=70*DP1
dTbl.nwLbl3.caption="Max Progress:"
dTbl.nwLbl3.alignment="taLeftJustify"
dTbl.nwLbl3.Font.Style="fsBold" dTbl.nwLbl3.Font.Size=-15*DP1
-----------------------
----------------------- dTbl.startDT ----- 
dTbl.startDT=createButton(dtmForm1)
dTbl.startDT.AutoSize=false
dTbl.startDT.height=25*DP1 dTbl.startDT.width=95*DP1 dTbl.startDT.left=105*DP1 dTbl.startDT.top=100*DP1
dTbl.startDT.caption="Start New Date"
dTbl.startDT.Font.Style="fsBold" dTbl.startDT.Font.Size=0*DP1
-----------------------
----------------------- dTbl.nwEdt6 ----- 
dTbl.nwEdt6=createEdit(dtmForm1)
dTbl.nwEdt6.AutoSize=false
dTbl.nwEdt6.height=23*DP1 dTbl.nwEdt6.width=40*DP1 dTbl.nwEdt6.left=105*DP1 dTbl.nwEdt6.top=70*DP1
dTbl.nwEdt6.text=""
dTbl.nwEdt6.alignment="taLeftJustify"
dTbl.nwEdt6.Font.Style="fsBold" dTbl.nwEdt6.Font.Size=0*DP1
-----------------------
----------------------- dTbl.nwEdt7 ----- 
dTbl.nwEdt7=createEdit(dtmForm1)
dTbl.nwEdt7.AutoSize=false
dTbl.nwEdt7.height=23*DP1 dTbl.nwEdt7.width=48*DP1 dTbl.nwEdt7.left=236*DP1 dTbl.nwEdt7.top=70*DP1
dTbl.nwEdt7.text=""
dTbl.nwEdt7.alignment="taLeftJustify"
dTbl.nwEdt7.Font.Style="fsBold" dTbl.nwEdt7.Font.Size=0*DP1
-----------------------
----------------------- dTbl.nwLbl4 ----- 
dTbl.nwLbl4=createLabel(dtmForm1)
dTbl.nwLbl4.AutoSize=false
dTbl.nwLbl4.height=20*DP1 dTbl.nwLbl4.width=81*DP1 dTbl.nwLbl4.left=157*DP1 dTbl.nwLbl4.top=70*DP1
dTbl.nwLbl4.caption="Max Cycle:"
dTbl.nwLbl4.alignment="taLeftJustify"
dTbl.nwLbl4.Font.Style="fsBold" dTbl.nwLbl4.Font.Size=-15*DP1
-----------------------
----------------------- dTbl.nwLbl5 ----- 
dTbl.nwLbl5=createLabel(dtmForm1)
dTbl.nwLbl5.AutoSize=false
dTbl.nwLbl5.height=20*DP1 dTbl.nwLbl5.width=285*DP1 dTbl.nwLbl5.left=5*DP1 dTbl.nwLbl5.top=135*DP1
dTbl.nwLbl5.caption="Original Time: ..."
dTbl.nwLbl5.alignment="taCenter"
dTbl.nwLbl5.Font.Style="fsBold" dTbl.nwLbl5.Font.Size=-15*DP1
-----------------------
----------------------- dTbl.startDT1 ----- 
dTbl.startDT1=createButton(dtmForm1)
dTbl.startDT1.AutoSize=false
dTbl.startDT1.height=25*DP1 dTbl.startDT1.width=95*DP1 dTbl.startDT1.left=105*DP1 dTbl.startDT1.top=165*DP1
dTbl.startDT1.caption="Original Time"
dTbl.startDT1.Font.Style="fsBold" dTbl.startDT1.Font.Size=0*DP1
-----------------------
----------------------- dTbl.nwLbl6 ----- 
dTbl.nwLbl6=createLabel(dtmForm1)
dTbl.nwLbl6.AutoSize=false
dTbl.nwLbl6.height=24*DP1 dTbl.nwLbl6.width=285*DP1 dTbl.nwLbl6.left=5*DP1 dTbl.nwLbl6.top=5*DP1
dTbl.nwLbl6.caption="CE Time Manipulation"
dTbl.nwLbl6.alignment="taCenter"
dTbl.nwLbl6.Font.Style="fsBold" dTbl.nwLbl6.Font.Size=-18*DP1
-----------------------
for i=1, 5 do dTbl["nwEdt"..i].ShowHint=true end
dTbl.nwEdt1.TextHint="MM" dTbl.nwEdt2.TextHint="DD"
dTbl.nwEdt3.TextHint="YYYY" dTbl.nwEdt4.TextHint="HH"
dTbl.nwEdt5.TextHint="mm"
--############################################################################--
-- Disables Windows time synchronization services to allow manual time
function offTimeBroker()
runCommand([[powershell -Command "Stop-Service TimeBrokerSvc"]], true)
runCommand([[powershell -Command "Set-Service TimeBrokerSvc -StartupType Disabled"]], true)
runCommand([[powershell -Command "schtasks /Change /TN '\Microsoft\Windows\Time Synchronization\SynchronizeTime' /Disable"]], true)
runCommand([[powershell -Command "w32tm /config /update /manualpeerlist:'' /syncfromflags:NO"]], true)
runCommand([[powershell -Command "Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Config' -Name 'AnnounceFlags' -Value 5"]], true)
end

-- Restores Windows time synchronization services to default state
function onTimeBroker()
runCommand([[powershell -Command "Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Parameters' -Name Type -Value 'NT5DS'"]], true)
runCommand([[powershell -Command "Set-Service w32time -StartupType Automatic"]], true)
runCommand([[powershell -Command "Start-Service w32time"]], true)
runCommand([[powershell -Command "Set-Service TimeBrokerSvc -StartupType Manual"]], true)
runCommand([[powershell -Command "Start-Service TimeBrokerSvc"]], true)
runCommand([[powershell -Command "schtasks /Change /TN '\Microsoft\Windows\Time Synchronization\SynchronizeTime' /Enable"]], true)
runCommand([[powershell -Command "w32tm /config /update /manualpeerlist:'time.windows.com' /syncfromflags:MANUAL"]], true)
runCommand([[powershell -Command "w32tm /resync"]], true)
end
--############################################################################--
-- Destroys existing timers if they exist
if realTimeTimer then realTimeTimer.Destroy() realTimeTimer=nil end
if revertTimer then revertTimer.Destroy() revertTimer=nil end

-- Timer to simulate and display original system time (before manipulation)
realTimeTimer = createTimer()
realTimeTimer.Interval = 1000
realTimeTimer.Enabled=true

-- Timer to count down until system time is restored
revertTimer = createTimer()
revertTimer.Interval = 1000
revertTimer.Enabled=false

local revertCountdown = 0
-- Stores the original system time before manipulation
local originalTimestamp = os.time()
-- Stores system uptime at the moment of manipulation
local tickAtStart = getTickCount()
local startTimestamp = originalTimestamp
-- Placeholder for cycle input (how many times to repeat manipulation)
local cycleInput = dTbl.nwEdt7.Text

dTbl.startDT.OnClick=function()
  -- EditBox 1: Month (1–12)
  local M = tonumber(dTbl.nwEdt1.Text) or 1
  if M < 1 or M > 12 then M = 1 end
  -- EditBox 2: Day (1–31)
  local D = tonumber(dTbl.nwEdt2.Text) or 1
  if D < 1 or D > 31 then D = 1 end
  -- EditBox 3: Year (e.g. 2025)
  local Y = tonumber(dTbl.nwEdt3.Text) or 2025
  if Y < 2000 then Y = 2025 end
 -- EditBox 4: Hour (0–23)
  local H = tonumber(dTbl.nwEdt4.Text) or 0
  if H < 0 or H > 23 then H = 0 end
  -- EditBox 5: Minute (0–59)
  local Min = tonumber(dTbl.nwEdt5.Text) or 0
  if Min < 0 or Min > 59 then Min = 0 end
    -- Disable time protection services
  offTimeBroker()
  -- Apply new system time
  local newDate = string.format("%02d/%02d/%04d %02d:%02d", M, D, Y, H, Min)
  runCommand([[powershell -Command "Set-Date -Date ']]..newDate..[['"]], true)

    -- EditBox 6: Delay in minutes before restoring original time
  local delayMin = tonumber(dTbl.nwEdt6.Text)
  if not delayMin or delayMin < 0 then delayMin = 0 end
  if delayMin > 0 then
    revertCountdown = delayMin * 60
    revertTimer.Enabled = true
  end

  -- EditBox 7: Number of manipulation cycles
  -- "" = infinite loop, "1" = single execution, "4" = repeat 4 times
  local cycleInput = dTbl.nwEdt7.Text
  maxCycle = (cycleInput == "") and -1 or tonumber(cycleInput)
  if not maxCycle or maxCycle < 1 then maxCycle = 1 end
  cycleCount = 0
end

-- Counts down and restores system time when timer expires
revertTimer.OnTimer = function()
  if revertCountdown > 0 then
    revertCountdown = revertCountdown - 1
    dTbl.nwLbl2.Caption = tostring(revertCountdown)  -- Shows remaining seconds
  else
    revertTimer.Enabled = false
    onTimeBroker()  -- Re-enable time sync
  end
end

-- Formats time table into readable string
function formatTime(t)
  return string.format("%02d.%02d.%04d %02d:%02d:%02d", t.day, t.month, t.year, t.hour, t.min, t.sec)
end

-- Updates label with simulated original time (based on uptime, not system c
realTimeTimer.OnTimer = function()
  local success, result = pcall(function()
    local elapsedSec = (getTickCount() - tickAtStart) / 1000
    local t = os.date("*t", originalTimestamp + math.floor(elapsedSec))
    return formatTime(t)
  end)

  if success then
    dTbl.nwLbl5.Caption = "Original Time: " .. result
  else
    dTbl.nwLbl5.Caption = "Original Time: [error]"
  end
end

-- Manually restores time synchronization and stops countdown
dTbl.startDT1.OnClick=function()
    revertTimer.Enabled = false
    onTimeBroker()
    dTbl.nwLbl2.Caption = "00"
end


Enjoy it!



eks01.PNG
 Description:
 Filesize:  34.11 KB
 Viewed:  128 Time(s)

eks01.PNG



_________________
Hi Hitler Different Trainer forms for you!
https://forum.cheatengine.org/viewtopic.php?t=619279
Enthusiastic people: Always one step ahead
Do not underestimate me Master: You were a beginner in the past
Back to top
View user's profile Send private message Visit poster's website MSN Messenger
Display posts from previous:   
Post new topic   Reply to topic    Cheat Engine Forum Index -> Cheat Engine All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group

CE Wiki   IRC (#CEF)   Twitter
Third party websites