IP.Board Tutorials
How to null your 4.0 beta/pre-release
Submitted by Mr_Joker, 15-02-2015, 04:36 AM, Thread ID: 1303
Thread Closed
So, as some of you might know I had a few files up in the downloads for nulled copies of the coming IPS4!
So basically, all you have to do is replace your init.php file contents with this (the whole thing):
Then, upload it and you are set to go. When prompted for a license, enter whatever you want. And this works, simply because your board will think you are using the pre-release key and never check if it's real. And as long as IPS doesn't update this file, this should work on any and all releases for IPS4.
Enjoy! If theres any problem let me know below i'll help you :8
So basically, all you have to do is replace your init.php file contents with this (the whole thing):
PHP Code:
<?php
/**
* @briefInitiates IPS Social Suite constants, autoloader and exception handler
* @author<a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright(c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @licensehttp://www.invisionpower.com/legal/standards/
* @packageIPS Social Suite
* @since18 Feb 2013
* @versionSVN_VERSION_NUMBER
*/
namespace IPS;
/**
* Class to contain IPS Social Suite autoloader and exception handler
*/
class IPS
{
/**
* @briefClasses that have hooks on
*/
public static $hooks = array();
/**
* @briefUnique key for this suite (used in http requests to defy browser caching)
*/
public static $suiteUniqueKey = NULL;
/**
* @briefDeveloper Code to be added to all namespaces
*/
private static $inDevCode = '';
/**
* @briefNamespaces developer code has been imported to
*/
private static $inDevCodeImportedTo = array();
/**
* @briefVendors to use PSR-0 autoloader for
*/
public static $PSR0Namespaces = array();
/**
* Get default constants
*
* @returnarray
*/
public static function defaultConstants()
{
return array(
'CP_DIRECTORY'=> 'admin',
'IN_DEV'=> FALSE,
'DEV_USE_WHOOPS'=> TRUE,
'DEV_USE_FURL_CACHE'=> FALSE,
'DEBUG_JS'=> FALSE,
'DEV_DEBUG_JS'=> TRUE,
'DEV_DEBUG_CSS'=> FALSE,
'DEV_DEBUG_TEMPLATES'=> FALSE,
'IPS_FOLDER_PERMISSION'=> 0777,
'FOLDER_PERMISSION_NO_WRITE'=> 0755,
'IPS_FILE_PERMISSION'=> 0644,
'ROOT_PATH'=> __DIR__,
'NO_WRITES'=> FALSE,
'LOG_METHOD'=> '{}',
'STORE_METHOD'=> 'Database',
'STORE_CONFIG'=> '{}',
'CACHE_METHOD'=> 'None',
'CACHE_CONFIG'=> '{}',
'EMAIL_DEBUG_PATH'=> NULL,
'BULK_MAILS_PER_CYCLE'=> 0,
'JAVA_PATH'=> "",
'ERROR_PAGE'=> 'error.html',
'QUERY_LOG'=> FALSE,
'ENFORCE_ACCESS'=> FALSE,
'THUMBNAIL_SIZE'=> '500x500',
'COOKIE_DOMAIN'=> NULL,
'COOKIE_PREFIX'=> NULL,
'CONNECT_NOSYNC_NAMES'=> FALSE,
'BYPASS_CURL'=> FALSE,
'NEXUS_TEST_GATEWAYS'=> FALSE,
'UPGRADE_MANUAL_THRESHOLD'=> 1000000,
'UPGRADE_LARGE_THRESHOLD'=> 150000,
'SKIP_SERVER_PORT'=> FALSE,
'HTMLENTITIES'=> ( version_compare( phpversion(), '5.4.0', '<' ) ) ? ENT_IGNORE : ENT_DISALLOWED,
'SUITE_UNIQUE_KEY'=> md5( ( ( isset( $_SERVER['SERVER_NAME'] ) ) ? $_SERVER['SERVER_NAME'] : '' ) . '$Rev: 3023$'),
'USE_DEVELOPMENT_BUILDS'=> FALSE,
'DEV_WHOOPS_EDITOR'=> NULL,
);
}
/**
* Initiate IPS Social Suite constants, autoloader and exception handler
*
* @returnvoid
*/
public static function init()
{
/* Set timezone */
date_default_timezone_set( 'UTC' );
/* Set default MB internal encoding */
mb_internal_encoding('UTF-8');
/* Define the IN_IPB constant - this needs to be in the global namespace for backwards compatibility */
define( 'IN_IPB', TRUE );
/* Load constants.php */
if( file_exists( __DIR__ . '/constants.php' ) )
{
@include_once( __DIR__ . '/constants.php' );
}
/* Import and set defaults */
foreach ( static::defaultConstants() as $k => $v )
{
if( defined( $k ) )
{
define( 'IPS\\' . $k, constant( $k ) );
}
else
{
define( 'IPS\\' . $k, $v );
}
}
/* Load developer code */
if( IN_DEV and file_exists( ROOT_PATH . '/dev/function_overrides.php' ) )
{
self::$inDevCode = file_get_contents( ROOT_PATH . '/dev/function_overrides.php' );
}
/* Set autoloader */
spl_autoload_register( '\IPS\IPS::autoloader', true, true );
/* Set error handlers */
if ( \IPS\IN_DEV AND \IPS\DEV_USE_WHOOPS and file_exists( ROOT_PATH . '/dev/Whoops/Run.php' ) )
{
self::$PSR0Namespaces['Whoops'] = ROOT_PATH . '/dev/Whoops';
$whoops = new \Whoops\Run;
$ipsHandler = new \Whoops\Handler\IPSHandler;
if ( \IPS\DEV_WHOOPS_EDITOR )
{
$ipsHandler->setEditor( \IPS\DEV_WHOOPS_EDITOR );
}
$whoops->pushHandler( $ipsHandler );
$jsonHandler = new \Whoops\Handler\JsonResponseHandler;
$jsonHandler->onlyForAjaxRequests( true );
$whoops->pushHandler( $jsonHandler );
$whoops->register();
}
else
{
set_error_handler( '\IPS\IPS::errorHandler' );
set_exception_handler( '\IPS\IPS::exceptionHandler' );
}
/* Init hooks */
if ( file_exists( \IPS\ROOT_PATH . '/plugins/hooks.txt' ) )
{
$mtime = filemtime( \IPS\ROOT_PATH . '/plugins/hooks.txt' );
$encrypted = file_get_contents( \IPS\ROOT_PATH . '/plugins/hooks.txt' );
$decrypted = '';
for ( $i = 0; $i < mb_strlen( $encrypted ); $i++ )
{
$decrypted .= chr( ord( mb_substr( $encrypted, $i, 1 ) ) - mb_substr( $mtime, ( $i % mb_strlen( $mtime ) ) - 1, 1 ) );
}
if ( !( self::$hooks = @json_decode( $decrypted, TRUE ) ) )
{
self::$hooks = array();
}
}
}
/**
* Autoloader
*
* @paramstring$classnameClass to load
* @returnvoid
*/
public static function autoloader( $classname )
{
/* Separate by namespace */
$bits = explode( '\\', ltrim( $classname, '\\' ) );
/* If this doesn't belong to us, try a PSR-0 loader or ignore it */
$vendorName = array_shift( $bits );
if( $vendorName !== 'IPS' )
{
if ( isset( self::$PSR0Namespaces[ $vendorName ] ) )
{
@include_once( self::$PSR0Namespaces[ $vendorName ] . DIRECTORY_SEPARATOR . implode( DIRECTORY_SEPARATOR, $bits ) . '.php' );
}
return;
}
/* Work out what namespace we're in */
$class = array_pop( $bits );
$namespace = empty( $bits ) ? 'IPS' : ( 'IPS\\' . implode( '\\', $bits ) );
$inDevCode = '';
/* We only need to load the file if we don't have the underscore-prefixed one */
if( !class_exists( "{$namespace}\\_{$class}", FALSE ) )
{
/* Locate file */
$path = ROOT_PATH . '/';
$sourcesDirSet = FALSE;
foreach ( array_merge( $bits, array( $class ) ) as $i => $bit )
{
if( ctype_lower( $bit ) === TRUE )
{
if( $i === 0 )
{
$path .= 'applications/';
}
else
{
$sourcesDirSet = TRUE;
}
}
elseif ( $i === 3 and $bit === 'Upgrade' )
{
$bit = mb_strtolower( $bit );
}
elseif( $sourcesDirSet === FALSE )
{
if( $i === 0 )
{
$path .= 'system/';
}
elseif ( $i === 1 and $bit === 'Application' )
{
// do nothing
}
else
{
$path .= 'sources/';
}
$sourcesDirSet = TRUE;
}
$path .= "{$bit}/";
}
/* Load it */
$path = \substr( $path, 0, -1 ) . '.php';
if( !file_exists( $path ) )
{
$path = \substr( $path, 0, -4 ) . \substr( $path, \strrpos( $path, '/' ) );
if ( !file_exists( $path ) )
{
return FALSE;
}
}
require_once( $path );
/* Is it an interface? */
if ( interface_exists( "{$namespace}\\{$class}", FALSE ) )
{
return;
}
/* Doesn't exist? */
if( !class_exists( "{$namespace}\\_{$class}", FALSE ) )
{
trigger_error( "Class {$classname} could not be loaded. Ensure it has been properly prefixed with an underscore and is in the correct namespace.", E_USER_ERROR );
}
/* Stuff for developer mode */
if( IN_DEV )
{
try
{
$reflection = new \ReflectionClass( "{$namespace}\\_{$class}" );
/* Import our code to override forbidden functions */
if( !in_array( \strtolower( $namespace ), self::$inDevCodeImportedTo ) )
{
$inDevCode = self::$inDevCode;
self::$inDevCodeImportedTo[] = \strtolower( $namespace );
}
/* Any classes which extend a core PHP class are exempt from our rules */
$parent = $reflection->getParentClass();
if( $parent === false or \substr( $parent->getNamespaceName(), 0, 3 ) === 'IPS' )
{
/* Make sure it's name follows our standards */
if( !preg_match( '/^_[A-Z]+$/i', $reflection->getShortName() ) )
{
trigger_error( "{$classname} does not follow our naming conventions. Please rename using only alphabetic characters and PascalCase. (PHP Coding Standards: Classes.5)", E_USER_ERROR );
}
/* Loop methods */
$hasNonAbstract = FALSE;
$hasNonStatic = FALSE;
foreach ( $reflection->getMethods() as $method )
{
if ( \substr( $method->getDeclaringClass()->getName(), 0, 3 ) === 'IPS' )
{
/* Make sure it's not private */
if( $method->isPrivate() )
{
trigger_error( "{$classname}::{$method->name} is declared as private. In order to ensure that hooks are able to work freely, please use protected instead. (PHP Coding Standards: Functions and Methods.4)", E_USER_ERROR );
}
/* We need to know for later if we have non-abstract methods */
if( !$method->isAbstract() )
{
$hasNonAbstract = TRUE;
}
/* We need to know for later if we have non-static methods */
if( !$method->isStatic() )
{
$hasNonStatic = TRUE;
}
/* Make sure the name follows our conventions */
if(
!preg_match( '/^_?[a-z][A-Za-z0-9]*$/', $method->name )// Normal pattern most methods should match
and
!preg_match( '/^get_/i', $method->name )// get_* is allowed
and
!preg_match( '/^set_/i', $method->name )// set_* is allowed
and
!preg_match( '/^parse_/i', $method->name )// parse_* is allowed
and
!preg_match( '/^setBitwise_/i', $method->name )// set_Bitiwse_* is allowed
and
!in_array( $method->name, array(// PHP's magic methods are allowed (except __sleep and __wakeup as we don't allow serializing)
'__construct',
'__destruct',
'__call',
'__callStatic',
'__get',
'__set',
'__isset',
'__unset',
'__toString',
'__invoke',
'__set_state',
'__clone',
) )
) {
trigger_error( "{$classname}::{$method->name} does not follow our naming conventions. Please rename using only alphabetic characters and camelCase. (PHP Coding Standards: Functions and Methods.1-3)", E_USER_ERROR );
}
}
}
/* Loop properties */
foreach ( $reflection->getProperties() as $property )
{
$hasNonAbstract = TRUE;
/* Make sure it's not private */
if( $property->isPrivate() )
{
trigger_error( "{$classname}::\${$property->name} is declared as private. In order to ensure that hooks are able to work freely, please use protected instead. (PHP Coding Standards: Properties and Variables.3)", E_USER_ERROR );
}
/* Make sure the name follows our conventions */
if( !preg_match( '/^_?[a-z][A-Za-z]*$/', $property->name ) )
{
trigger_error( "{$classname}::\${$property->name} does not follow our naming conventions. Please rename using only alphabetic characters and camelCase. (PHP Coding Standards: Properties and Variables.1-2)", E_USER_ERROR );
}
}
/* Check an interface wouldn't be more appropriate */
if( !$hasNonAbstract )
{
trigger_error( "You do not have any non-abstract methods in {$classname}. Please use an interface instead. (PHP Coding Standards: Classes.7)", E_USER_ERROR );
}
/* Check we have at least one non-static method (unless this class is abstract or has a parent) */
elseif( !$reflection->isAbstract() and $reflection->getParentClass() === FALSE and !$hasNonStatic and $reflection->getNamespacename() !== 'IPS\Output\Plugin' and !in_array( 'extensions', $bits ) and !in_array( 'templateplugins', $bits ) )
{
trigger_error( "You do not have any methods in {$classname} which are not static. Please refactor. (PHP Coding Standards: Functions and Methods.6)", E_USER_ERROR );
}
}
}
catch ( \Exception $e ) {}
}
}
/* Monkey Patch */
self::monkeyPatch( $namespace, $class, $inDevCode );
}
/**
* Monkey Patch
*
* @paramstring$namespaceThe namespace
* @paramstring$finalClassThe final class name we want to be able to use (without namespace)
* @paramstring$extraCodeAny additonal code to import before the class is defined
* @returnnull
*/
public static function monkeyPatch( $namespace, $finalClass, $extraCode = '' )
{
$realClass = "_{$finalClass}";
if( isset( self::$hooks[ "\\{$namespace}\\{$finalClass}" ] ) )
{
foreach ( self::$hooks[ "\\{$namespace}\\{$finalClass}" ] as $id => $data )
{
$contents = "namespace {$namespace}; ". str_replace( '_HOOK_CLASS_', $realClass, file_get_contents( ROOT_PATH . '/' . $data['file'] ) );
if( @eval( $contents ) !== FALSE )
{
$realClass = $data['class'];
}
}
}
$reflection = new \ReflectionClass( "{$namespace}\\_{$finalClass}" );
if( eval( "namespace {$namespace}; ". $extraCode . ( $reflection->isAbstract() ? 'abstract' : '' )." class {$finalClass} extends {$realClass} {}" ) === FALSE )
{
trigger_error( "There was an error initiating the class {$namespace}\\{$finalClass}.", E_USER_ERROR );
}
}
/**
* Error Handler
*
* @paramint$errnoError number
* @paramerrstr$errstrError message
* @paramstring$errfileFile
* @paramint$errlineLine
* @paramarray$traceBacktract
* @returnvoid
*/
public static function errorHandler( $errno, $errstr, $errfile, $errline, $trace=NULL )
{
/* We don't care about these in production */
if ( in_array( $errno, array( E_NOTICE, E_DEPRECATED ) ) )
{
return;
}
/* This means the error suppressor was used, so we should ignore any non-fatal errors */
if ( error_reporting() === 0 )
{
return false;
}
throw new \ErrorException( $errstr, $errno, 0, $errfile, $errline );
}
/**
* Exception Handler
*
* @param\Exception$exceptionException class
* @returnvoid
*/
public static function exceptionHandler( $exception )
{
try
{
\IPS\Output::i()->error( 'generic_error', "EX{$exception->getCode()}", 500, "<pre>{$exception}</pre>" );
}
catch ( \Exception $e )
{
if( isset( $_SERVER['SERVER_PROTOCOL'] ) and \strstr( $_SERVER['SERVER_PROTOCOL'], '/1.0' ) !== false )
{
header( "HTTP/1.0 500 Internal Server Error" );
}
else
{
header( "HTTP/1.1 500 Internal Server Error" );
}
require \IPS\ROOT_PATH . '/' . \IPS\ERROR_PAGE;
}
exit;
}
/**
* Get license key data
*
* @returnarray|NULL
*/
public static function licenseKey()
{
/* Get the cached value */
$cached = NULL;
if ( isset( \IPS\Data\Store::i()->license_data ) )
{
$cached = \IPS\Data\Store::i()->license_data;
/* If it's younger than 21 days, just use that */
if ( $cached['fetched'] > ( time() - 1814400 ) )
{
return $cached['data'];
}
}
$response= '{"key": "ABCDE-FGHIJ-KLMNO-PQRST-UVWXY", "url": "http:\/\/' . $_SERVER['HTTP_HOST'] . '", "test_url": "http:\/\/localhost", "edition": "Complete", "cloud": true, "active": true, "expires": "2020-12-31 00:00:00", "products": { "spam": true, "forums": true, "calendar": true, "pages": true, "ccs": true, "board": true, "blog": true, "gallery": true, "downloads": true, "content": true, "nexus": true, "copyright": true }, "chat_limit": 999, "support": "Premium"}';
$response= json_decode( $response , TRUE );
/* Update the license info in the store */
\IPS\Data\Store::i()->license_data= array( 'fetched' => time(), 'data' => $response );
/* Return */
return $response;
}
/**
* Check license key
*
* @paramstringThe license key
* @paramstringThe site URL
* @returnvoid
* @throws\DomainException
*/
public static function checkLicenseKey( $val, $url )
{
$response= '{"key": "ABCDE-FGHIJ-KLMNO-PQRST-UVWXY", "url": "http:\/\/' . $_SERVER['HTTP_HOST'] . '", "test_url": "http:\/\/localhost", "edition": "Complete", "cloud": true, "active": true, "expires": "2020-12-31 00:00:00", "products": { "spam": true, "forums": true, "calendar": true, "pages": true, "ccs": true, "board": true, "blog": true, "gallery": true, "downloads": true, "content": true, "nexus": true, "copyright": true }, "chat_limit": 999, "support": "Premium"}';
$response= json_decode( $response , TRUE );
}
}
/* Init */
IPS::init();
Then, upload it and you are set to go. When prompted for a license, enter whatever you want. And this works, simply because your board will think you are using the pre-release key and never check if it's real. And as long as IPS doesn't update this file, this should work on any and all releases for IPS4.
Enjoy! If theres any problem let me know below i'll help you :8
RE: How to null your 4.0 beta/pre-release
08-05-2015, 08:36 PM
#2 init.php is the only file that must be modified.. any other files modified of the instalation kit mean a non original version!
RE: How to null your 4.0 beta/pre-release
10-05-2015, 07:56 PM
#3 When you edit init.php you just bypass license key request and you do not nulling IPS.
Nulling means removing any callback from scrips.If you want to null, you must remove callback from files like spam.php and etc.
Nulling means removing any callback from scrips.If you want to null, you must remove callback from files like spam.php and etc.
RE: How to null your 4.0 beta/pre-release
10-05-2015, 08:06 PM
#4 as long as you can bypass the licence key request, the script works ok.. things with callbacks are relative as importance.
RE: How to null your 4.0 beta/pre-release
10-05-2015, 09:09 PM
#5 Will this get you removed from your host? Because I got removed from Nulled versions of IPB.
RE: How to null your 4.0 beta/pre-release
11-05-2015, 12:01 AM
#6 08-05-2015, 08:36 PMthehunters Wrote: init.php is the only file that must be modified.. any other files modified of the instalation kit mean a non original version!
This was for the pre-relases, and betas. More stuff has changed, and this no longer applies. As it was stated above, removing links back to IPS and what not, that would allow them to know where you are hosting, that would be nulling. Also, you can easily bypass the license in the retail versions, but it will throw up sections of warnings. Those can be removed by removing the <div> </div> tags in certain areas of the theme.xml file.
@thehunters, what you are referring to is the md5 checks that allow IPS to know the files have been modified. As stated on their Release Notes under version 4.0.3 section....
"The support tool in the AdminCP will now do MD5 checksum on all PHP files on the system. This allows the system to detect any modified PHP files which is useful both for support and for security. The master checksum values are fetched remotely from IPS to ensure the list is not tampered with locally. "
This is handled in a file called support.php under /applications/core/modules/admin/support/support.php under an area that says
* Step 2: Self Service - md5sum Checker.
You could use the support.php file from 4.0.2 to take care of this minor problem :8
RE: How to null your 4.0 beta/pre-release
11-05-2015, 01:00 AM
#7 11-05-2015, 12:01 AMguntherbb Wrote:08-05-2015, 08:36 PMthehunters Wrote: init.php is the only file that must be modified.. any other files modified of the instalation kit mean a non original version!
This was for the pre-relases, and betas. More stuff has changed, and this no longer applies. As it was stated above, removing links back to IPS and what not, that would allow them to know where you are hosting, that would be nulling. Also, you can easily bypass the license in the retail versions, but it will throw up sections of warnings. Those can be removed by removing the <div> </div> tags in certain areas of the theme.xml file.
@thehunters, what you are referring to is the md5 checks that allow IPS to know the files have been modified. As stated on their Release Notes under version 4.0.3 section....
"The support tool in the AdminCP will now do MD5 checksum on all PHP files on the system. This allows the system to detect any modified PHP files which is useful both for support and for security. The master checksum values are fetched remotely from IPS to ensure the list is not tampered with locally. "
This is handled in a file called support.php under /applications/core/modules/admin/support/support.php under an area that says
* Step 2: Self Service - md5sum Checker.
You could use the support.php file from 4.0.2 to take care of this minor problem :8
You should re-open a thread with thoose infos.
RE: How to null your 4.0 beta/pre-release
11-05-2015, 10:48 AM
#8 Sorry, but I've saw a lot of scripts, let's say "nulled"...... , but inside you can find some kind of drawing in licence file, or a fake copyright in footer. I don't like that. I like clean codes, free.. nulled.. anyway.. but clean.
RE: How to null your 4.0 beta/pre-release
10-05-2015, 09:09 PMMafia Wrote: Will this get you removed from your host? Because I got removed from Nulled versions of IPB.
What do you mean removed? If someone reports you to IPB that you are using a Nulled Version of IPB software theres a chance IPB can take you down :/
RE: How to null your 4.0 beta/pre-release
12-05-2015, 06:58 PMMr_Joker Wrote:10-05-2015, 09:09 PMMafia Wrote: Will this get you removed from your host? Because I got removed from Nulled versions of IPB.
What do you mean removed? If someone reports you to IPB that you are using a Nulled Version of IPB software theres a chance IPB can take you down :/
IPS won't do shit if your community is new or it does not have a lot of members, reason being it would cost them more to taken down your website which is not worth it. If you have a lot content and members and IPS see that you can afford the licence, they will take down your site, unless you use offshore hosting, then IPS can't do shitall.
Users browsing this thread: 6 Guest(s)