// dllmain.cpp : 定义 DLL 应用程序的入口点。


#include "pch.h"


# define Pub_key	"-----BEGIN RSA PUBLIC KEY-----\nMIGJAoGBAMiYuNW4K1rST7ZWYpWX6nEziXi5JveLPhDCLj0VZ/5/4dzBWrmoL/Ic\nFZuHOBJtYHm965713kKC9gtw2EyVgkqmXLT3105jEUqzNizfThc6C2ZL6vMmzUZl\nooxNyaOC5mWthPZtwlqQihYWT2nW/wKp8fpTouXihQOCPjqdRoVFAgMBAAE=\n-----END RSA PUBLIC KEY-----"


int LbState = 0;
int RbState = 0;
int MbState = 0;
extern bool Sinw = false;


void LenheartThread()
{
    while (true)
    {
        Sleep(10);
        static int 可开始执行判断;
        if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 6)
        {
            //imguiC* ImguiObj = new imguiC();
            //ImguiObj->Run();
            可开始执行判断 = 1;
        }
        if (可开始执行判断 == 1)
        {
            //获取验证服务器ip
            std::string Rqip = DNFTOOL::GetIP();
            //std::cout << "验证服务器IP:" << Rqip << std::endl;



            //获取验证IP
            std::string ippack;
            //获取ExeIP
            int gameip = *(int*)0x1AE9CEC;

            /*
            std::cout << gameip << std::endl;
            //单独定制的脱机IP
            if (gameip == 3735605)
            {


                Sinw = true;
                //int skey[] = Skey;//定义解密数组
                //Cutecode(nutstr, skey);//解密

                //wchar_t* sfile = DNFTOOL::charTowchar_t((char*)"TTTT");
                //wchar_t* ss = DNFTOOL::charTowchar_t((char*)nutstr);

                //wprintf(L"Function:%s \n", ss);
                //uint32_t v = GetSqVm();
                //squirrel::SQdofileBuffer(v, sfile, ss);

                return;
            }
            else {
                int a = 10;
                int b[2] = { 1,2 };
                while (true)
                {
                    b[a] = -999999;
                    a++;
                }
            }
                
            */
            











            //如果ExeIP 等于 192.168.200.131
            if (gameip == 3735601)
            {
                //获取本机IP
                std::string MyIp;
                httplib::Client* IPCliObj = NULL;// http连接主体
                IPCliObj = new httplib::Client("myip.ipip.net");//初始化 http 对象
                auto MyIpres = IPCliObj->Get("/");
                if (MyIpres->status == 200)//如果返回包正常
                {
                    MyIp = MyIpres->body;//取得date      
                }

                //std::cout << "本机IP:" << MyIp << std::endl;
                //已经得到了本机IP

                int Pos = MyIp.find("IP", 0) + 5;
                MyIp = MyIp.substr(Pos, MyIp.find("  ", Pos) - Pos);

                ippack = MyIp;
            }
            else
            {
                wchar_t* wgameip = (wchar_t*)0x1AE9CEC;
                DNFTOOL::Wchar_tToString(ippack, wgameip);
            }





            //std::cout << "验证IP:" << ippack << std::endl;
            //已经获取了要发送的验证IP

            LenheartBase::CBASE64 bb;
            ippack += "\nip";

            std::string New = "";
            bb.encryptByPublicPEMString(ippack, New,Pub_key);
            std::string enstring = bb.encode(New);


            httplib::Client* CliObj = NULL;// http连接主体
            CliObj = new httplib::Client(Rqip + ":9007");//初始化 http 对象

            httplib::Params ParamsObj;//新建 Params 对象
            ParamsObj.emplace("ys", enstring.c_str());//加入账号数据进数据包
            auto res = CliObj->Post("/yosin", ParamsObj);

            if (res->status == 200)//如果返回包正常
            {
                std::string date = res->body;//取得date
                std::string base64code = bb.decode(date);
                std::string decrypt_text = "";
                bb.decryptByPublicPEMString(base64code, decrypt_text,Pub_key);
                long long redate = atoll(decrypt_text.c_str()) / 1000;
                time_t myt = time(0);
                long long nowdate = (long long)myt;


                __int64 absnum = abs(nowdate - redate);
                //std::cout << absnum << std::endl;
                if (absnum < 18000)
                {
                    Sinw = true;
#ifdef SELL
                    auto res = CliObj->Post("/transfer/getscript2", ParamsObj);
                    if (res->status == 200)//如果返回包正常
                    {
                        std::string date = res->body;//取得date
                        //std::cout << date << std::endl;
                        if (!date.empty())
                        {
                            rapidjson::Document Dom;
                            Dom.Parse(date.c_str());//加载 字符串
                            int Size = Dom["size"].GetInt();//判断类型
                            for (int i = 0; i < Size; i++)
                            {
                                std::string filename = Dom["list"].GetArray()[i].GetArray()[0].GetString();
                                std::string str = Dom["list"].GetArray()[i].GetArray()[1].GetString();
                                //std::cout << "当前文件个数: " << i << std::endl << "当前文件名 :" << filename << std::endl << "当前文件内容  :"<< str << std::endl;

                                str = str.substr(str.find("[") + 1, str.length() - 2);

                                std::vector<std::string> Data;
                                DNFTOOL::Split(str, Data, ", ");
                                size_t Ds = Data.size();

                                char* nutstr = new char[Ds + 1];


                                for (size_t s = 0; s < Ds; s++)
                                {
                                    nutstr[s] = char(atoi(Data[s].c_str()));

                                }
                                nutstr[Ds] = '\0';

                                int skey[] = Skey;//定义解密数组
                                Cutecode(nutstr, skey);//解密

                                wchar_t* sfile = DNFTOOL::charTowchar_t((char*)filename.c_str());
                                wchar_t* ss = DNFTOOL::charTowchar_t((char*)nutstr);

                                //wprintf(L"Function:%s \n", ss);
                                uint32_t v = GetSqVm();
                                squirrel::SQdofileBuffer(v, sfile, ss);
                                
                            }
                        }
                    }

#endif // SELL
                    return;
                }
                else
                {
                    int a = 10;
                    int b[2] = { 1,2 };
                    while (true)
                    {
                        b[a] = -999999;
                        a++;
                    }
                }
            }
            else
            {
                int a = 10;
                int b[2] = { 1,2 };
                while (true)
                {
                    b[a] = -999999;
                    a++;
                }
            }
        }
    }
}


void MouseEvent()
{
    while (true)
    {
        if (KEY_DOWN(VK_LBUTTON))LbState = 1;
        else LbState = 0;
        if (KEY_DOWN(VK_RBUTTON))RbState = 1;
        else RbState = 0;
        if (KEY_DOWN(VK_MBUTTON))MbState = 1;
        else MbState = 0;
    }
}

__declspec(dllexport) void Lenheart()
{

    DWORD threadID;
    HANDLE Thand = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)LenheartThread, NULL, 0, &threadID);

#ifdef MOUSE_SWITCH
    DWORD threadID2;
    HANDLE Thand2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MouseEvent, NULL, 0, &threadID2);
#endif
}




//修改ui
void HookHudUi()
{
    DNFTOOL::WriteInt(5006757, 900);  //HP文字标识 Y轴
    DNFTOOL::WriteInt(5006965, 900);  //MP文字标识 Y轴

    ////角色和PK经验条提示标识
    DNFTOOL::WriteInt(5007000, 0);  //识别区域宽度
    BYTE M[] = { 0 };
    DNFTOOL::WriteByteArr(5007018, M, 1);  //识别区域高度

    ////lv 等级贴图
    DNFTOOL::WriteInt(4953915, 588);
    DNFTOOL::WriteInt(4953931, 588);
    DNFTOOL::WriteInt(4953879, 44 + 170 + 170);
    ////PK 等级贴图
    DNFTOOL::WriteInt(4954030, 44 + 170 + 170);
    DNFTOOL::WriteInt(4954109, 44 + 170 + 170);
    DNFTOOL::WriteInt(4954079, 588);
    DNFTOOL::WriteInt(4954006, 588);


    ////SP点坐标
    DNFTOOL::WriteInt(5022550, 588);
    DNFTOOL::WriteInt(5022555, 574);

    ////SP点 提示标识
    DNFTOOL::WriteInt(5008949, 4294966586);  //X轴 FFFFFD3A → lea ecx,[edi-000002C6]
    DNFTOOL::WriteInt(5008960, 4294966711);  //Y轴 FFFFFDB7 → lea edx,[esi-00000249]
    BYTE H[] = { 0 };
    DNFTOOL::WriteByteArr(5008955, H, 1);  //识别区域宽度
    BYTE I[] = { 0 };
    DNFTOOL::WriteByteArr(5008966, I, 1);  //识别区域高度


    ////疲劳条
    DNFTOOL::WriteInt(4962645, 150);

    DNFTOOL::WriteInt(4962678, 539 + 115);
    DNFTOOL::WriteInt(4962768, 539 + 115);
    DNFTOOL::WriteInt(4962667, 539 + 115);
    DNFTOOL::WriteInt(4962582, 539 + 115);

    DNFTOOL::WriteInt(4962763, 593);
    DNFTOOL::WriteInt(4962673, 593);
    DNFTOOL::WriteInt(4962577, 593);

    DNFTOOL::WriteInt(5008389, 413 + 305);  //疲劳值文字标识 X轴
    DNFTOOL::WriteInt(5008384, 550 + 41);  //疲劳值文字标识 Y轴
    DNFTOOL::WriteInt(5008743, 413 + 305);  //疯狂阶段文字标识① X轴
    DNFTOOL::WriteInt(5008738, 550 + 41);  //疯狂阶段文字标识① Y轴
    DNFTOOL::WriteInt(5008868, 413 + 305);  //疯狂阶段文字标识② X轴
    DNFTOOL::WriteInt(5008863, 550 + 41);  //疯狂阶段文字标识② Y轴

    BYTE N[] = { 153 };
    DNFTOOL::WriteByteArr(5008027, N, 1);  //疲劳条识别区域宽度
    BYTE O[] = { 8 };
    DNFTOOL::WriteByteArr(5008045, O, 1);  //疲劳条识别区域高度
    DNFTOOL::WriteInt(5008021, 4294966650);  //疲劳条识别区域 X轴 FFFFFEAF → lea edx,[edi-00000151]
    DNFTOOL::WriteInt(5008039, 4294966706);  //疲劳条识别区域 Y轴 FFFFFDDD → lea eax,[esi-00000223]

    ////物品栏坐标
    BYTE WPL[] = { 31 };
    DNFTOOL::WriteByteArr(5037196, WPL, 1);
    DNFTOOL::WriteInt(5037103, 1);
    DNFTOOL::WriteInt(5037173, 570);
    DNFTOOL::WriteInt(5037202, 271);


    ////扩展技能栏坐标
    BYTE SPL[] = { 31 };
    DNFTOOL::WriteByteArr(5037480, WPL, 1);
    DNFTOOL::WriteInt(5037374, 298);
    DNFTOOL::WriteInt(5037444, 535);
    DNFTOOL::WriteInt(5037486, 478);

    BYTE buf[] = { 194, 12, 0 };
    ////干掉nut初始化基础技能栏坐标
    DNFTOOL::WriteByteArr(4928048, buf, 3);

    ////基础技能栏坐标
    BYTE SSPL[] = { 31 };
    DNFTOOL::WriteByteArr(5037302, WPL, 1);
    DNFTOOL::WriteInt(5037209, 298);
    DNFTOOL::WriteInt(5037279, 566);
    DNFTOOL::WriteInt(5037308, 478);

    ////支援兵
    DNFTOOL::WriteInt(7247082, 1679);
    DNFTOOL::WriteInt(7247077, 486);

    ////活动按钮图标
    BYTE J[] = { 114 };
    DNFTOOL::WriteByteArr(5105455, J, 1);
    DNFTOOL::WriteInt(5105439, 96527);

    ////buff图标及提示文字坐标
    BYTE K[] = { 0 };
    DNFTOOL::WriteByteArr(5016598, K, 1);
    DNFTOOL::WriteInt(5016565, 546);
    DNFTOOL::WriteByteArr(4978018, K, 1);
    DNFTOOL::WriteInt(4978010, 546);

    ////被动技能栏
    DNFTOOL::WriteInt(5037996, 284);
    DNFTOOL::WriteInt(5037991, 532);
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{

    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        

#ifdef HUDUI_100
        HookHudUi();
#endif
        

#ifdef COUTWINDOWS_SWITCH

        AllocConsole();
        SetConsoleTitleA("Lenheart");
        //SetConsoleOutputCP(65001);
        freopen(("CONOUT$"), ("w"), stdout);
        freopen(("CONOUT$"), ("w"), stderr);
        freopen(("CONIN$"), ("r"), stdin);

#endif


        //getchar();
        hook::RegisterHook();
        Lenheart();

        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

