Sign in to follow this  
PBNut

Unity Going bald here!

Recommended Posts

The community here is super! Thus far I've never been made to feel an idiot with my trivial (to you all) problems in anyones responses! Thanks! That being said... Scenario I have a program that contains a function I need to call. I only know the address of this function, but I also know the parameters it needs as well as the datatypes. Now I inject a DLL into this other program that hooks some winsock functions. Which works fine. What i'm trying to do is call the other function from within the injected DLL via an exported procedure. While hammering on this issue, the app I use to inject/uninject my DLL is where I'm calling the exported procedure contained in the injected DLL. Providing 2 parameters. Whats happening is I get: Exception: Memory Access Violation (Program tried to read/wite and invalid memory address) I'm assuming this means my app doesn't have access to the function address in the target program. I thought however since I'm injected into the target program that I (the DLL) was 'part' of the target programs address space. How can I do this? Been working on this for 2 days and am about brain dead... I just need to be able to invoke this function in the target application from my own program. Like all my issues, I'm assuming its something stupidly simple I'm overlooking. Thanks in advance!

Share this post


Link to post
Share on other sites
So, your injecting app contains the function to be called but you're trying to call it from the DLL within the target app right? If I've got that much right, then the reason is that the two processes have different address spaces. You've injected the DLL (by the way I don't know how to do that kind of thing...) but not the rest of the program. If you need to inform the injecting app of something you'll have to use IPC (I'm assuming it's not a utility function because then you could just move it into the DLL).

Share this post


Link to post
Share on other sites
The title of this thread is lacking. You'd get more help with a title more specific to your question.

What mechanism are you using to inject the dll? If you hooked a window message proc or loop, take note that you can send messages to windows in other processes and use the WM_COPYDATA message to get info back. You won't ever be able to invoke a function in another process from outside of that process. You can, along with the injected dll, insert a message handler into the message proc of the hooked window and with that in place send that window messages and so on.

Share this post


Link to post
Share on other sites
Ok, I use MadCodeHook to do the injection.

Program1 is a program that I inject into. This program has a function I need to call but have to do so by its pointer since its compiled and I dont have the source.

InjectDll is a DLL that gets injected into Program1. Its in this DLL that I export a procedure that when invoked calls the function in program1.

If you were asking if i'm doing a callback, no. Not for the function in program1.

I'm not sure how I can put in a message handler in the injected DLL. If I place a dialog in the DLL, execution of program1 halts until an event is triggerd in that form/dialog.

I can use IPC but still comes back to allowing the handler and program1 to run simultaneously.

Share this post


Link to post
Share on other sites
Quote:
Original post by PBNut
Ok, I use MadCodeHook to do the injection.


I don't know what that means. MadCodeHook? That sounds like something someone else came up with. This might help identify the approach you're using: Three Ways to Inject Your Code into Another Process.

Quote:
Original post by PBNut
Program1 is a program that I inject into. This program has a function I need to call but have to do so by its pointer since its compiled and I dont have the source.

InjectDll is a DLL that gets injected into Program1. Its in this DLL that I export a procedure that when invoked calls the function in program1.


Ok. Let's call the program that instigates the injection Program 2. When Program 2 invokes the function exported by injectdll, it does so in it's own address space, presuming of course that injectdll is also loaded into Program 2.

Quote:
Original post by PBNut
If you were asking if i'm doing a callback, no. Not for the function in program1.


Ok.

Quote:
Original post by PBNut
I'm not sure how I can put in a message handler in the injected DLL. If I place a dialog in the DLL, execution of program1 halts until an event is triggerd in that form/dialog.


The message handler can be inserted as part of the process of hooking a window in the other process. There are a variety of hooks that can be applied, a couple of them intercept messages.

Quote:
Original post by PBNut
I can use IPC but still comes back to allowing the handler and program1 to run simultaneously.


Ok.

Share this post


Link to post
Share on other sites
To add a little more to the above, code injection is not the easiest task. My advice is to start with something simple, some sample code that you know works and works well with the compiler that you regularly use. The above link provides code for MSVC. You'll probably have to google to find code that works with other compilers. Work with whichever sample you find until you get it to work for you and so that you understand how it works as well. Understanding how the mechanism works is very important because the next step after that is to adapt it to do what you want it to.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Forum Statistics

    • Total Topics
      628281
    • Total Posts
      2981800
  • Similar Content

    • By ForgedInteractive


      Who We Are
      We are Forged Interactive, a small team of like-minded game developers with the sole purpose of making games we love! We're a team of artists, animators, programmers, level designers, writers, composers, producers, and other creative minds. We want to make games that you, the modern gamer want to play! We hope to build a community that enjoys our games as much as we love creating them. With your feedback and support we will be able to achieve that.

      About the Game
      GAME NAME is a fun, action-packed army builder with unique characters, challenges and engaging levels. Set forth on an adventure to protect friends, family and countrymen from new adversaries. Once defeated your enemies turn coat and join you in your adventures. Players can enjoy a range of troops and abilities based on their gameplay style which become more important as maps introduce more challenging terrain, enemies and bosses. Strong orc knights, dangerous shamans, and even a dragon are out on the prowl. Knowing when to fight and when to run, and how to manage your army is essential. Your actions alone decide the fate of this world.

      Previous Work by Team
      Although we are working towards our first game as a team, our team members themselves have past experience in the industry.
      This includes members who have worked on titles including:
      Final Fantasy Kingsglaive, FIFA, Xcom 2 and Civilization.

      Who are we looking for? 3D Modellers Concept Artists Marketing Specialists Level Designer

      What do we expect? Reference work or portfolio. Examples what have you already done and what projects you have worked on academic or otherwise. The ability to commit to the project on a regular basis. If you are going on a two-week trip, we don't mind, but it would be good if you could commit 10+ hours to the project each week. Willingness to work with a royalty based compensation model, you will be paid when the game launches. Openness to learning new tools and techniques
      What can we offer? Continuous support and availability from our side. You have the ability to give design input, and creative say in the development of the game. Shown in credits on websites, in-game and more. Insight and contacts from within the Industry.
      Contact
      If you are interested in knowing more or joining. Please email or PM us on Skype. Myself or Colin will reply to you within 48 hours.

      E-mail: Recruitment@ForgedInteractive.com
      Skype: ForgedInteractive

      Regards,
      David and Colin

      Follow us on:

      Facebook: https://www.facebook.com/ForgedInteractive/
      Twitter: @ForgedInteract
      Youtube: https://www.youtube.com/channel/UCpK..._as=subscriber
      Reddit: https://www.reddit.com/user/Forged_Interactive/
    • By Eck
      I just saw their courses were knocked down to $10 each and figured I'd share the info here. They have stuff for Unity, Unreal, drawing, business, etc. I haven't used their stuff before, but the previews I looked at seemed pretty good and there is a user review system as well.
      https://www.udemy.com/courses/search/?q=Unity&src=ukw
      - Eck
       
    • By zizulot
      first and only logo , for now
    • By sidbhati32
      I am working on a game in which we control a rectangular box at the bottom of the screen. Three sphere which has alphabets in it fall down. When the game starts, a word is generated from the predefined list of words(which I'll give) and we are supposed to touch the correct sphere having the alphabet based on that word. The question is how to detect if I have touched the correct sphere. 
      secondly, if I have touched a correct sphere before and there is no recurrence of that alphabet in that word then during the second wave the game should not proceed if I touch the same alphabet again.
      Looking forward to your answers, i have to submit this project in a couple of days. please help! (Working on Unity 3D)
      Thanks
    • By NDraskovic
      Hey guys,   As the title says, I'm trying to control a desktop game by using my mobile phone as a controller.  I created two scenes, one that acts as a server, other as a client.    Server has this code: void Start () {         Test = "Nothing yet happened";         NetworkServer.Listen(25000);         NetworkServer.RegisterHandler(888, ServerReceiveMessage);     }         private void ServerReceiveMessage(NetworkMessage message)     {                 StringMessage msg = new StringMessage();         msg.value = message.ReadMessage<StringMessage>().value;         if (!String.IsNullOrEmpty(msg.value))         {             Test = "Message received";             string[] deltas = msg.value.Split('|');             Horizontal = Convert.ToSingle(deltas[0]);             Vertical = Convert.ToSingle(deltas[1]);             TestScript.MoveForward(Vertical);             TestScript.RotateAroundY(Horizontal);         }         else         {             Test = "Nothing received";         }     }  
        And client this:  private void Connect()     {              client.Connect(IPAddress, 25000);           }     void Start () {         client = new NetworkClient();         Connect();            }         void Update () {    #if UNITY_ANDROID         MobileTouches = Input.touches;         if (MobileTouches.Length > 0)         {             for (int i = 0; i < MobileTouches.Length; i++)             {                 if (MobileTouches[i].phase == TouchPhase.Moved)                 {                     Horizontal = MobileTouches[i].deltaPosition.x;                     Vertical = MobileTouches[i].deltaPosition.y;                 }else if(MobileTouches[i].phase == TouchPhase.Stationary)                 {                     Connect();                                  }             }         } #elif UNITY_EDITOR               Horizontal = Input.GetAxis("Horizontal");         Vertical = Input.GetAxis("Vertical"); #endif         thumb.Translate(Vector3.up * Vertical * Time.deltaTime);         thumb.Translate(Vector3.right * Horizontal * Time.deltaTime);         SendControllerInfo();     }     static public void SendControllerInfo()     {         if (client.isConnected)         {             StringMessage msg = new StringMessage();             msg.value = Horizontal + "|" + Vertical;             client.Send(888, msg);         }     }  
        Ip address is hard coded, I just replaced it with the "IpAddress" variable. The code itself builds fine, and when I try to run in on a desktop computer, it works as expected (just a simple movement of an object on the server screen). However when I try to publish the client scene to a mobile device (Android), it doesn't connect to the server. They are both connected to the same network. Can anyone tell me what the problem might be?   Thanks
  • Popular Now