|
Cheat Engine The Official Site of Cheat Engine
|
View previous topic :: View next topic |
Author |
Message |
facecheats Newbie cheater Reputation: 0
Joined: 12 Jul 2015 Posts: 20
|
Posted: Mon Feb 08, 2016 11:15 am Post subject: I challenge you decompile my cetrainer |
|
|
I challenge you decompile my cetrainer, hope you succeed and show how you did.
Description: |
|
Download |
Filename: |
decompile my CETrainer.CETRAINER |
Filesize: |
40.57 KB |
Downloaded: |
458 Time(s) |
_________________
dved rvrdv vrevr rvrve |
|
Back to top |
|
|
atom0s Moderator Reputation: 198
Joined: 25 Jan 2006 Posts: 8516 Location: 127.0.0.1
|
|
Back to top |
|
|
hhhuut Grandmaster Cheater Reputation: 6
Joined: 08 Feb 2015 Posts: 607
|
Posted: Mon Feb 08, 2016 5:02 pm Post subject: |
|
|
And I thought the build-in protection of such CETRAINER/EXE files is good
|
|
Back to top |
|
|
Rydian Grandmaster Cheater Supreme Reputation: 31
Joined: 17 Sep 2012 Posts: 1358
|
Posted: Mon Feb 08, 2016 6:20 pm Post subject: |
|
|
Lua isn't compiled, it's gotta' be uncompressed and read properly at some point.
_________________
|
|
Back to top |
|
|
lolAnonymous Expert Cheater Reputation: 1
Joined: 19 Jul 2015 Posts: 154
|
Posted: Mon Feb 08, 2016 10:57 pm Post subject: |
|
|
Nice work...
Code: | function CreateTrainer()
local HackData = {};
function HackData:HacksData()
self.trainer.form.Caption = [[decompile my trainer test]]
self.trainer.title.Caption = [[decompile my trainer test]]
self.trainer.credits.Caption = [[ decompile my trainer test]]
self.hacktable = {
{'Attacker Far Range ',[[luacall(Aobswap('0F ?? 00 00 62 ?? 66 ?? ?? 62 ?? 46 ?? ?? 00 A0 D0 66 ?? ?? 0D ?? 00 00 60', '0F 00 00 00 62 ?? 66 ?? ?? 62 ?? 46 ?? ?? 00 A0 D0 66 ?? ?? 0D ?? 00 00 60'))]],[[]],[[HACK ACTIVATED]], 'false'},
{'Attacker Rapid ',[[luacall(Aobswap('0F ?? 00 00 62 ?? 66 ?? ?? 62 ?? 46 ?? ?? 00 A0 D0 66 ?? ?? 0D ?? 00 00 60', '0F ?? 00 00 62 ?? 66 ?? ?? 62 ?? 46 ?? ?? 00 A0 D0 66 ?? ?? 0D 00 00 00 60 '))]],[[]],[[HACK ACTIVATED]], 'false'},
{'x9 Damage ',[[luacall(Aobswap('D0 30 24 01 75 D6 D1 60 ?? ?? 66 ?? ?? 14',' D0 30 24 09 75 D6 D1 60 ?? ?? 66 ?? ?? 14 '))]],[[]],[[HACK ACTIVATED]], 'false'}
};
for i=1,#self.hacktable do
strings_add(self.listitems, self.hacktable[i][1]);
self.hackstatus[i] = false;
end
end
function HackData:Info()
self.activateall = false; -- State.
self.hackstatus = {};
self.trainer = {};
self.trainer.form = createForm(false);
self.trainer.form.onClose = function (sender) sender.hide(); closeCE(); end;
self.trainer.form.width = 600;
self.trainer.form.height = 320;
setProperty(self.trainer.form, 'Position', 'poScreenCenter');
setProperty(self.trainer.form, 'BorderIcons', '[biSystemMenu]');
setProperty(self.trainer.form, 'BiDiMode', 'bdLeftToRight');
self.trainer.credits = createLabel(self.trainer.form);
self.trainer.title = createLabel(self.trainer.form);
local FontHeight = getProperty(self.trainer.title, 'Font');
setProperty(FontHeight , 'Color', 0x000000FE);
setProperty(FontHeight , 'Style', '[fsBold]');
setProperty(FontHeight , 'Height', '20');
self.trainer.group = createGroupBox(self.trainer.form);
self.trainer.subtitle = createLabel(self.trainer.group);
local FontHeight = getProperty(self.trainer.subtitle, 'Font');
setProperty(FontHeight , 'Color', 0x00007F00);
setProperty(FontHeight , 'Style', '[fsBold]');
setProperty(FontHeight , 'Height', '16');
self.trainer.desctitle = createLabel(self.trainer.group);
local FontHeight = getProperty(self.trainer.desctitle, 'Font');
setProperty(FontHeight , 'Color', 0x00F21200);
self.trainer.desc = createLabel(self.trainer.group);
self.trainer.list = createListBox(self.trainer.group);
self.trainer.enable = createButton(self.trainer.group);
self.trainer.enableall = createButton(self.trainer.group);
local x,y = control_getSize(self.trainer.form);
self.trainer.credits.left = 5;
self.trainer.credits.top = y - 17;
self.trainer.title.left = 10;
self.trainer.title.top = 2.5;
self.trainer.group.width = math.floor(x * 0.965);
self.trainer.group.height = math.floor(y * 0.85);
self.trainer.group.left = 5;
self.trainer.group.top = math.floor((y * 1.095) - y);
self.trainer.group.caption = 'Hacks';
self.trainer.subtitle.left = 5;
self.trainer.subtitle.top = 0;
self.trainer.subtitle.caption = 'Select an hack from the list, then press enable!';
local x,y = control_getSize(self.trainer.group);
self.trainer.list.width = math.floor((x * 0.75) - 6);
self.trainer.list.height = 180;
self.trainer.list.left = 5;
self.trainer.list.top = 20;
local x,y = control_getSize(self.trainer.list);
self.trainer.enable.width = math.floor((x * 0.34)-6);
self.trainer.enable.height = 32;
self.trainer.enable.left = x + 6;
self.trainer.enable.top = 19;
self.trainer.enable.caption = 'Enable';
self.trainer.enable.onClick = function (sender) self:ActivateHack(sender) end;
self.trainer.enableall.width = math.floor((x * 0.34)-6);
self.trainer.enableall.height = 32;
self.trainer.enableall.left = x + 6;
self.trainer.enableall.top = 53;
self.trainer.enableall.caption = 'Enable all';
self.trainer.enableall.onClick = function (sender) self:ActivateAllHacks(sender) end;
self.trainer.desctitle.left = 435;
self.trainer.desctitle.top = y - 90;
self.trainer.desctitle.caption = "60% click enable all ";
self.trainer.desc.left = 45;
self.trainer.desc.top = y + 35;
self.trainer.desc.caption = 'No hack was selected...';
self.listitems = self.trainer.list.getItems();
HackData:HacksData();
setMethodProperty(self.trainer.list, 'OnSelectionChange', function () HackData:ChangeDesc() end)
self.trainer.form.show();
end
function HackData:ActivateAllHacks(sender)
self.activateall = true;
for i = 0, #self.hacktable do
i = i-1
self.trainer.list.ItemIndex = i
HackData:ActivateHack()
end
self.activateall = false;
end
function HackData:ActivateHack(sender)
self.listitems = self.trainer.list.getItems();
local index = self.trainer.list.ItemIndex + 1;
if (index == 0 or self.hacktable[index] == nil) then
return;
end
if (self.hackstatus[index] == false) then
if (type(self.hacktable[index][2])=='string') then
local asm = autoAssemble(self.hacktable[index][2]);
if (asm == true) then
if (AobSwapCheck~=true and AobSwapCheck~=nil) then
AobSwapCheck=nil;
if self.activateall == false then
return showMessage('Hack failed to enable!');
else
return
end
end
AobSwapCheck=nil;
if self.activateall == false then
if (self.hacktable[index][4]~='' and self.hacktable[index][4]~= nil) then
showMessage(self.hacktable[index][4]);
else
showMessage('Hack was enabled successfully!');
end
end
local str = strings_getString(self.listitems, index - 1);
strings_setString( self.listitems, index - 1, str .. ' - Enabled!' );
self.hackstatus[index] = true;
HackData:ChangeDesc()
else
if self.activateall == false then
return showMessage('Hack failed to enable!');
else
return
end
end
end
elseif (self.hackstatus[index] == true and (self.hacktable[index][5] == true or self.hacktable[index][5] == 'true') and self.activateall == false) then
if (type(self.hacktable[index][6])=='string') then
local asm = autoAssemble(self.hacktable[index][6]);
if (asm == true) then
if (AobSwapCheck~=true and AobSwapCheck~=nil) then
AobSwapCheck=nil;
return showMessage('Hack failed to enable!');
end
AobSwapCheck=nil;
if (self.hacktable[index][7]~='' and self.hacktable[index][7]~= nil) then
showMessage(self.hacktable[index][7]);
else
showMessage('Hack was disabled successfully!');
end
strings_setString( self.listitems, index - 1, self.hacktable[index][1] );
self.hackstatus[index] = false;
else
return showMessage('Hack failed to disable!');
end
end
end
HackData:ChangeDesc();
end
function HackData:ChangeDesc(sender)
local index = self.trainer.list.ItemIndex + 1
if (index == 0 or self.hacktable[index] == nil) then
return
end
if (self.hacktable[index][3] ~= '' and self.hacktable[index][3] ~= nil) then
self.trainer.desc.caption = self.hacktable[index][3];
else
self.trainer.desc.caption = "There's no descriptions available about this hack";
end
if (self.hackstatus[index] == true and (self.hacktable[index][5] == false or self.hacktable[index][5] == 'false')) then
self.trainer.enableall.Enabled = false;
self.trainer.enable.Enabled = false;
elseif (self.hackstatus[index] == true and (self.hacktable[index][5] == true or self.hacktable[index][5] == 'true')) then
self.trainer.enableall.Enabled = false;
self.trainer.enable.Enabled = true;
self.trainer.enable.Caption = 'Disable';
else
self.trainer.enableall.Enabled = true;
self.trainer.enable.Enabled = true;
self.trainer.enable.Caption = 'Enable';
end
end
HackData:Info()
end
function DEC_HEX(IN)
local B,K,OUT,I,D=16,"0123456789ABCDEF","",0
if IN<1 then
OUT=0
return OUT
end
while IN>0 do
I=I+1
IN,D=math.floor(IN/B),math.mod(IN,B)+1
OUT=string.sub(K,D,D)..OUT
end
return OUT
end
function Aobswap(search, change)
aobs = AOBScan(search)
if(aobs ~= nil) then
j = stringlist_getCount(aobs)
for i = 1, j do
address=stringlist_getString(aobs,i-1)
for i = 1, string.len(change), 3 do
z = string.sub(change, i, i+2)
x, y = string.find(z, "%?+")
if (x == nil) then
script=[[
]]..address.."+"..(DEC_HEX((i-1)/3))..[[:
db ]]..z..[[
]]
autoAssemble(script)
end
end
end
object_destroy(aobs);
aobs=nil
end
end
function AobswapC(search, change)
aobs = AOBScan(search)
if(aobs == nil) then AobSwapCheck=false else
j = stringlist_getCount(aobs)
for i = 1, j do
address=stringlist_getString(aobs,i-1)
for i = 1, string.len(change), 3 do
z = string.sub(change, i, i+2)
x, y = string.find(z, "%?+")
if (x == nil) then
script=[[
]]..address.."+"..(DEC_HEX((i-1)/3))..[[:
db ]]..z..[[
]]
autoAssemble(script)
end
end
end
object_destroy(aobs);
aobs=nil
AobSwapCheck=true
end
end
InformationText=" "
AttachFirst = {}
AttachFirst[1] = createForm(false)
AttachFirst[2] = createPanel(AttachFirst[1])
AttachFirst[3] = createButton(AttachFirst[2])
AttachFirst[4] = createLabel(AttachFirst[2])
AttachFirst[5] = createGroupBox(AttachFirst[2])
AttachFirst[6] = createLabel(AttachFirst[5])
AttachFirst[7] = createLabel(AttachFirst[5])
AttachFirst[9] = createLabel(AttachFirst[5])
AttachFirst[10] = createComboBox(AttachFirst[5])
AttachFirst[12] = createButton(AttachFirst[5])
AttachFirst[13] = createLabel(AttachFirst[2])
setProperty(AttachFirst[1] , "Position", "poScreenCenter")
setProperty(AttachFirst[1] , "BorderIcons", "[biSystemMenu]")
setProperty(AttachFirst[1] , "BiDiMode", "bdLeftToRight")
setProperty(AttachFirst[2] , "BiDiMode", "bdLeftToRight")
setProperty(AttachFirst[2] , "BiDiMode", "bdLeftToRight")
setProperty(AttachFirst[10] , "ReadOnly", "True")
local FontHeight = getProperty(AttachFirst[4] , "Font")
setProperty(FontHeight , "Style", "[fsBold]")
setProperty(FontHeight , "Height", "17")
local FontHeight = getProperty(AttachFirst[5] , "Font")
setProperty(FontHeight , "Style", "[fsBold]")
--
local FontHeight = getProperty(AttachFirst[6] , "Font")
setProperty(FontHeight , "Style", "[]")
setProperty(FontHeight , "Height", "14")
local FontHeight = getProperty(AttachFirst[7] , "Font")
setProperty(FontHeight , "Style", "[]")
setProperty(FontHeight , "Height", "13")
local FontHeight = getProperty(AttachFirst[9] , "Font")
setProperty(FontHeight , "Style", "[fsBold]")
setProperty(FontHeight , "Height", "14")
local FontHeight = getProperty(AttachFirst[7] , "Font")
setProperty(FontHeight , "Color", 0x000000FE)
setProperty(FontHeight , "Color", 0x000000FE)
local FontHeight = getProperty(AttachFirst[9] , "Font")
setProperty(FontHeight , "Color", 0x00007F00)
--
local FontHeight = getProperty(AttachFirst[10] , "Font")
setProperty(FontHeight , "Style", "[]")
setProperty(FontHeight , "Height", "13")
local FontHeight = getProperty(AttachFirst[12] , "Font")
setProperty(FontHeight , "Style", "[]")
setProperty(FontHeight , "Height", "13")
setProperty(AttachFirst[13], "Cursor", "-21")
local FontHeight = getProperty(AttachFirst[13] , "Font")
setProperty(FontHeight , "Style", "[fsBold]")
setProperty(FontHeight , "Height", "20")
setProperty(FontHeight , "Color", 0xffcc33)
--
control_setEnabled(AttachFirst[3], false)
control_setSize(AttachFirst[1], 460, 100)
x,y = control_getSize(AttachFirst[1])
control_setSize(AttachFirst[2], x,y)
control_setSize(AttachFirst[3], 75,65)
control_setSize(AttachFirst[5], 375,70)
control_setSize(AttachFirst[10], 205,21)
control_setSize(AttachFirst[12], 79,25)
control_setPosition(AttachFirst[3], 382, 25)
control_setPosition(AttachFirst[4], 5,5)
control_setPosition(AttachFirst[5], 5,20)
control_setPosition(AttachFirst[6], 5,0)
control_setPosition(AttachFirst[7], 5,07)
control_setPosition(AttachFirst[9], 5,30)
control_setPosition(AttachFirst[10], 75,05)
control_setPosition(AttachFirst[12], 286,03)
control_setPosition(AttachFirst[13], 5,219)
control_setCaption(AttachFirst[1],"Select the Process - Selecione o Processo")
control_setCaption(AttachFirst[3],"Continue")
control_setCaption(AttachFirst[4]," ")
control_setCaption(AttachFirst[5],"Attaching")
control_setCaption(AttachFirst[6],InformationText)
control_setCaption(AttachFirst[7],"Process list")
control_setCaption(AttachFirst[9],"Currently attached to PID: ")
control_setCaption(AttachFirst[12],"Attach")
control_setCaption(AttachFirst[13],"www.nyit-nyit.net")
al = combobox_getItems(AttachFirst[10])
strings_clear(al)
function OpenFlashacking()
shellExecute(" ")
end
strings_add(al, 'Pick a processor....')
strings_add(al, 'Chrome.exe')
strings_add(al, 'Bul-Dozer Browser')
strings_add(al, 'FlashPlayerPlugin')
strings_add(al, 'Opera.exe')
strings_add(al, 'Plugin-Container.exe')
strings_add(al, 'Iexplorer.exe')
setProperty(AttachFirst[10] , "ItemIndex", "0")
success = 1
process = "chrome.exe"
errorOnLookupFailure(false);
function ResetChrome()
success = 0
local test = openProcess("chrome.exe") if test ==nil then showMessage("Chrome was not found!!"); timer_setEnabled(openNextProcTimer,false); return end
strings_add(getAutoAttachList(),process)
timer_setEnabled(openNextProcTimer,true)
end
function enableCheatsGuiWhatEver()
local PID=getOpenedProcessID()
control_setCaption(AttachFirst[1],"Attaching Form!")
control_setEnabled(AttachFirst[3], true)
control_setCaption(AttachFirst[9], "Currently attached to PID: " .. PID)
success = 1
showMessage("Attached successfully!")
end
function checkProcessMajor()
reinitializeSymbolhandler()
if getAddress("pepflashplayer.dll")~=0 or
getAddress("AdobeCPGetAPI") ~=0 then
return true
end
return false
end
alreadycheckedPIDS={}
openNextProcTimer = createTimer(nil,false)
timer_setInterval(openNextProcTimer, 1000)
timer_onTimer(openNextProcTimer,
function (sender)
local tempPIDtable = getPids()
if #tempPIDtable == 0 then return end
timer_setEnabled(sender,false)
openProcess(tempPIDtable[1])
end
)
function getPids()
local SL=createStringlist()
getProcesslist(SL)
local tempPIDtable={}
for i=0,strings_getCount(SL)-1 do
local entry = strings_getString(SL,i)
local processname = entry:sub(10,255)
local PID = tonumber('0x'..entry:sub(1,8))
if processname == process then
if alreadycheckedPIDS[PID]~=true then
table.insert(tempPIDtable,PID)
end
end
end
object_destroy(SL)
return tempPIDtable
end
function checkProcess(sender)
timer_setEnabled(sender,false)
alreadycheckedPIDS[getOpenedProcessID()]=true
if checkProcessMajor() then
timer_setEnabled(openNextProcTimer,false)
alreadycheckedPIDS={}
enableCheatsGuiWhatEver()
else
timer_setEnabled(openNextProcTimer,true)
end
end
function onOpenProcess()
if success == 1 then return end
timer_setEnabled(checkProcessTimer,true)
end
checkProcessTimer = createTimer(nil,false)
timer_setInterval(checkProcessTimer, 100)
timer_onTimer(checkProcessTimer, checkProcess)
function AttachToChrome()
control_setCaption(AttachFirst[1],"Attaching Form! - Please wait searching for the process...")
ResetChrome()
end
function AttachList()
AttachItems = combobox_getItems(AttachFirst[10])
AttachIndex = combobox_getItemIndex(AttachFirst[10])
if AttachIndex == -1 then return end
if AttachIndex == 0 then return showMessage("Please pick a process from the list") end
if strings_getString(AttachItems,AttachIndex)=='chrome.exe' then return AttachToChrome() end
openProcess(strings_getString(AttachItems,AttachIndex))
errorOnLookupFailure(false)
reinitializeSymbolhandler()
err=getAddress("kernel32.dll")==0
if err==true then
showMessage("Couldn't find the process")
else
local PID=getOpenedProcessID()
control_setCaption(AttachFirst[9], "Currently attached to PID: " .. PID)
control_setEnabled(AttachFirst[3], true)
showMessage("Attached successfully!")
end
end
function AttachClose()
closeCE()
end
function ExecuteHack()
CreateTrainer()
form_hide(AttachFirst[1])
end
control_onClick(AttachFirst[3], ExecuteHack)
control_onClick(AttachFirst[12],AttachList)
form_onClose(AttachFirst[1],AttachClose)
control_onClick(AttachFirst[13],OpenFlashacking)
setProperty(AttachFirst[1] , "ShowInTaskBar", "stAlways")
form_show(AttachFirst[1]) |
|
|
Back to top |
|
|
Dark Byte Site Admin Reputation: 457
Joined: 09 May 2003 Posts: 25262 Location: The netherlands
|
Posted: Tue Feb 09, 2016 12:29 am Post subject: |
|
|
Rydian wrote: | Lua isn't compiled, it's gotta' be uncompressed and read properly at some point. |
check out the ce github repository ( https://github.com/cheat-engine/cheat-engine/tree/master/Cheat%20Engine/bin/lua_extra )
there is a luac.exe you can use to precompile lua scripts.
with that , a table file ,and a stringstream class object, you can obfuscate it a little bit more
e.g the lua table script would just have this:
Code: |
css=findTableFile("compiledscript").Stream
ss=createStringStream()
ss.copyFrom(css, css.Size)
load(ss.DataString)()
ss.Destroy()
|
and the actual trainer would be in the compiled script
Tip: you could for example have 2 compiled scripts. Where the first one decrypts the other one firsts. (Or 3, 4 or how many levels of protection you feel like, and each one a different type of decoding)
Description: |
|
Download |
Filename: |
examplewithcompiledscript.CT |
Filesize: |
799 Bytes |
Downloaded: |
696 Time(s) |
_________________
Do not ask me about online cheats. I don't know any and wont help finding them.
Like my help? Join me on Patreon so i can keep helping
Last edited by Dark Byte on Tue Feb 09, 2016 10:05 am; edited 4 times in total |
|
Back to top |
|
|
facecheats Newbie cheater Reputation: 0
Joined: 12 Jul 2015 Posts: 20
|
Posted: Tue Feb 09, 2016 6:11 am Post subject: |
|
|
Rydian wrote: | Lua isn't compiled, it's gotta' be uncompressed and read properly at some point. |
yes, for those who have little knowledge that will give much worked .. hahahaha
_________________
dved rvrdv vrevr rvrve |
|
Back to top |
|
|
kostya555 Advanced Cheater Reputation: 0
Joined: 04 Apr 2013 Posts: 55
|
Posted: Tue Feb 09, 2016 9:31 am Post subject: Look My Decom |
|
|
Here look your trainer. Here is a table upload and enjoy. Learn student...
http://rghost.ru/7h5vJRw4f
ha ha ha ha
|
|
Back to top |
|
|
Rydian Grandmaster Cheater Supreme Reputation: 31
Joined: 17 Sep 2012 Posts: 1358
|
Posted: Tue Feb 09, 2016 3:00 pm Post subject: |
|
|
Dark Byte wrote: | there is a luac.exe you can use to precompile lua scripts. | Oh that's neat that it exists for Lua. I remember looking around for something like that for PHP years ago but it seemed nobody had bothered to make one of those.
EDIT: I think there's one for Python but the 2/3 split put me off.
_________________
Last edited by Rydian on Wed Feb 10, 2016 4:14 pm; edited 1 time in total |
|
Back to top |
|
|
atom0s Moderator Reputation: 198
Joined: 25 Jan 2006 Posts: 8516 Location: 127.0.0.1
|
Posted: Tue Feb 09, 2016 7:02 pm Post subject: |
|
|
Dark Byte wrote: | Rydian wrote: | Lua isn't compiled, it's gotta' be uncompressed and read properly at some point. |
check out the ce github repository ( https://github.com/cheat-engine/cheat-engine/tree/master/Cheat%20Engine/bin/lua_extra )
there is a luac.exe you can use to precompile lua scripts.
with that , a table file ,and a stringstream class object, you can obfuscate it a little bit more
e.g the lua table script would just have this:
Code: |
css=findTableFile("compiledscript").Stream
ss=createStringStream()
ss.copyFrom(css, css.Size)
load(ss.DataString)()
ss.Destroy()
|
and the actual trainer would be in the compiled script
Tip: you could for example have 2 compiled scripts. Where the first one decrypts the other one firsts. (Or 3, 4 or how many levels of protection you feel like, and each one a different type of decoding) |
Is Cheat Engines version of Lua up on the repo? The only one I see is 5.1 from 3 years ago.
_________________
- Retired. |
|
Back to top |
|
|
Dark Byte Site Admin Reputation: 457
Joined: 09 May 2003 Posts: 25262 Location: The netherlands
|
Posted: Tue Feb 09, 2016 7:06 pm Post subject: |
|
|
no, not yet. but the 5.3 one is an basically an unmodified clean build (with the exception of output filename and implementing lock/unlock for threadsafety. )
(the luac exe is for 5.3)
_________________
Do not ask me about online cheats. I don't know any and wont help finding them.
Like my help? Join me on Patreon so i can keep helping |
|
Back to top |
|
|
atom0s Moderator Reputation: 198
Joined: 25 Jan 2006 Posts: 8516 Location: 127.0.0.1
|
|
Back to top |
|
|
STN I post too much Reputation: 42
Joined: 09 Nov 2005 Posts: 2672
|
Posted: Wed Feb 10, 2016 9:45 am Post subject: |
|
|
I challenge you clean my room, hope you succeed and please don't show how you did.
_________________
|
|
Back to top |
|
|
|
|
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
|
|