ME3Tweaks Forums

This forum has been made read-only. Please come to the ME3Tweaks Discord if you want to discuss modding the Mass Effect Trilogy.

Mass Effect 3 ASI Mods

Discuss Mass Effect 3 mods and modding tools here. This includes multiplayer mods.

Postby Erik JS » Fri Feb 19, 2016 12:14 pm

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).


Off Topic
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.
User avatar
Erik JS
 
Posts: 110
Joined: Sun Jan 10, 2016 8:03 pm
Location: Brazil

Postby Mgamerz » Fri Feb 19, 2016 3:14 pm

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.
User avatar
Mgamerz
Site Admin
 
Posts: 571
Joined: Wed Jan 06, 2016 1:13 am

Postby Erik JS » Fri Feb 19, 2016 9:13 pm

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.
Last edited by Erik JS on Sat Feb 20, 2016 6:22 pm, edited 1 time in total.
User avatar
Erik JS
 
Posts: 110
Joined: Sun Jan 10, 2016 8:03 pm
Location: Brazil

Postby Mgamerz » Fri Feb 19, 2016 9:25 pm

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.
User avatar
Mgamerz
Site Admin
 
Posts: 571
Joined: Wed Jan 06, 2016 1:13 am

Postby Erik JS » Sun Feb 21, 2016 10:41 am

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 !.
User avatar
Erik JS
 
Posts: 110
Joined: Sun Jan 10, 2016 8:03 pm
Location: Brazil

Postby Mgamerz » Tue Feb 23, 2016 1:26 am

I hope to add some ASI mod management to Mod Manager in build 53.
User avatar
Mgamerz
Site Admin
 
Posts: 571
Joined: Wed Jan 06, 2016 1:13 am

Postby Erik JS » Tue Feb 23, 2016 11:51 am

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.
User avatar
Erik JS
 
Posts: 110
Joined: Sun Jan 10, 2016 8:03 pm
Location: Brazil

Postby Mgamerz » Tue Feb 23, 2016 3:25 pm

So... Is it a game crack or... Not? Just silentlogin? I haven't used a cracked version of this game.
User avatar
Mgamerz
Site Admin
 
Posts: 571
Joined: Wed Jan 06, 2016 1:13 am

Postby Erik JS » Tue Feb 23, 2016 9:48 pm

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/f827c7jlsa9a5d8/invitelobby.png
User avatar
Erik JS
 
Posts: 110
Joined: Sun Jan 10, 2016 8:03 pm
Location: Brazil

Postby Mgamerz » Sat Jun 11, 2016 2:38 pm

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.
User avatar
Mgamerz
Site Admin
 
Posts: 571
Joined: Wed Jan 06, 2016 1:13 am

PreviousNext

Return to Mass Effect 3

cron