Page 2 of 5

Re: Mass Effect 3 ASI Mods

Posted: Fri Feb 19, 2016 12:14 pm
by Erik JS
I got sidetracked with research on Unravel, but I'll get back on this now.

The thing I said about "_X" on Origin is still unimplemented on the SDK, so I'll try to code a new FullName function for UObject (I'll call it "FullName_").

With an updated ObjNameDumper (not yet online), this may appear:
Image
11 numbered waves, 0 to 10... maybe that's where we can change "MaxEnemies" (in this case, we could theoretically have different max. counts for each wave).

OFFTOPIC :
About Unravel, I managed to make this:
https://github.com/Erik-JS/unravel-dirtysock
The game is 64-bit and apparently is protected by Denuvo. The only "bad" thing so far is that Cheat Engine is unable to attach its debugger, but the game is still vulnerable to DLL hijacking.
The hardest part of all this was how to figure the asm to do the "jump to pointer". Visual Studio doesn't support inline asm for 64-bit, and GCC inline asm is different for some things. In the end, I figured shit out and this is the result.

Re: Mass Effect 3 ASI Mods

Posted: Fri Feb 19, 2016 3:14 pm
by Mgamerz
And here I heard Denuvo is unbreakable ;)

AFAIK those ones numbered 0-10 are the wavelists definitions. Had to deal a ton with them in modmaker.

Re: Mass Effect 3 ASI Mods

Posted: Fri Feb 19, 2016 9:13 pm
by Erik JS
Core_functions.h

Code: Select all

char* UObject::GetFullName_() 
{ 
	if ( this->Class && this->Outer ) 
	{ 
		static char cOutBuffer[ 256 ]; 

		if ( this->Outer->Outer ) 
		{ 
			strcpy_s ( cOutBuffer, this->Class->GetName() ); 
			strcat_s ( cOutBuffer, " " ); 
			strcat_s ( cOutBuffer, this->Outer->Outer->GetName() ); 
			strcat_s ( cOutBuffer, "." ); 
			strcat_s ( cOutBuffer, this->Outer->GetName() ); 
			strcat_s ( cOutBuffer, "." ); 
			strcat_s ( cOutBuffer, this->GetName() ); 
		} 
		else 
		{ 
			strcpy_s ( cOutBuffer, this->Class->GetName() ); 
			strcat_s ( cOutBuffer, " " ); 
			strcat_s ( cOutBuffer, this->Outer->GetName() ); 
			strcat_s ( cOutBuffer, "." ); 
			strcat_s ( cOutBuffer, this->GetName() ); 
		} 
		int id = *(int*)(this->Name.unknownData00) - 1;
		if (id != -1)
		{
			char strID[10];
			sprintf_s (strID, "_%i", id);
			strcat_s (cOutBuffer, strID);
		}
		return cOutBuffer; 
	} 

	return "(null)"; 
} 

template< class T > T* UObject::FindObject_ ( char* ObjectFullName ) 
{ 
	while ( ! UObject::GObjObjects() ) 
		Sleep ( 100 ); 

	for ( int i = 0; i < UObject::GObjObjects()->Count; ++i ) 
	{ 
		UObject* Object = UObject::GObjObjects()->Data[ i ]; 

		// skip no T class objects 
		if 
		( 
				! Object 
			||	! Object->IsA ( T::StaticClass() ) 
		) 
			continue; 

		// check 
		if ( ! _stricmp ( Object->GetFullName_(), ObjectFullName ) ) 
			return (T*) Object; 
	} 

	return NULL; 
} 
Core_classes.h
Image

As I suspected, each wave has a separate instance of SFXWave_Horde.

With the new code, I'm able to retrieve individual waves like this:

Code: Select all

wavehordereaper = (USFXWave_Horde_Reaper2*)UObject::FindObject_<UObject>("SFXWave_Horde_Reaper2 Transient.SFXWave_Horde_Reaper2_0");
For example, that would be wave 1.

The only problem is that the wave name id doesn't stay the same for all matches, so if I create another match, I can no longer retrieve wave 1 with "SFXWave_Horde_Reaper2_0" (in the dump I have right now, the "lowest" wave is "SFXWave_Horde_Reaper2_14").
Now I'm trying to find where this wave id is stored.

Obviously those examples are valid only for a Reaper match. I'm also trying to find where enemy, map and difficulty are stored.
Edit: SFXGRIMP has difficulty, map and enemy.
To those who don't know: PRI = player replication info. GRI = game replication info.

Re: Mass Effect 3 ASI Mods

Posted: Fri Feb 19, 2016 9:25 pm
by Mgamerz
Use the console command profile mpgame. It will show you how the wave IDs are incremented. It always confused me but now it makes more sense.

You can use skipwave to quickly go through waves and restartfromwave X go to to wave X+1.

An interesting tidbit is you can restart from wave 1336, and play a real 1337 wave and it will have enemies. The game will finish after that wave but as a failure. I don't know where it determines what enemies to spawn for that, unless it's like mod numwaves.

Re: Mass Effect 3 ASI Mods

Posted: Sun Feb 21, 2016 10:41 am
by Erik JS
ObjNameDumper has been updated. Same links from previous page.

Instead of adding names to a list as they're read, the name reading is now done through two threads which assign names to their respective indexes in an array. Null objects don't get anything, so before writing the array to the file, all of its null elements are stripped off.

Dump speed may have been improved by one or two seconds... ;)

A new option has been added, it can be used with filter or alone.
ObjNameDumper ! - dumps all objects, appending their name ID's if applicable.

It can also be used as ObjNameDumper ! filter or ObjNameDumper filter !.

Re: Mass Effect 3 ASI Mods

Posted: Tue Feb 23, 2016 1:26 am
by Mgamerz
I hope to add some ASI mod management to Mod Manager in build 53.

Re: Mass Effect 3 ASI Mods

Posted: Tue Feb 23, 2016 11:51 am
by Erik JS
https://github.com/Erik-JS/ME3-ASI

Putting this here since it's the right thread to post it, also because I made another plugin: ME3 Origin Unlinker. It will make the game act like it was cracked (it doesn't crack the game!), so the game will use silentLogin instead of originLogin when trying to authenticate towards EA server during the the main menu entrance. In other words, this plugin removes the requirement of having to use a cracked EXE in order to play as a custom "offline" profile from PSE.

Side note: while version 1.6 is still officially not supported, Origin Unlinker will work with it (due to the way I intentionally coded the second pattern search). ClientMessage Exposer and Heff's Logger are definitely 1.5 only since they target specific memory addresses.

Re: Mass Effect 3 ASI Mods

Posted: Tue Feb 23, 2016 3:25 pm
by Mgamerz
So... Is it a game crack or... Not? Just silentlogin? I haven't used a cracked version of this game.

Re: Mass Effect 3 ASI Mods

Posted: Tue Feb 23, 2016 9:48 pm
by Erik JS
It doesn't bypass the EXE decryption, which depends on actually having the game on Origin. It only makes the game behave like it was cracked.

Btw, it's impossible to bypass decryption via ASI plugins, as they are loaded by binkw32, and binkw32 is only loaded after the decryption took place -> this is why I removed those "searching again" loops from binkw32's code.

The "benefits" of running the game without links to Origin includes using silentLogin (login is done with AUTH string from Local_Profile.sav rather than the one given by Origin) and it should prevent people from joining you (as the game has no link to Origin, Origin won't report you as "joinable" to your friends). Also, you'll be unable to invite people to your game, even if the overlay is actually enabled:

http://www.mediafire.com/view/f827c7jls ... elobby.png

Re: Mass Effect 3 ASI Mods

Posted: Sat Jun 11, 2016 2:38 pm
by Mgamerz
So I am trying to implement an asi library into mod manager but want to enforce some sort of security since asi mods are essentially executable code. I was thinking whitelist via mod manager and checking that on install/lookup (showing ones that aren't whitelisted as potentially dangerous) but it would be trivial to get around that I think. I also want a way for a user to see a description of installed asi mods but am unsure of how I would manage this.