Cheat Engine Forum Index Cheat Engine
The Official Site of Cheat Engine
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 


Easy DLL Maker?

 
Post new topic   Reply to topic    Cheat Engine Forum Index -> General programming
View previous topic :: View next topic  
Author Message
MUSTARD
Advanced Cheater
Reputation: 0

Joined: 26 Oct 2007
Posts: 56
Location: SPAM SECTION

PostPosted: Wed Jan 23, 2008 6:54 pm    Post subject: Easy DLL Maker? Reply with quote

No one will answer in the Two sections i need them to. VERY UNPOPULAR.
(GunZ and GB) So, i will ask you guys, where can i find an Easy DLL Maker?
Everyone is just saying VB6 and C++. i have Both, I know both, but i fail. anything easier?

_________________
Back to top
View user's profile Send private message
lurc
Grandmaster Cheater Supreme
Reputation: 2

Joined: 13 Nov 2006
Posts: 1900

PostPosted: Wed Jan 23, 2008 6:57 pm    Post subject: Reply with quote

C/C++ and ASM are probably your best bet to make a dll, nothing is easy, unless you work to learn it. from there it gets easier.

what do u need help with in C++?

_________________
Back to top
View user's profile Send private message
MUSTARD
Advanced Cheater
Reputation: 0

Joined: 26 Oct 2007
Posts: 56
Location: SPAM SECTION

PostPosted: Wed Jan 23, 2008 7:10 pm    Post subject: Reply with quote

lurc wrote:
C/C++ and ASM are probably your best bet to make a dll, nothing is easy, unless you work to learn it. from there it gets easier.

what do u need help with in C++?


pretty much everything. i have some books. they no help. what do you know? PM me of list of what you know Very Happy

_________________
Back to top
View user's profile Send private message
wunder312355
Grandmaster Cheater
Reputation: -1

Joined: 14 May 2007
Posts: 568

PostPosted: Wed Jan 23, 2008 7:19 pm    Post subject: Reply with quote

Look for a post in the maplestory section for C++. Its great, and thats where I learned most of my C++. Its probably not too deep in there.
Back to top
View user's profile Send private message
hcavolsdsadgadsg
I'm a spammer
Reputation: 26

Joined: 11 Jun 2007
Posts: 5801

PostPosted: Wed Jan 23, 2008 11:54 pm    Post subject: Reply with quote

Wiccaan wrote a nice tutorial about DLLs.

http://www.extalia.com/forums/viewtopic.php?f=32&t=2795
Back to top
View user's profile Send private message
lurc
Grandmaster Cheater Supreme
Reputation: 2

Joined: 13 Nov 2006
Posts: 1900

PostPosted: Thu Jan 24, 2008 10:52 am    Post subject: Reply with quote

slovach wrote:
Wiccaan wrote a nice tutorial about DLLs.

http://www.extalia.com/forums/viewtopic.php?f=32&t=2795


lol i was gonna post that last night, but CEF died again, and i had to study for my science exam... so i just gave up on trying to get back into CEF Razz

_________________
Back to top
View user's profile Send private message
atom0s
Moderator
Reputation: 205

Joined: 25 Jan 2006
Posts: 8587
Location: 127.0.0.1

PostPosted: Thu Jan 24, 2008 7:37 pm    Post subject: Reply with quote

Aww thanks for the feedback Razz

Anyway, what exactly are you looking to do in your DLL, MUSTARD. There are certain things you cannot do natively in VB6 or .NET without hacking the linker to compile a different way.

_________________
- Retired.
Back to top
View user's profile Send private message Visit poster's website
FerrisBuellerYourMyHero
Master Cheater
Reputation: 0

Joined: 14 Feb 2007
Posts: 401
Location: Inside your <kernel>

PostPosted: Fri Jan 25, 2008 2:42 pm    Post subject: Re: Easy DLL Maker? Reply with quote

MUSTARD wrote:
No one will answer in the Two sections i need them to. VERY UNPOPULAR.
(GunZ and GB) So, i will ask you guys, where can i find an Easy DLL Maker?
Everyone is just saying VB6 and C++. i have Both, I know both, but i fail. anything easier?



EDIT: ok now it can return a value either true or false, 1 or 0... but Like I was trying to get at, "EasyDLL()" Is not meant to be used like a function, It is just the main thread, meant to be running 100% of the time, its purpose is to be an infinite loop! not to return values... It will never get to the "return TRUE;" 's because I will never let it break out of the infinite loop... Because If I wanted to terminate the thread I would also want to FreeLibrary on the DLL as well, so instead of making the END key "break;" I make it free library and exit thread... We just have different programming styles that's all, both ways are correct, you just have no way of unloading the DLL from within it...


lol EASY DLL MAKER? wow I never thought I'd hear the term! If your looking for a program that you can just click here and click there and have a working trainer DLL your mistaken! nothing exists like that and I don't think there ever will be ! because its much easier to just code a DLL, then to code a program that can make DLL's like that!(plus it wouldn't be very customizable like you can code a DLL to be)

think of a DLL as like a mini-EXE it cannot run on its own, it requires an executable to call LoadLibrary on it!

its very simple to create a DLL in C++!(I find it harder in delphi and MASM)

Ill show you just how EASY it is to make a DLL! but you must put some effort into it! This will put you off to a great start if you realize it! no one ever did this for me! I had to scour the interwebs for hours to figure this out!

Create an empty Win32 DLL project called "EasyDLL" create a new .cpp file called "EasyDLL.cpp" and add it to the project.

start off with your basic DLL skeleton:

Code:

// EasyDLL.cpp : Defines the entry point for the DLL application.
#include "windows.h"
#include <iostream>
#define JMP(frm, to) (int)(((int)to - (int)frm) - 5);

using namespace std;

bool EasyDLL(void)
{
   MessageBoxA(0,"Welcome to my Very EasyDLL trainer!", "Mini-Trainer", 0);

   for(;;)
   {
      Sleep(10);

      if(GetAsyncKeyState(VK_END))
      {
            MessageBoxA(0, "Ejecting...", ".:::1337:::.", 0);
            Sleep(100);
            HINSTANCE hMod = GetModuleHandleA("EasyDLL.dll");
            FreeLibraryAndExitThread(hMod, 0);
      }

   }
     return TRUE;

}



BOOL APIENTRY DllMain(HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
   if (ul_reason_for_call == DLL_PROCESS_ATTACH)
   {
      CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&EasyDLL, 0, 0, 0);
   }
   return true;
}




Now at this point, all it will do when injected into a process is create your MainThread(its important) then the main thread will popup a messagebox alerting the user of its presence... then will end up in an infinite loop which waits for the END key to be pressed! if its pressed the DLL will be unloaded from the process and the thread terminated! I do this so I can test my dll over and over again without having to end the whole process! I can just press END and then inject it again!(of course you can remove it once you get it working good with no bugs)


Next we will add in 1 hack and show how to toggle it on/off! Im not sure if your familiar with maple but it doesn't matter you can do it like this to change the memory of any process which its injected into...


Code:

// EasyDLL.cpp : Defines the entry point for the DLL application.
#include "windows.h"
#include <iostream>
#define JMP(frm, to) (int)(((int)to - (int)frm) - 5); // this will come in handy for script hacks

BYTE OrginalBytes[2];
bool SuperTubi = 0;

using namespace std;

bool EasyDLL(void)
{
   MessageBoxA(0,"Welcome to my Very EasyDLL trainer!", "Mini-Trainer", 0);

   

   memcpy((void*)OriginalBytes, (void*)0x004AA29B, 2);

   for(;;)
   {
      Sleep(10); // DONT REMOVE! REQUIRED FOR ANTI-LAG AKA NON 100% CPU usage

      if(GetAsyncKeyState(VK_F12)) // OUR FIRST HACK! a simple byte change hack!
      {
         if(SuperTubi == 0)
         {
            *(WORD*)0x004AA29B = 0x9090; // MapleStory Super Tubi Address V49
            SuperTubi = 1;
         }
         else if(SuperTubi == 1)
         {
            memcpy((void*)0x004AA29B, (void*)OriginalBytes, 2);
            SuperTubi = 0;
         }

         Sleep(200); // So it doesn't get pressed twice or more in 1 press
                // we make it wait 200ms before it can be pressed again...
      }   

      if(GetAsyncKeyState(VK_END))
      {
            MessageBoxA(0, "Ejecting...", ".:::1337:::.", 0);
            Sleep(100);
            HINSTANCE hMod = GetModuleHandleA("EasyDLL.dll");
            FreeLibraryAndExitThread(hMod, 0);
      }

   }

     return TRUE;

}



BOOL APIENTRY DllMain(HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
   if (ul_reason_for_call == DLL_PROCESS_ATTACH)
   {
      CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&EasyDLL, 0, 0, 0);
   }
   return true;
}




for extra fun you could code the memory altering in inline ASM!

instead of

*(WORD*)0x004AA29B = 0x9090;

you could do:

Code:

_asm
{
   push eax
   mov eax, 0x004AA29B
   mov word ptr [eax], 0x9090
   pop eax
}


which will have exactly the same effect!

and to undo it instead of this:

memcpy((void*)0x004AA29B, (void*)OriginalBytes, 2);

you would do:

Code:

_asm
{
   push eax
   push ecx
   mov eax, 0x004AA29B
   mov ecx, word ptr [OriginalBytes]
   mov [eax], ecx
   pop ecx
   pop eax
}



more code but, more fun right?

well anyway this brings me to my last example! THE SCRIPT HACK!!!

its not as complicated as you may think! see how we did that inline asm for the simple two byte change? we will use that for script hacks too!


heres how you would do the player stat hook in maplestory v49(the address you hook to read the player hp/mp/exp values from the stack)

Code:

// EasyDLL.cpp : Defines the entry point for the DLL application.
#include "windows.h"
#define JMP(frm, to) (int)(((int)to - (int)frm) - 5); // this will come in handy for script hacks

BYTE OrginalBytes[2];
bool SuperTubi = 0;

int currenthp, maxhp, currentmp, maxmp, currentexp, maxexp;
unsigned long StatCALL = 0x006838BA, HookAddress = 0x00683621;


using namespace std;

void __declspec(naked) StatHook() // you need the __declspec(naked) so keep it! this is a hack you don't turn off..
{
  __asm {
   mov eax, [esp+4]
   mov [currenthp],eax
   mov eax, [esp+8]
   mov [maxhp],eax
   mov eax, [esp+0x0C]
   mov [currentmp],eax
   mov eax,[esp+0x10]
   mov [maxmp],eax
   mov eax, [esp+0x14]
   mov [currentexp],eax
   mov eax,[esp+0x18]
   mov [maxexp],eax

   jmp dword ptr [StatCALL]

  }
}

bool EasyDLL(void)
{
   MessageBoxA(0,"Welcome to my Very EasyDLL trainer!", "Mini-Trainer", 0);

   memcpy((void*)OriginalBytes, (void*)0x004AA29B, 2);

   *(BYTE*)HookAddress = 0xE9;
        *(DWORD*)((unsigned long)HookAddress + 1) = JMP(HookAddress, StatHook);

          //OR ->

   _asm
   {
      push eax
      push ecx
      mov eax, dword ptr [HookAddress] // from
      mov ecx, dword ptr [StatHook] // to
      sub ecx, eax // to - from
      sub ecx, 5 // MINUS 5 = DISTANCE TO JUMP!
      mov byte ptr [eax], 0xE8 // E8 = CALL
      mov dword ptr [eax+1], ecx // Finish off rest of hook
      pop ecx
      pop eax
   }
      

   for(;;)
   {
      Sleep(10); // DONT REMOVE! REQUIRED FOR ANTI-LAG AKA NON 100% CPU usage

      

      if(GetAsyncKeyState(VK_F12)) // OUR FIRST HACK! a simple byte change hack!
      {
         if(SuperTubi == 0)
         {
            *(WORD*)0x004AA29B = 0x9090; // MapleStory Super Tubi Address V49
            SuperTubi = 1;
         }
         else if(SuperTubi == 1)
         {
            memcpy((void*)0x004AA29B, (void*)OriginalBytes, 2);
            SuperTubi = 0;
         }

         Sleep(200); // So it doesn't get pressed twice or more in 1 press
                // we make it wait 200ms before it can be pressed again...
      }   

      if(GetAsyncKeyState(VK_END))
      {
            MessageBoxA(0, "Ejecting...", ".:::1337:::.", 0);
            Sleep(100);
            HINSTANCE hMod = GetModuleHandleA("EasyDLL.dll");
            FreeLibraryAndExitThread(hMod, 0);
      }

   }
     return TRUE;

}



BOOL APIENTRY DllMain(HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
   if (ul_reason_for_call == DLL_PROCESS_ATTACH)
   {
      CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&EasyDLL, 0, 0, 0);
   }
   return true;
}




So you see it is actually VERY simple to create a dll you just have to THINK! jeez is it really that hard to use your brain for more than just clicking the mouse?

THINK PEOPLE THINK! if everyone used their brain the world would be a more intelligent place! I hope I didn't waste my time and you actually learned something.

_________________
You know, life moves pretty fast. If you don't stop and look around once in a while, You could miss it!



Last edited by FerrisBuellerYourMyHero on Tue Feb 19, 2008 3:49 pm; edited 5 times in total
Back to top
View user's profile Send private message MSN Messenger
atom0s
Moderator
Reputation: 205

Joined: 25 Jan 2006
Posts: 8587
Location: 127.0.0.1

PostPosted: Sun Jan 27, 2008 9:12 am    Post subject: Reply with quote

@FerrisBuellerYourMyHero: Lol you basically typed out what my tut explained. And a few suggestions on your code:

Don't use for(; Wink, give the thread the ability to exit if the DLL wants to unload. Such as:

Code:
while( !bWantsExit )
{
    // Code Here...
}


And in the DLL_PROCESS_DETACH set bWantsExit to true allowing the thread to cleanup and exit.

Also, you should let your thread return a value to signify things went correctly or not. Using void for something isn't always the best way to do things, but usually is the easy way out. Instead using something such as:

Code:
DWORD KeyMonitorThread()
{
    while( !bWantsExit )
    {
        // Other code here...
        Sleep( 10 );
    }
    return 0;
}


You also had an eject hotkey, any specific reason anyone would ever need that? Don't think I have ever seen anyone do that.

Also adding MessageBoxes inside threads is evil >.>

_________________
- Retired.
Back to top
View user's profile Send private message Visit poster's website
FerrisBuellerYourMyHero
Master Cheater
Reputation: 0

Joined: 14 Feb 2007
Posts: 401
Location: Inside your <kernel>

PostPosted: Tue Jan 29, 2008 12:30 pm    Post subject: Reply with quote

Wiccaan wrote:
@FerrisBuellerYourMyHero: Lol you basically typed out what my tut explained. And a few suggestions on your code:

Don't use for(; Wink, give the thread the ability to exit if the DLL wants to unload. Such as:

Code:
while( !bWantsExit )
{
    // Code Here...
}


And in the DLL_PROCESS_DETACH set bWantsExit to true allowing the thread to cleanup and exit.

Also, you should let your thread return a value to signify things went correctly or not. Using void for something isn't always the best way to do things, but usually is the easy way out. Instead using something such as:

Code:
DWORD KeyMonitorThread()
{
    while( !bWantsExit )
    {
        // Other code here...
        Sleep( 10 );
    }
    return 0;
}


You also had an eject hotkey, any specific reason anyone would ever need that? Don't think I have ever seen anyone do that.

Also adding MessageBoxes inside threads is evil >.>



First of all I use a FOR loop because it is FASTER, using a while loop or something similar breaks down into a cmp and a conditional jump in assembler while a FOR loop without any conditions converts into an unconditional JMP! I do it for performance!

Second of all What do you think FREELIBRARYANDEXITTHREAD does? you think its just called that and has no function? lol

it does exactly what it says! It calls free library on the DLL decreasing its reference count, and also EXITS the THREAD, completely removing the dll from existence in that process... So you can make the thread exit and dll unload without needing to slow down performance using a while loop...


3rdly, Whats the point of returning a value if it is not checked or used in anyway? VOID is not the easy way out, comon its not any more difficult to write int instead of void... or bool, or unsigned long, or any other type... I make a basic trainer VOID because it doesn't need to return a value, and it doesn't need any parameters, it will be just 1 running thread the whole time until the user quits the game...

void means either, takes no parameters, or doesn't return a value

case 1: -> [takes no parameters VOID]
Code:

int Add(void)
{
     int *p, a = 5, b = 10, c = 0;

     p = &c;
     
     *p = a + b;

     return c;
}
// for example here is a function it would NOT make sense to make a void
// since then you can't control its output its always the same...

int returnVALUE = 0;

returnVALUE = Add();

// in this case returnVALUE is equal to 15 and always will be unless you change the code in "Add()"



case 2: -> [Doesn't return a value VOID]

Code:


void PostMsg(UINT Msg, WPARAM wParam, LPARAM lParam)
{
      HWND MS = FindWindowA(0, "MapleStory");
      BypassedPostMessage(MS, Msg, wParam, lParam);
}



This example above I would make it a void because I don't care about the return value of BypassedPostMessage As I already know its going to work and send the keystroke/ or other message

for people that are picky! you could make it return a value 1 is if it was successful which is always, or 0 if it failed!

it would be like this

Code:


bool PostMsg(UINT Msg, WPARAM wParam, LPARAM lParam)
{
      HWND MS = FindWindowA(0, "MapleStory");
      bool Success = BypassedPostMessage(MS, Msg, wParam, lParam);

     return Success;
}

// then doing
bool SendSuccess = 0;

SendSuccess = PostMsg(WM_QUIT, 0, 0);

// SendSuccess will be 1 if the message succeeds at sending which it will...
// maplestory will then quit


So you see void is not an "EASY" way out, it is simply When you don't care about getting a return value, or you don't want the function to have parameters that can be changed...

Wiccaan wrote:
You also had an eject hotkey, any specific reason anyone would ever need that? Don't think I have ever seen anyone do that.

Also adding MessageBoxes inside threads is evil >.>


The Eject hotkey is so that I can TEST, and RE-TEST my dll without having to quit the process to try again... example... Say I compile version 1 of my dll, then inject into process 1, now the dll is in there, if I make a change to my dll and recompile, now the old dll will not overwrite because it is in use, and if I inject dll 2 into the process, then there will be two dlls injected, dll 1 and 2... so by EJECTING the first dll I can inject the second one for testing without the other one messing it up... THATS WHY!

And also so that I can make the dll EXIT THREAD if I want it to quit, without needing to lose speed with a while loop(which is completely unessary)


I use functions that aren't voids all the time, I just make my main thread void since its just the main running thread not designed to return...

_________________
You know, life moves pretty fast. If you don't stop and look around once in a while, You could miss it!

Back to top
View user's profile Send private message MSN Messenger
atom0s
Moderator
Reputation: 205

Joined: 25 Jan 2006
Posts: 8587
Location: 127.0.0.1

PostPosted: Tue Jan 29, 2008 2:15 pm    Post subject: Reply with quote

FerrisBuellerYourMyHero wrote:

First of all I use a FOR loop because it is FASTER, using a while loop or something similar breaks down into a cmp and a conditional jump in assembler while a FOR loop without any conditions converts into an unconditional JMP! I do it for performance!


Umm no? A while is basically the same and where does this compare come in? A basic loop:

Code:
while( !bWantsExit )
{
  // other code
  Sleep( 10 );
}


Code:
00401000   $  56            PUSH ESI
00401001   .  8B35 00204000 MOV ESI,DWORD PTR DS:[<&KERNEL32.Sleep>] ;  kernel32.Sleep
00401007   >  6A 0A         PUSH 0A
00401009   .  FFD6          CALL ESI
0040100B   .^ EB FA         JMP SHORT asdf.00401007


I see no compare.

Then your suggestion:

Code:
   for(; ;)
   {
      Sleep( 10 );
   }


Code:
00401000   $  56            PUSH ESI
00401001   .  8B35 00204000 MOV ESI,DWORD PTR DS:[<&KERNEL32.Sleep>] ;  kernel32.Sleep
00401007   >  6A 0A         PUSH 0A
00401009   .  FFD6          CALL ESI
0040100B   .^ EB FA         JMP SHORT asdf.00401007


Compiler converts the code to the same thing. So there is no performance gain or loss doing it either way, other then "better practice" and suggested methods of doing a loop.

As for FreeLibraryAndExitThread, yes I know what it does, but it's in a hotkey. Which you just said now is for testing meaning your actual code, finished, wouldn't have that leaving you with no exit case. Which is what I was referring to.

And for returning a value, yes your code might not show it being checked but thats why you would recode things a little different. Returning a value allows you to have better error handling as well as "debugging" to understand whats going wrong with your program. Just because you don't think it's a good method of doing something doesn't mean it isn't or that others might not find it useful.

Anything that calls an API that has a return value should also return a value to allow you to see if the API succeeded or not. As well as if any other functions performed before and after finished successfully too.

I know what void means as well.




FerrisBuellerYourMyHero wrote:
This example above I would make it a void because I don't care about the return value of BypassedPostMessage As I already know its going to work and send the keystroke/ or other message


See this is just ignorance in your own manner. You expect something to work just because it did once when testing. That doesn't mean it doesn't have the ability to fail later on, or for anyone else that might use the code.

FerrisBuellerYourMyHero wrote:
So you see void is not an "EASY" way out, it is simply When you don't care about getting a return value, or you don't want the function to have parameters that can be changed...


When you simply don't care? Meaning you want to make something quick and easy, aka the easy way out. You are trying to argue this point with me when it's basically clear as day that there is no reason for you to not code it to return a value other then being lazy and taking the easy way out.

(Typing in caps and using bold doesn't make you look smarter just so you know. Wink)


The first part of my post simply said suggestions, no reason for you to get butt-hurt over someone elses opinion.

_________________
- Retired.
Back to top
View user's profile Send private message Visit poster's website
FerrisBuellerYourMyHero
Master Cheater
Reputation: 0

Joined: 14 Feb 2007
Posts: 401
Location: Inside your <kernel>

PostPosted: Tue Jan 29, 2008 5:14 pm    Post subject: Reply with quote

whoa ho hoe!!!

YOU ARE WRONG!


Sorry but you are! appalsap said this a long time ago! And I Trust Her! And Ive even double checked my self! you thought I wouldn't check eh? Those Two are the same EXE without anything changed!! what do you think checks to see if that variable == 1?

your pretty much saying (WHILE bWantsExit == 0) Loop forever! but you NEVER unload the dll ever so bWantsExit is always zero! MIGHT AS WELL MAKE IT A FOR LOOP! since its infinite anyway ( because even infinite loops can be broken you should know that)

Its Proper Coding for an infinite loop...

So what do you think checks if bWantsExit == 1? You really think its not checked? then how does it know when bWantsExit == 1!! oh it's checking alright, its checking every 10 miliseconds if it equals 1, which is a waste... since it never equals 1...

I'll Prove It!

take a look at this code for a simple console app...

Code:

#include "windows.h"
#include <iostream>
#include <stdio.h>
#define WIN32_LEAN_AND_MEAN
#pragma comment(linker, "/ENTRY:main")

using namespace std;
bool bWantsExit = 0;

int main(void)
{
   DWORD var = 0;
   DWORD *pt = &var;
   
   __asm
   {
      call EIPget

EIPget:
      pop eax
      add eax, 0x3D //offset to get to while loop
      mov dword ptr [var], eax
   }

   LPVOID hex = (DWORD*)*pt;

   cout<<"GOTO ADDRESS: "<< hex<<"\n";

   while(!bWantsExit)
   {
      Sleep(10);
   
   }
   return 1;
}



It gives you the address of the while loop which wastes time checking if bWantsExit == 1, then sleeps then jumps back the first address again to continue! don't believe it run the program and use CE, or look at my pictures...





and olly->



Now change it like this:

Code:

#include "windows.h"
#include <iostream>
#include <stdio.h>
#define WIN32_LEAN_AND_MEAN
#pragma comment(linker, "/ENTRY:main")

using namespace std;

int main(void)
{
   DWORD var = 0;
   DWORD *pt = &var;
   
   __asm
   {
      call EIPget

EIPget:
      pop eax
      add eax, 0x3D // offset to get to for loop
      mov dword ptr [var], eax
   }

   LPVOID hex = (DWORD*)*pt;

   cout<<"GOTO ADDRESS: "<< hex<<"\n";

   for(;;)
   {
      Sleep(10);
   
   }
   return 1;
}


NO MORE TEST EDX,EDX HAHA Wink

olly too->




Ok so you were wrong! just admit it!

And it your tutorial you neglected to mention anything of Intel Inline Assembler! which is very important! I use it combined with c++ code to make everything FAST!

You talk of making things fast! and removing unneeded code, but yet you do things to slow it down! pretty ironic eh?

Its not a matter of short cutting or laziness, its a matter of not adding in junk code thats unnecessary!!

Wiccaan wrote:

FerrisBuellerYourMyHero wrote:
This example above I would make it a void because I don't care about the return value of BypassedPostMessage As I already know its going to work and send the keystroke/ or other message


See this is just ignorance in your own manner. You expect something to work just because it did once when testing. That doesn't mean it doesn't have the ability to fail later on, or for anyone else that might use the code.



It isn't ignorance! Its a matter of performance! My bot works okay! it posts the fucken messages! It will post the message its a proven fact! when I press auto-attack on, it auto-attacks! why slow it down checking if the message didn't send when it did?


Wiccaan wrote:

FerrisBuellerYourMyHero wrote:
So you see void is not an "EASY" way out, it is simply When you don't care about getting a return value, or you don't want the function to have parameters that can be changed...


When you simply don't care? Meaning you want to make something quick and easy, aka the easy way out. You are trying to argue this point with me when it's basically clear as day that there is no reason for you to not code it to return a value other then being lazy and taking the easy way out.

(Typing in caps and using bold doesn't make you look smarter just so you know. Wink)


Again its not any quicker to write void! there is no "easy" way out! just face it! Its basically clear as day that you don't know what performance means! A main thread doesn't need a return value because it never returns! Its just more unnecessary code!

I KNOW, I TYPE IN BOLD AND CAPS FOR EMPHASIS! because you obviously don't read it otherwise...

bottom line

bWantsQuit is unnecessary! DEAL WIT IT!

Razz

_________________
You know, life moves pretty fast. If you don't stop and look around once in a while, You could miss it!

Back to top
View user's profile Send private message MSN Messenger
samuri25404
Grandmaster Cheater
Reputation: 7

Joined: 04 May 2007
Posts: 955
Location: Why do you care?

PostPosted: Sun Feb 03, 2008 10:11 am    Post subject: Reply with quote

How about this scenario:

Say someone's using your dll for Maplestory.

Let's say that they're playing an Ice/Lightning mage; they just finished repotting, and they've got their teleport skill on the "End" key. They're warping along into the area, when they realize that they're taking damage, and godmode isn't working. Why is that? You have "END" as the eject key.

~~~

As for the while/for argument:

Code:

   while (1==1)
0041137E  mov         eax,1
00411383  test        eax,eax
00411385  je          wmain+29h (411389h)
   {
   }
00411387  jmp         wmain+1Eh (41137Eh)

   for (;;)
   {
   }
00411389  jmp         wmain+29h (411389h)


That's from VS 2005's disassembly of the following C++ code:

Code:

int _tmain(int argc, _TCHAR* argv[])
{
   while (1==1)
   {
   }

   for (;;)
   {
   }

   return 0;
}


I stuck a breakpoint on the while loop and got the output.

Hate to say it, Wicc, but he is right.

I'm not quite sure how you got that disassembly, but whatever.

_________________
Wiccaan wrote:

Oh jeez, watchout I'm a bias person! Locked.


Auto Assembly Tuts:
In Depth Tutorial on AA
Extended
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Cheat Engine Forum Index -> General programming All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2005 phpBB Group

CE Wiki   IRC (#CEF)   Twitter
Third party websites