• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Programmer Edit skills menu (add stamina) in Tibianic DLL client - 50$

I think it should work
but there is a way to get the current dialog pointer
LUA:
    DialogPtr = 0x67B9F4,
    DialogLeft = 0x14,
    DialogTop = 0x18,
    DialogWidth = 0x1C,
    DialogHeight = 0x20,
    DialogCaption = 0x50,
void Render(int nSurface){
    int* DialogPointer = (int*)DialogPtr;

    if ((int)*DialogPointer != 0)

    {

        int dialog = *DialogPointer;

        char* DialogCaptionStr = (char*)(dialog + DialogCaption);

        int DialogLeftInt   = *(int*)(dialog + DialogLeft);
        int DialogTopInt    = *(int*)(dialog + DialogTop);
        int DialogWidthInt  = *(int*)(dialog + DialogWidth);
        int DialogHeightInt = *(int*)(dialog + DialogHeight);

        if (DialogCaptionStr && std::string(DialogCaptionStr) == "Enter Game")
        {

            //add your stuff here, can add buttons or anything

            Painter::drawSkin(nSurface, DialogLeftInt + 20, DialogTopInt + DialogHeightInt - 20, DialogWidthInt - 20, 2, 142, 0, 3);

            g_dll.m_newButtons->setPosition(DialogLeftInt + 20, DialogTopInt + DialogHeightInt - 20);

        }

    }
}
DialogPtr is the pointer used in HasDialog()
Hi SpiderOT,

Thanks for the tips and information.

I studied what you explained and finally understood the logic: getting the original CipSoft colors, dialog pointer, and other client data.

After that, I managed to create my own DLL and implement these features:

  • Mounts
  • Frame groups
  • Idle animations
  • Mount window

For other features, using my own DLL seems to be the right path.

At first I thought it would be much harder and more complex, but after studying it, I understood the logic. The process was simpler than I expected.

Thanks again for the help.

 
Hello SpiderOT, Mateus

It is really great to see your results

Would you maybe be willing to share a bit more about how you got started with reverse engineering the Tibia client?

For example, it would be really useful to know:
  • which tools you use - your stack
  • what your general workflow looks like
  • whether you recommend any tutorials, YouTube channels or other learning materials
  • and maybe some of the discoveries or notes you made along the way
It does not have to be a complete tutorial. Even a few pointers, screenshots, example addresses or explanations of how you approach finding functions, pointers, colors, dialogs etc could help a lot.

I do not think that sharing some general knowledge or workflow would suddenly make everyone able to reproduce everything you have already done or plan to. It is still a fairly complex topic that most people would probably never attempt. However, for the small percentage of people genuinely interested in learning it such information could be an extremely valuable starting point.

Maybe over time this could become a small knowledge base or reverse engineering compendium here on OTLand. That way, every new person interested in the topic would not have to start and learn the same things again completely from the scratch.

I think many people would really appreciate even a small intro to the process.

Cheers and keep up the great work!
 
Hello SpiderOT, Mateus

It is really great to see your results

Would you maybe be willing to share a bit more about how you got started with reverse engineering the Tibia client?

For example, it would be really useful to know:
  • which tools you use - your stack
  • what your general workflow looks like
  • whether you recommend any tutorials, YouTube channels or other learning materials
  • and maybe some of the discoveries or notes you made along the way
It does not have to be a complete tutorial. Even a few pointers, screenshots, example addresses or explanations of how you approach finding functions, pointers, colors, dialogs etc could help a lot.

I do not think that sharing some general knowledge or workflow would suddenly make everyone able to reproduce everything you have already done or plan to. It is still a fairly complex topic that most people would probably never attempt. However, for the small percentage of people genuinely interested in learning it such information could be an extremely valuable starting point.

Maybe over time this could become a small knowledge base or reverse engineering compendium here on OTLand. That way, every new person interested in the topic would not have to start and learn the same things again completely from the scratch.

I think many people would really appreciate even a small intro to the process.

Cheers and keep up the great work!
Hey Acedb,

I saw your question a few days ago, but I wanted to take some time to review everything properly before replying.

I am still learning reverse engineering and Assembly, so I would not call myself an expert. I started mostly from examples shared by SpiderOT, then used Visual Studio, dumpbin, AI, and a lot of trial and error.

My workflow is usually something like this:

  • Start from a known address, function, or code example.
  • Find the related code in the Tibia.exe disassembly.
  • Run the client and reproduce the action I want to analyze.
  • Check CALLs, JMPs, registers, pointers, memory, and the call stack.
  • Compare what the client is doing with my DLL code.
  • Change one small thing, rebuild, test, and repeat.

I only understand the basics of Assembly, such as MOV, CALL, JMP, PUSH, CMP, and RET. AI helps me read unfamiliar code, understand possible function behavior, and suggest changes, but nothing is automatic. I still need to compile, run the client, test everything manually, and fix crashes or incorrect behavior.

Sometimes an address looks correct but belongs to another client version. Other times the calling convention, pointer, offset, or overwritten bytes are wrong. In those cases, I go back to the disassembly, compare the instructions again, make another change, and retest.

SpiderOT’s examples helped me understand how the client handles colors, dialog pointers, window positions, captions, and drawing functions. From there, I gradually managed to work on mounts, frame groups, idle animations, and the custom mount window.

I did not follow one specific tutorial. Most of what I learned came from public code examples, SpiderOT’s guidance, Visual Studio debugging, dumpbin, AI assistance, and many hours of testing.

I may organize some screenshots and small notes later showing the basic workflow, because that would probably be easier to understand than explaining everything only through text.

Cheers,
Mateus
Post automatically merged:

Also, if you are not planning to use ElfBot, I would recommend starting with TFC:


It is written in C++, lightweight, open source, and very close to the original CIP 8.6 client. The full source code is already available, so you can download it, compile it, test it, and then modify anything you want.

It is a much easier base to work with than reverse engineering the original client from scratch. Take a look at it — I think you may like the project.
 
Back
Top