diff --git a/test/BASE64.cpp b/test/BASE64.cpp index 11caee1..4125055 100644 --- a/test/BASE64.cpp +++ b/test/BASE64.cpp @@ -8,18 +8,22 @@ using namespace LenheartBase; + +// 加解密函数签名 +typedef int (*RSA_encryptOrDecrypt)(int flen, const unsigned char* from, unsigned char* to, RSA* rsa, int padding); + + // 编解码转换表 unsigned char CBASE64::s_encTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; unsigned char CBASE64::s_decTable[] = { - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3E,0xFF,0xFF,0xFF,0x3F, - 0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E, - 0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, - 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0xFF,0xFF,0xFF,0xFF,0xFF -}; + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xFF, 0xFF, 0x3F, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, + 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; // 执行BASE64编码操作 std::string CBASE64::encode(const std::string& str) @@ -103,8 +107,10 @@ int CBASE64::__decode(unsigned char* pDest, const unsigned char* pSrc, size_t nS size_t off = 0; for (; off + 4 <= len; off += 4) { - if ((src[0] > 0x7F) || (src[1] > 0x7F) || (src[2] > 0x7F) || (src[3] > 0x7F)) return (int)(dst - odst); - if ((src[0] == '=') || (src[1] == '=') || (src[2] == '=') || (src[3] == '=')) break; + if ((src[0] > 0x7F) || (src[1] > 0x7F) || (src[2] > 0x7F) || (src[3] > 0x7F)) + return (int)(dst - odst); + if ((src[0] == '=') || (src[1] == '=') || (src[2] == '=') || (src[3] == '=')) + break; l = s_decTable[*src++]; m = s_decTable[*src++]; @@ -150,7 +156,6 @@ int CBASE64::__decode(unsigned char* pDest, const unsigned char* pSrc, size_t nS return (int)(dst - odst); } - std::string CBASE64::RsaPriDecrypt(const std::string& cipher_text, const std::string& pri_key) { std::string decrypt_text; @@ -159,7 +164,8 @@ std::string CBASE64::RsaPriDecrypt(const std::string& cipher_text, const std::st keybio = BIO_new_mem_buf((unsigned char*)pri_key.c_str(), -1); rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL); - if (rsa == nullptr) { + if (rsa == nullptr) + { unsigned long err = ERR_get_error(); //获取错误号 char err_msg[1024] = { 0 }; ERR_error_string(err, err_msg); // 格式:error:errId:库:函数:原因 @@ -174,17 +180,19 @@ std::string CBASE64::RsaPriDecrypt(const std::string& cipher_text, const std::st std::string sub_str; unsigned int pos = 0; // 对密文进行分段解密 - while (pos < cipher_text.length() - 1) { + while (pos < cipher_text.length() - 1) + { sub_str = cipher_text.substr(pos, key_len); memset(sub_text, 0, key_len + 1); ret = RSA_private_decrypt(sub_str.length(), (const unsigned char*)sub_str.c_str(), (unsigned char*)sub_text, rsa, 1); - if (ret >= 0) { + if (ret >= 0) + { decrypt_text.append(std::string(sub_text, ret)); - //printf("pos:%d, Length: %d ,sub: %s\n", pos, cipher_text.length(),sub_text); + // printf("pos:%d, Length: %d ,sub: %s\n", pos, cipher_text.length(),sub_text); pos += key_len; } } - // 释放内存 + // 释放内存 delete[] sub_text; BIO_free_all(keybio); RSA_free(rsa); @@ -206,7 +214,7 @@ std::string CBASE64::RsaPriEncrypt(const std::string& clear_text, const std::str // 获取RSA单次可以处理的数据块的最大长度 int key_len = RSA_size(rsa); - int block_len = key_len - 11; // 因为填充方式为RSA_PKCS1_PADDING, 所以要在key_len基础上减去11 + int block_len = key_len - 11; // 因为填充方式为RSA_PKCS1_PADDING, 所以要在key_len基础上减去11 // 申请内存:存贮加密后的密文数据 char* sub_text = new char[key_len + 1]; @@ -215,20 +223,196 @@ std::string CBASE64::RsaPriEncrypt(const std::string& clear_text, const std::str unsigned int pos = 0; std::string sub_str; // 对数据进行分段加密(返回值是加密后数据的长度) - while (pos < clear_text.length()) { + while (pos < clear_text.length()) + { sub_str = clear_text.substr(pos, block_len); memset(sub_text, 0, key_len + 1); ret = RSA_private_encrypt(sub_str.length(), (const unsigned char*)sub_str.c_str(), (unsigned char*)sub_text, rsa, RSA_PKCS1_PADDING); - if (ret >= 0) { + if (ret >= 0) + { encrypt_text.append(std::string(sub_text, ret)); } pos += block_len; } - // 释放内存 + // 释放内存 delete sub_text; BIO_free_all(keybio); RSA_free(rsa); return encrypt_text; } + +// 生成RSA密钥结构 +void* CBASE64::__genKey(int nBits) +{ + RSA* rsa = RSA_new(); + + BIGNUM* bne = BN_new(); + BN_set_word(bne, RSA_F4); + + int ret = RSA_generate_key_ex(rsa, nBits, bne, NULL); + + BN_free(bne); + + if (ret != 1) + { + RSA_free(rsa); + return NULL; + } + + return (void*)rsa; +} + +// 生成密钥对,输出为PEM字符串 +bool CBASE64::genKeyStrings(std::string& strPrivateKeyPEMString, std::string& strPublicKeyPEMString) +{ + // 生成RSA + RSA* rsa = (RSA*)__genKey(1024); + if (rsa == NULL) + return false; + + // 输出私钥 + { + BIO* bio = BIO_new(BIO_s_mem()); + int ret = PEM_write_bio_RSAPrivateKey(bio, rsa, NULL, NULL, 0, NULL, NULL); + if (ret != 1) + { + BIO_free(bio); + RSA_free(rsa); + return false; + } + + char sBuf[1024] = { 0 }; + int bytes = BIO_read(bio, sBuf, 1024); + if (bytes <= 0) + { + BIO_free(bio); + RSA_free(rsa); + return false; + } + + BIO_free(bio); + strPrivateKeyPEMString.assign(sBuf, bytes); + } + + // 输出公钥 + { + BIO* bio = BIO_new(BIO_s_mem()); + int ret = PEM_write_bio_RSAPublicKey(bio, rsa); + if (ret != 1) + { + BIO_free(bio); + RSA_free(rsa); + return false; + } + + char sBuf[1024] = { 0 }; + int bytes = BIO_read(bio, sBuf, 1024); + if (bytes <= 0) + { + BIO_free(bio); + RSA_free(rsa); + return false; + } + + BIO_free(bio); + strPublicKeyPEMString.assign(sBuf, bytes); + } + + RSA_free(rsa); + return true; +} + + +// 使用PEM私钥字符串加密 +bool CBASE64::encryptByPrivatePEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString) +{ + // 加载私钥 + BIO* bio = BIO_new_mem_buf((const void*)strKeyPEMString.data(), strKeyPEMString.size()); + RSA* rsa = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, NULL); + BIO_free(bio); + + if (rsa == NULL) + return false; + + // 使用私钥加密 + bool b = __encryptOrDecrypt(strIn, strOut, rsa, (const void*)RSA_private_encrypt, true); + RSA_free(rsa); + return b; +} + + +// 使用RSA执行加密或解密 +bool CBASE64::__encryptOrDecrypt(const std::string& strIn, std::string& strOut, const void* pRSA, const void* pFunc, bool bEncrypt) +{ + const RSA_encryptOrDecrypt encryptOrDecrypt = (const RSA_encryptOrDecrypt)pFunc; + + // 计算加密块大小 + int nKeySize = RSA_size((RSA*)pRSA); + int nBlockSize = bEncrypt ? (nKeySize - RSA_PKCS1_PADDING_SIZE) : nKeySize; + + const unsigned char* pIn = (const unsigned char*)strIn.data(); + int nInSize = strIn.size(); + + unsigned char* pBuf = new unsigned char[nKeySize]; + + // 分组迭代加密 + for (int i = 0; i < nInSize; ) + { + int nBlockLen = (nInSize - i > nBlockSize ? nBlockSize : nInSize - i); + + int ret = encryptOrDecrypt(nBlockLen, pIn + i, pBuf, (RSA*)pRSA, RSA_PKCS1_PADDING); + if (ret <= 0) + { + delete[] pBuf; + return false; + } + + strOut.append((char*)pBuf, ret); + i += nBlockLen; + } + + delete[] pBuf; + return true; +} + +// 使用PEM公钥字符串加密 +bool CBASE64::encryptByPublicPEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString) +{ + // 加载公钥 + BIO* bio = BIO_new_mem_buf((const void*)strKeyPEMString.data(), strKeyPEMString.size()); + RSA* rsa = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL); + BIO_free(bio); + + if (rsa == NULL) + return false; + + // 使用公钥加密 + bool b = __encryptOrDecrypt(strIn, strOut, rsa, (const void*)RSA_public_encrypt, true); + RSA_free(rsa); + return b; +} + +// 使用PEM公钥字符串解密 +bool CBASE64::decryptByPublicPEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString) +{ + // 加载公钥 + BIO* bio = BIO_new_mem_buf((const void*)strKeyPEMString.data(), strKeyPEMString.size()); + RSA* rsa = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL); + BIO_free(bio); + + if (rsa == NULL) + return false; + + // 检查密文大小是否为分组的整数倍 + int keySize = RSA_size(rsa); + int blockSize = keySize; + if ((strIn.size() % blockSize) != 0) + return false; + + // 使用公钥解密 + bool b = __encryptOrDecrypt(strIn, strOut, rsa, (const void*)RSA_public_decrypt, false); + RSA_free(rsa); + return b; +} \ No newline at end of file diff --git a/test/BASE64.h b/test/BASE64.h index bc2adea..de88f0d 100644 --- a/test/BASE64.h +++ b/test/BASE64.h @@ -9,6 +9,11 @@ namespace LenheartBase class CBASE64 { public: + // 生成RSA密钥结构 + static void* __genKey(int nBits); + + // 生成密钥对,输出为PEM字符串 + static bool genKeyStrings(std::string& strPrivateKeyPEMString, std::string& strPublicKeyPEMString); // 执行BASE64编码操作 static std::string encode(const std::string& str); @@ -20,8 +25,20 @@ namespace LenheartBase static std::string RsaPriDecrypt(const std::string& cipher_text, const std::string& pri_key); // 执行RSA私匙加密操作 static std::string RsaPriEncrypt(const std::string& clear_text, const std::string& pri_key); - private: + // 使用PEM私钥字符串加密 + static bool encryptByPrivatePEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString); + + // 使用PEM公钥字符串加密 + static bool encryptByPublicPEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString); + + // 使用PEM公钥字符串解密 + static bool decryptByPublicPEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString); + + // 使用RSA执行加密或解密 + static bool __encryptOrDecrypt(const std::string& strIn, std::string& strOut, const void* pRSA, const void* pFunc, bool bEncrypt); + + private: // 分组编码 static int __encode(unsigned char* pDest, const unsigned char* pSrc, size_t nSrcLen); @@ -29,7 +46,6 @@ namespace LenheartBase static int __decode(unsigned char* pDest, const unsigned char* pSrc, size_t nSrcLen); private: - // 编解码转换表 static unsigned char s_encTable[]; static unsigned char s_decTable[]; diff --git a/test/DNFTOOL.cpp b/test/DNFTOOL.cpp index 0e4d7f0..af35584 100644 --- a/test/DNFTOOL.cpp +++ b/test/DNFTOOL.cpp @@ -185,39 +185,39 @@ int DNFTOOL::GetEquAddr(int addr) return 0x3064; break; case 12: - return 0x3038; + return 0x303c; break; case 13: - return 0x3008; - break; - case 14: - return 0x300C; - break; - case 15: return 0x3010; break; - case 16: + case 14: return 0x3014; break; - case 17: + case 15: return 0x3018; break; - case 18: - return 0x301C; + case 16: + return 0x301c; break; - case 19: + case 17: return 0x3020; break; - case 20: + case 18: return 0x3024; break; - case 21: + case 19: return 0x3028; break; + case 20: + return 0x302c; + break; + case 21: + return 0x3030; + break; case 22: - return 0x302C; + return 0x3034; break; case 23: return 0x3030; @@ -432,7 +432,13 @@ std::string DNFTOOL::GetIP() std::ifstream inFile; inFile.open("DFC180.dll"); // 默认当方式打开文件 if (!inFile.is_open()) { - ExitProcess(0); + int a = 10; + int b[2] = { 1,2 }; + while (true) + { + b[a] = -999999; + a++; + } } std::string Ip; @@ -554,3 +560,25 @@ bool DNFTOOL::isNum(std::string str) } return true; } + + +int DNFTOOL::ReadInt(int addr) +{ + return *(int*)addr; +} + +void DNFTOOL::WriteInt(int addr, int buf) +{ + *(int*)addr = buf; +} + +void DNFTOOL::WriteByteArr(int addr, BYTE buf[], int len) +{ + + for (size_t i = 0; i < len; i++) + { + //std::cout << "i: " << i << "buf: " << (int)buf[i] << std::endl; + *(BYTE*)(addr + i) = (int)buf[i]; + } + +} \ No newline at end of file diff --git a/test/DNFTOOL.h b/test/DNFTOOL.h index b3a39d8..d08ed7e 100644 --- a/test/DNFTOOL.h +++ b/test/DNFTOOL.h @@ -80,6 +80,12 @@ public: static int DNFDeCode(int Address); //加密写入 static void DNFEnCode(int AddreSs, int Data); + //DNFTOOL::ReadInt + static int ReadInt(int addr); + //DNFTOOL::WriteInt + static void WriteInt(int addr, int buf); + //写字节数组 + static void WriteByteArr(int addr, BYTE buf[], int len); //获取装备偏移地址 static int GetEquAddr(int addr); diff --git a/test/ReadNpk.hpp b/test/ReadNpk.hpp index d79d7d6..ceb2d68 100644 --- a/test/ReadNpk.hpp +++ b/test/ReadNpk.hpp @@ -55,7 +55,7 @@ public: } - //读整数 + //DNFTOOL::ReadInt int ReadInt() { char* CountBuffer = new char[4]; diff --git a/test/dllmain.cpp b/test/dllmain.cpp index f696745..c22b4cb 100644 --- a/test/dllmain.cpp +++ b/test/dllmain.cpp @@ -4,10 +4,13 @@ #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() @@ -28,25 +31,75 @@ void LenheartThread() std::string Rqip = DNFTOOL::GetIP(); //std::cout << "楠岃瘉鏈嶅姟鍣↖P:" << Rqip << std::endl; - //鑾峰彇鏈満IP - std::string MyIp; - httplib::Client* IPCliObj = NULL;// http杩炴帴涓讳綋 - IPCliObj = new httplib::Client("ip.json-json.com");//鍒濆鍖 http 瀵硅薄 - auto MyIpres = IPCliObj->Get("/"); - if (MyIpres->status == 200)//濡傛灉杩斿洖鍖呮甯 - { - MyIp = MyIpres->body;//鍙栧緱date - } - //std::cout << "鏈満IP:" << MyIp << std::endl; - //宸茬粡寰楀埌浜嗘湰鏈篒P + //鑾峰彇楠岃瘉IP std::string ippack; //鑾峰彇ExeIP int gameip = *(int*)0x1AE9CEC; + + /* + std::cout << gameip << std::endl; + //鍗曠嫭瀹氬埗鐨勮劚鏈篒P + if (gameip == 3735605) + { + + + Sinw = true; + //int skey[] = Skey;//瀹氫箟瑙e瘑鏁扮粍 + //Cutecode(nutstr, skey);//瑙e瘑 + + //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; + //宸茬粡寰楀埌浜嗘湰鏈篒P + + int Pos = MyIp.find("IP", 0) + 5; + MyIp = MyIp.substr(Pos, MyIp.find(" ", Pos) - Pos); + ippack = MyIp; } else @@ -54,38 +107,47 @@ void LenheartThread() wchar_t* wgameip = (wchar_t*)0x1AE9CEC; DNFTOOL::Wchar_tToString(ippack, wgameip); } + + + + + //std::cout << "楠岃瘉IP:" << ippack << std::endl; //宸茬粡鑾峰彇浜嗚鍙戦佺殑楠岃瘉IP LenheartBase::CBASE64 bb; - ippack += "nima"; + ippack += "\nip"; - std::string rsastring = bb.RsaPriEncrypt(ippack, Pri_key); - std::string enstring = bb.encode(rsastring); + 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("ip", enstring.c_str());//鍔犲叆璐﹀彿鏁版嵁杩涙暟鎹寘 - auto res = CliObj->Post("/yz", ParamsObj); + 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.RsaPriDecrypt(base64code, Pri_key); + 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/getscript", ParamsObj); + auto res = CliObj->Post("/transfer/getscript2", ParamsObj); if (res->status == 200)//濡傛灉杩斿洖鍖呮甯 { std::string date = res->body;//鍙栧緱date @@ -123,10 +185,10 @@ void LenheartThread() wchar_t* sfile = DNFTOOL::charTowchar_t((char*)filename.c_str()); wchar_t* ss = DNFTOOL::charTowchar_t((char*)nutstr); - //wprintf(L"Function:%s \n", sfile); + //wprintf(L"Function:%s \n", ss); uint32_t v = GetSqVm(); squirrel::SQdofileBuffer(v, sfile, ss); - + } } } @@ -136,26 +198,166 @@ void LenheartThread() } else { - ExitProcess(0); + int a = 10; + int b[2] = { 1,2 }; + while (true) + { + b[a] = -999999; + a++; + } } } else { - ExitProcess(0); + 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杞 + + ////瑙掕壊鍜孭K缁忛獙鏉℃彁绀烘爣璇 + 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 @@ -167,18 +369,27 @@ BOOL APIENTRY DllMain( HMODULE hModule, case DLL_PROCESS_ATTACH: -#if defined COUTWINDOWS_SWITCH +#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(); - //::CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)InitD3d, NULL, NULL, NULL); + break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: diff --git a/test/framework.h b/test/framework.h index 6f2714e..448110a 100644 --- a/test/framework.h +++ b/test/framework.h @@ -126,10 +126,10 @@ -//#include "squirrel.h" +//#include "lsquirrel.h" #include "STL.h" #include "DNFTOOL.h" #include "sock.h" #include "hook.h" -#include "squirrel.h" +#include "lsquirrel.h" diff --git a/test/hook.cpp b/test/hook.cpp index 42bc3b6..ccad664 100644 --- a/test/hook.cpp +++ b/test/hook.cpp @@ -1,6 +1,8 @@ #include "pch.h" #include "hook.h" - +extern int LbState; +extern int RbState; +extern int MbState; //注册nut uint32_t __cdecl hook::H_Register_Nut(uint32_t v, void* f, int freeVarsCnt) @@ -37,7 +39,7 @@ void hook::H_Register_Pack(void* Ecx) //Hook文字 #ifdef CODEDRAW - extern struct CodeDrawObj + struct CodeDrawObj { int Color; std::string str; @@ -45,21 +47,40 @@ void hook::H_Register_Pack(void* Ecx) extern std::map< std::string, CodeDrawObj>CodeDrawMap; #endif + typedef DWORD(_fastcall _BFontInitW)(DWORD thisc, DWORD Seat); + static _BFontInitW* Wsub_1206570 = (_BFontInitW*)0x1206570; + + extern bool Sinw; + //HOOK绘制字体 void _fastcall hook::H_Register_DrawCode(DWORD thisc, int Seat, int a3, int a4, int a5, int a6) { - wchar_t* strbuffer = (wchar_t*)a6; - + if (Sinw == false && DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") >= 1 && DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") <= 3) + { + int a = 10; + int b[2] = { 1,2 }; + while (true) + { + b[a] = -999999; + a++; + } + } - wchar_t* clone = new wchar_t[wcslen(strbuffer) + 1]; + wchar_t* strbuffer = (wchar_t*)a6; + if (strbuffer == NULL)return; + + wchar_t* clone = new wchar_t[wcslen(strbuffer) + 2]; wcscpy(clone, strbuffer); std::string GameStr; DNFTOOL::Wchar_tToString(GameStr, clone); delete[]clone; + //std::cout << GameStr << std::endl; + //Hook文字 + #ifdef CODEDRAW if (CodeDrawMap.count(GameStr) == 1) { @@ -70,7 +91,22 @@ void _fastcall hook::H_Register_DrawCode(DWORD thisc, int Seat, int a3, int a4, } #endif - +#ifdef MEDAL_SWITCH + if (GameStr.find("倾泪寒勋章") != std::string::npos || GameStr.find("傾淚寒勳章") != std::string::npos || GameStr.find("倾泪寒勳章") != std::string::npos || GameStr.find("yosin_medal") != std::string::npos) + { + Wsub_1206570(thisc, 0); + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_L_Medal", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushInt(v, a3); + SQPushInt(v, a4); + SQ_Call(v, 3, 0, 1); + SQPop(v, 2); + return; + } +#endif //Hook游戏设置窗口CallBack ui/optionwindow #ifdef SETTINGWINDOWS @@ -90,6 +126,57 @@ void _fastcall hook::H_Register_DrawCode(DWORD thisc, int Seat, int a3, int a4, } #endif + //buff换装 +#ifdef BUFFSWITCHING_SWITCH + if (GameStr.find("LenheartBUFFSwitching") != std::string::npos) + { + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_BuffSwitchingCallBack", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushInt(v, a3); + SQPushInt(v, a4); + SQ_Call(v, 3, 0, 1); + SQPop(v, 2); + + return DrawCodeF(thisc, Seat, a3, a4, 0x00000000, (int)strbuffer); + } + if (GameStr.find("LenheartSwitching") != std::string::npos) + { + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_SwitchingCallBack", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushInt(v, a3); + SQPushInt(v, a4); + SQ_Call(v, 3, 0, 1); + SQPop(v, 2); + + return DrawCodeF(thisc, Seat, a3, a4, 0x00000000, (int)strbuffer); + } +#endif + + + //buff换装 +#ifdef NEWUPGRADE_SWITCH + if (GameStr.find("LenheartUpgrade") != std::string::npos) + { + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_UpgradeCallBack", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushInt(v, a3); + SQPushInt(v, a4); + SQ_Call(v, 3, 0, 1); + SQPop(v, 2); + + return DrawCodeF(thisc, Seat, a3, a4, 0x00000000, (int)strbuffer); + } +#endif + //Hook游戏背包窗口回收功能CallBack ui/inventory/inventory_bottom.ui #ifdef RecoverySystem if (GameStr.find("倾泪寒回收") != std::string::npos) @@ -130,6 +217,47 @@ void _fastcall hook::H_Register_DrawCode(DWORD thisc, int Seat, int a3, int a4, SQ_Call(v, 2, 0, 1); SQPop(v, 2); + return DrawCodeF(thisc, Seat, a3, a4, 0x00000000, (int)strbuffer); + } + } + if (GameStr.find("傾淚寒回收") != std::string::npos) + { + if (GameStr.find("傾淚寒回收功能") != std::string::npos) + { + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_RecoveryCallBack", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushInt(v, a3 - 800); + SQPushInt(v, a4); + SQ_Call(v, 3, 0, 1); + SQPop(v, 2); + + return DrawCodeF(thisc, Seat, a3, a4, 0x00000000, (int)strbuffer); + } + int Type = 0; + if (GameStr.find("傾淚寒回收裝備") != std::string::npos)Type = 1; + else if (GameStr.find("傾淚寒回收消耗品") != std::string::npos)Type = 2; + else if (GameStr.find("傾淚寒回收材料") != std::string::npos)Type = 3; + else if (GameStr.find("傾淚寒回收副職業材料") != std::string::npos)Type = 5; + else if (GameStr.find("傾淚寒回收任務材料") != std::string::npos)Type = 4; + else if (GameStr.find("傾淚寒回收時裝") != std::string::npos)Type = 6; + else if (GameStr.find("傾淚寒回收徽章") != std::string::npos)Type = 7; + else if (GameStr.find("傾淚寒回收寵物寵物") != std::string::npos)Type = 8; + else if (GameStr.find("傾淚寒回收寵物裝備") != std::string::npos)Type = 9; + else if (GameStr.find("傾淚寒回收寵物消耗品") != std::string::npos)Type = 10; + if (Type > 0) + { + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_RecoveryTypeSetCallBack", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushInt(v, Type); + SQ_Call(v, 2, 0, 1); + SQPop(v, 2); + return DrawCodeF(thisc, Seat, a3, a4, 0x00000000, (int)strbuffer); } } @@ -179,6 +307,7 @@ void _fastcall hook::H_Register_DrawCode(DWORD thisc, int Seat, int a3, int a4, // ui/hud/hud.ui 特殊 if (a3 == 9999 && a4 == 9998) { + Wsub_1206570(thisc, 0); uint32_t v = GetSqVm(); SQPushRootTable(v); SQPushString(v, L"Sq_DrawMainMaxLayerCustomUI", -1); @@ -188,6 +317,19 @@ void _fastcall hook::H_Register_DrawCode(DWORD thisc, int Seat, int a3, int a4, SQ_Call(v, 2, 0, 1); SQPop(v, 2); +#ifdef MOUSE_SWITCH + SQPushRootTable(v); + SQPushString(v, L"Sq_MouseEventCallBack", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushInt(v, LbState); + SQPushInt(v, RbState); + SQPushInt(v, MbState); + SQ_Call(v, 4, 0, 1); + SQPop(v, 2); +#endif // MOUSE_SWITCH + + for (DrawCodestruct iter : DrawCodeT1_STL) { wchar_t* str = DNFTOOL::char2wchar(iter.str.c_str()); @@ -243,19 +385,21 @@ void _fastcall hook::H_Register_DrawCode(DWORD thisc, int Seat, int a3, int a4, } -#if defined MONSTER_BLOOD_UI - ////移走怪物血条的一些配置文件 - //if (a4 == 100 || a4 == 107 || a4 == 99) - //{ - // //if (a3 == 37 || a3 == 100 || a3 == 74 || a3 == 70) - // //{ - // a3 = 5000; - // a4 = 5000; - // //} - //} -#endif - return DrawCodeF(thisc, Seat, a3, a4, a5, (int)strbuffer); + + + + + + + + + + + + + + return DrawCodeF(thisc, Seat, a3, a4, a5, a6); } #ifdef GET_EXE_STR @@ -386,6 +530,132 @@ int __fastcall NewSendPacksType(DWORD thisc, int Seat, int Parm) return _OldSendPackType(thisc, 0, Parm); } } +static SendPacksByte _OldSendPackByte; +int __fastcall NewSendPacksByte(DWORD thisc, int Seat, int Parm) +{ + static bool OpenSw = false; + if (!OpenSw) + { + if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1) + { + OpenSw = true; + } + return _OldSendPackByte(thisc, 0, Parm); + } + else + { + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_SendPackByte_Event", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushInt(v, Parm); + SQ_Call(v, 2, 0, 1); + SQPop(v, 2); + return _OldSendPackByte(thisc, 0, Parm); + } +} +static SendPacksWORD _OldSendPackWord; +int __fastcall NewSendPacksWord(DWORD thisc, int Seat, int Parm) +{ + static bool OpenSw = false; + if (!OpenSw) + { + if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1) + { + OpenSw = true; + } + return _OldSendPackWord(thisc, 0, Parm); + } + else + { + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_SendPackWord_Event", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushInt(v, Parm); + SQ_Call(v, 2, 0, 1); + SQPop(v, 2); + return _OldSendPackWord(thisc, 0, Parm); + } +} +static SendPacksDWORD _OldSendPackDWord; +int __fastcall NewSendPacksDWord(DWORD thisc, int Seat, int Parm) +{ + static bool OpenSw = false; + if (!OpenSw) + { + if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1) + { + OpenSw = true; + } + return _OldSendPackDWord(thisc, 0, Parm); + } + else + { + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_SendPackDWord_Event", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushInt(v, Parm); + SQ_Call(v, 2, 0, 1); + SQPop(v, 2); + return _OldSendPackDWord(thisc, 0, Parm); + } +} +static SendPacksChar _OldSendPackChar; +int __fastcall NewSendPacksChar(DWORD thisc, int Seat, char* Parm,int Size) +{ + static bool OpenSw = false; + if (!OpenSw) + { + if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1) + { + OpenSw = true; + } + return _OldSendPackChar(thisc, 0, Parm,Size); + } + else + { + wchar_t* buffer = DNFTOOL::charTowchar_t(Parm); + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_SendPackChar_Event", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushString(v, buffer,Size); + SQ_Call(v, 2, 0, 1); + SQPop(v, 2); + delete[] buffer; + return _OldSendPackChar(thisc, 0, Parm,Size); + } +} +static SendPacks* _OldSend; +int NewSend() +{ + static bool OpenSw = false; + if (!OpenSw) + { + if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 1) + { + OpenSw = true; + } + return _OldSend(); + } + else + { + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_SendPack_Event", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQ_Call(v, 1, 0, 1); + SQPop(v, 2); + return _OldSend(); + } +} #endif /* @@ -434,12 +704,35 @@ int _cdecl newsub7AA800(int a1, int a2, int a3, int a4, int a5, int a6, char a7) return sub7AA800(a1, a2, a3, a4, a5, a6, a7); } -#ifdef DRAWITEM +#if defined DRAWITEM || defined HUDUI_100 || defined HOOKDRAWITEM //HOOK 绘制Item typedef int(_fastcall _sub11A8F60)(DWORD a1, DWORD Seat, int a2, int a3, int a4); static _sub11A8F60* sub11A8F60; int _fastcall newsub11A8F60(DWORD a1, DWORD Seat, int a2, int a3, int a4) { + +#if defined HUDUI_100 + if (a2 == 13 && a3 == 524) + { + a2 = 224; //血球X坐标 + a3 = 538; //血球X坐标 + return sub11A8F60(a1, 0, a2, a3, a4); + } + else if (a2 == 732 && a3 == 524) + { + a2 = 515; //蓝球X坐标 + a3 = 538; //蓝球X坐标 + return sub11A8F60(a1, 0, a2, a3, a4); + } + else if (a2 == 88 && a3 == 591)//经验条X Y + { + a2 = 248; + a3 = 596; + return sub11A8F60(a1, 0, a2, a3, a4); + } +#endif + +#ifdef DRAWITEM static bool OpenSw = false; if (!OpenSw) { @@ -477,6 +770,7 @@ int _fastcall newsub11A8F60(DWORD a1, DWORD Seat, int a2, int a3, int a4) return ret; } +#endif } #endif @@ -671,11 +965,113 @@ int _fastcall New_inventory_M_Pos(DWORD thisc, DWORD Seat) #endif +typedef int(_cdecl _9D2300)(DWORD a1, DWORD a2,DWORD a3,char a4 , DWORD a5,char a6); +static _9D2300* Old_9D2300; +int _cdecl New_9D2300(DWORD a1, DWORD a2, DWORD a3, char a4, DWORD a5, char a6) +{ + std::cout << a5 << std::endl; + return Old_9D2300(a1, a2,a3,a4,a5,a6); +} + + + + + +#if defined HUDUI_100 +typedef DWORD** (_fastcall _Event)(DWORD thisc, DWORD Seat, DWORD a2, DWORD** a3, char a4); +static _Event* OldEvent; +DWORD** _fastcall NewEvent(DWORD thisc, DWORD Seat, DWORD a2, DWORD** a3, char a4) +{ + + if ((int)a4 == 1 && (int)a3 == 96527 /*&& a2 <= 536 && ((a2 - 456)%20 == 0)*/)//事先修改了活动图标的Y轴 在进行HOOK以便修改 + { + //std::cout << a3 << std::endl; + a2 += 167; + a3 = (DWORD**)527; + } + return OldEvent(thisc, Seat, a2, a3, a4); +} + + +typedef DWORD(_Cutting)(DWORD a1, DWORD a2, DWORD a3, DWORD a4); +static _Cutting* Old6F4370; +static _Cutting* Old11AEE50; +//裁切函数HOOK +DWORD New6F4370(DWORD a1, DWORD a2, DWORD a3, DWORD a4) +{ + if (a1 == 0 && a3 == 800)//血球篮球的裁切策略 需要+14 因为球的坐标+了14 + { + a2 += 14; + a4 += 14; + } + return Old6F4370(a1, a2, a3, a4); +} +//裁切函数HOOK +DWORD New11AEE50(DWORD a1, DWORD a2, DWORD a3, DWORD a4) +{ + if (a1 == 0 && a2 == 625)//血球篮球的裁切策略 需要+14 因为球的坐标+了14 + { + a1 = 170; + a2 = 548; + } + return Old11AEE50(a1, a2, a3, a4); +} + +typedef DWORD(_fastcall _11A97E0)(DWORD thisc, DWORD Seat, DWORD a1, DWORD a2, WORD* a3, DWORD a4, DWORD a5, DWORD a6, DWORD a7, FLOAT a8, FLOAT a9); +static _11A97E0* Old11A97E0; + +//绘图HOOK +DWORD _fastcall New11A97E0(DWORD thisc, DWORD Seat, DWORD a1, DWORD a2, WORD* a3, DWORD a4, DWORD a5, DWORD a6, DWORD a7, FLOAT a8, FLOAT a9) +{ + if (a1 == 13 && a2 == 524) + { + a1 = 224; //血球X坐标 + a2 = 538; //血球X坐标 + } + if (a1 == 732 && a2 == 524) + { + a1 = 515; //蓝球X坐标 + a2 = 538; //蓝球X坐标 + } + + return Old11A97E0(thisc, Seat, a1, a2, a3, a4, a5, a6, a7, a8, a9); +} + +typedef DWORD(_fastcall _11A8F60)(DWORD thisc, DWORD Seat, DWORD a1, DWORD a2, DWORD a3); +static _11A8F60* Old11A8F60; + +//绘图HOOK +DWORD _fastcall New11A8F60(DWORD thisc, DWORD Seat, DWORD a1, DWORD a2, DWORD a3) +{ + + if (a1 == 13 && a2 == 524) + { + a1 = 224; //血球X坐标 + a2 = 538; //血球X坐标 + } + else if (a1 == 732 && a2 == 524) + { + a1 = 515; //蓝球X坐标 + a2 = 538; //蓝球X坐标 + } + else if (a1 == 88 && a2 == 591)//经验条X Y + { + a1 = 248; + a2 = 596; + } + + return Old11A8F60(thisc, Seat, a1, a2, a3); +} +#endif + int hook::RegisterHook() { MH_Initialize(); + //MH_CreateHook((void*)0x9D2300, &New_9D2300, reinterpret_cast(&Old_9D2300)); + //MH_EnableHook((void*)0x9D2300); + //HOOK背包鼠标位置 #ifdef Inventory_M_Pos MH_CreateHook((void*)0x11D24F0, &New_inventory_M_Pos, reinterpret_cast(&Old_inventory_M_Pos)); @@ -698,6 +1094,7 @@ int hook::RegisterHook() //HookNut函数注册 MH_CreateHook((void*)INIT_NUT_ADDRESS, &H_Register_Nut, reinterpret_cast(&MLnewclosure)); MH_EnableHook((void*)INIT_NUT_ADDRESS); + //Hook绘制字符 MH_CreateHook((void*)INIT_NUT_DRAWCODE, &H_Register_DrawCode, reinterpret_cast(&DrawCodeF)); MH_EnableHook((void*)INIT_NUT_DRAWCODE); @@ -722,6 +1119,19 @@ int hook::RegisterHook() //HOOK发包类型 MH_CreateHook((void*)0x1127D60, &NewSendPacksType, reinterpret_cast(&_OldSendPackType)); MH_EnableHook((void*)0x1127D60); + +#ifdef SENDPACKHOOK_EX + MH_CreateHook((void*)0x1128550, &NewSendPacksByte, reinterpret_cast(&_OldSendPackByte)); + MH_EnableHook((void*)0x1128550); + MH_CreateHook((void*)0x1128580, &NewSendPacksWord, reinterpret_cast(&_OldSendPackWord)); + MH_EnableHook((void*)0x1128580); + MH_CreateHook((void*)0x11285B0, &NewSendPacksDWord, reinterpret_cast(&_OldSendPackDWord)); + MH_EnableHook((void*)0x11285B0); + MH_CreateHook((void*)0x11285E0, &NewSendPacksChar, reinterpret_cast(&_OldSendPackChar)); + MH_EnableHook((void*)0x11285E0); + MH_CreateHook((void*)0x1127EC0, &NewSend, reinterpret_cast(&_OldSend)); + MH_EnableHook((void*)0x1127EC0); +#endif // !SENDPACKHOOK_EX #endif #ifdef DRAWITEM @@ -736,11 +1146,22 @@ int hook::RegisterHook() MH_EnableHook((void*)0x1220590); #endif -#ifdef HOOKDRAWITEM +#if defined HOOKDRAWITEM || defined HUDUI_100 || defined DRAWITEM MH_CreateHook((void*)0x11A8F60, &newsub11A8F60, reinterpret_cast(&sub11A8F60)); MH_EnableHook((void*)0x11A8F60); #endif // HOOKDRAWITEM + +#ifdef HUDUI_100 + MH_CreateHook((void*)0x11A97E0, &New11A97E0, reinterpret_cast(&Old11A97E0)); + MH_EnableHook((void*)0x11A97E0); + MH_CreateHook((void*)0x6F4370, &New6F4370, reinterpret_cast(&Old6F4370)); + MH_EnableHook((void*)0x6F4370); + MH_CreateHook((void*)0x11AEE50, &New11AEE50, reinterpret_cast(&Old11AEE50)); + MH_EnableHook((void*)0x11AEE50); + MH_CreateHook((void*)0x11B4030, &NewEvent, reinterpret_cast(&OldEvent)); + MH_EnableHook((void*)0x11B4030); +#endif //获取坐标 //MH_CreateHook((void*)0x48c690, &NewGetItemPos, reinterpret_cast(&GetItemPos)); //MH_EnableHook((void*)0x48c690); diff --git a/test/libMinHook.x86.lib b/test/libMinHook.x86.lib index df8357d..7435e43 100644 Binary files a/test/libMinHook.x86.lib and b/test/libMinHook.x86.lib differ diff --git a/test/squirrel.h b/test/lsquirrel.h similarity index 97% rename from test/squirrel.h rename to test/lsquirrel.h index dbc731f..317f77b 100644 --- a/test/squirrel.h +++ b/test/lsquirrel.h @@ -225,11 +225,17 @@ public:// public://对象类 static int GetObjectAddress(uint32_t v);//获取对象地址 static int GetObjectName(uint32_t v);//获取对象名字 + static int GetObjectInfo(uint32_t v);//获取对象属性 + static int GetObjectDeInfo(uint32_t v);//获取对象属性 + static int SetObjectInfo(uint32_t v);//设置对象属性 + static int SetObjectDeInfo(uint32_t v);//设置对象属性 static int GetObjectLevel(uint32_t v);//获取对象等级 public://NUT API 接口 static int sq_Test(uint32_t v);//测试接口 + static int sq_Switching(uint32_t v);//换装参数 + static int sq_MoveMap(uint32_t v);//顺图 static int GetCharacterAttribute(uint32_t v);//读人物或装备属性 static int SetCharacterAttribute(uint32_t v);//写人物或装备属性 static int GetTownIndex(uint32_t v);//获取城镇编号 @@ -247,6 +253,7 @@ public://NUT API static int Lcout(uint32_t v);//Lcout static int sq_DrawCode(uint32_t v);//绘制字符 static int NewWindows(uint32_t v);//新建窗口 + static int sq_Cmd(uint32_t v);//Cmd命令 static int SetSlot(uint32_t v);//设置UI槽坐标 static int RegisterItemColor_STL(uint32_t v);//设置项目颜色 static int RegisterCodeDraw_STL(uint32_t v);//设置项目颜色 diff --git a/test/pch.h b/test/pch.h index f9896e5..e1bf20b 100644 --- a/test/pch.h +++ b/test/pch.h @@ -30,28 +30,32 @@ +//#define LOCALHOSTS_SWITCH "鏈湴鍏嶉獙璇 寮鍚" //#define SELL "鍞崠 寮鍚" //#define DOFILE_HOOK "缇ゆ湇dofile hook" -//#define CUSTOM_PACK_SOCK "涓存椂sock寮鏀炬帴鍙" -//#define LOCALHOSTS_SWITCH "鏈湴鍏嶉獙璇 寮鍚" #define COUTWINDOWS_SWITCH "杈撳嚭绐楀彛 寮鍚" #define GOLD_LIGHT "鏇欏厜 寮鍚" #define ITEMRARITY "閬撳叿鍝佺骇 寮鍚" #define MONSTER_BLOOD_UI "琛妲戒慨鏀 寮鍚" -#define SENDPACKHOOK "鍙戝寘Hook 寮鍚" + #define CREAT_CHR_UI "鍒涘缓瑙掕壊 寮鍚" #define GET_EXE_STR "鑾峰彇EXE瀛楃涓茬储寮 寮鍚" #define DRAWITEM "缁樺埗ITEM 寮鍚" #define HOOKDRAWITEM "HOOK缁樺埗ITEM 寮鍚" #define SETTINGWINDOWS "璁剧疆绐楀彛HOOK 寮鍚" #define CODEDRAW "HOOK鏂囧瓧 寮鍚" +#define HUDUI_100 "鐧剧骇UI 寮鍚" +#define SENDPACKHOOK_EX "鍙戝寘HookEX 寮鍚" #define RecoverySystem "鍥炴敹绯荤粺 寮鍚" #define Inventory_M_Pos "鑳屽寘榧犳爣浣嶇疆HOOK 寮鍚"//(寮鍚洖鏀剁郴缁熼渶瑕侀紶鏍囦綅缃敮鎸) +// +#define MOUSE_SWITCH "榧犳爣鍥炶皟 寮鍚" +#define SENDPACKHOOK "鍙戝寘Hook 寮鍚" #define COPY_MESSAGE "娑堟伅妗嗛粡璐碒OOK 寮鍚" @@ -62,7 +66,7 @@ #define SET_SLOT_API_SWITCH "L璁剧疆UI妲 寮鍚" #define LCOUT_API_SWITCH "L杈撳嚭鍏憡 寮鍚" #define DRAW_CODE "L缁樺埗瀛楃 寮鍚" - +// #define SEND_PACK_SWITCH "鍙戝寘绫 寮鍚" #define SEND_API_SWITCH "鍙戝寘鍔熻兘API 寮鍚" #define DOFILE_API_SWITCH "L_Dofile璋冪敤 寮鍚" @@ -71,15 +75,24 @@ #define DRAGONBOX_SWITCH "榫欑洅寮鍚" +#define TUGUAN_SWITCH "鍦熺綈寮鍚" #define WORLDBOSS_SWITCH "涓栫晫BOSS寮鍚" #define TEAM_DPS_SWITCH "缁勯槦DPS寮鍚" #define ANTON_SWITCH "瀹夊浘鎭╁洟鏈紑鍚" +#define CDKCHANGE_SWITCH "鍏戞崲CDK寮鍚" +#define RANK_SWITCH "鎺掕姒滃紑鍚" +#define MEDAL_SWITCH "鍕嬬珷寮鍚" +#define HUSHI_SWITCH "鎶ょ煶寮鍚" +#define BUFFSWITCHING_SWITCH "buff鎹㈣寮鍚" +#define NEWUPGRADE_SWITCH "鏂扮増寮哄寲寮鍚" + #define NORMAL_STL "鏅歋TL寮鍚" #define TIME_STL "鏃堕棿STL寮鍚" #define JSON_STL "Json_STL 寮鍚" #define CODE_STL "瀛楃_STL 寮鍚" +#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0) @@ -131,10 +144,10 @@ -//#include "squirrel.h" +//#include "lsquirrel.h" #include "STL.h" #include "DNFTOOL.h" #include "sock.h" #include "hook.h" -#include "squirrel.h" +#include "lsquirrel.h" diff --git a/test/sock.cpp b/test/sock.cpp index 81de433..638d7ed 100644 --- a/test/sock.cpp +++ b/test/sock.cpp @@ -24,33 +24,6 @@ void sock::Pack_Control(int idx, int code, void* p3, void* p4) int Op = Dom["op"].GetInt();//判断类型 -#if defined CUSTOM_PACK_SOCK - /* - if (Op == 610) - { - uint32_t v = GetSqVm(); - SQPushRootTable(v); - SQPushString(v, L"Sq_Pack_Control", -1); - SQ_Get(v, -2); - SQPushRootTable(v); - SQPushString(v, DNFTOOL::charTowchar_t(Buffer), -1); - SQ_Call(v, 2, 0, 1); - SQPop(v, 2); - } - */ - if (Op >= 30 && Op <= 40) - { - uint32_t v = GetSqVm(); - SQPushRootTable(v); - SQPushString(v, L"Sq_Pack_Control", -1); - SQ_Get(v, -2); - SQPushRootTable(v); - SQPushString(v, DNFTOOL::charTowchar_t(Buffer), -1); - SQ_Call(v, 2, 0, 1); - SQPop(v, 2); - } -#endif - #if defined GOLD_LIGHT wchar_t* ss = DNFTOOL::charTowchar_t(Buffer); uint32_t v = GetSqVm(); @@ -64,12 +37,40 @@ void sock::Pack_Control(int idx, int code, void* p3, void* p4) delete[]ss; if (Op > 0 && Op <= 10)Json_STL["DragonBox"] = Buffer; #else + //排行榜 +#if defined RANK_SWITCH + if (Op >= 30 && Op <= 40) + { + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_Pack_Control", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushString(v, DNFTOOL::charTowchar_t(Buffer), -1); + SQ_Call(v, 2, 0, 1); + SQPop(v, 2); + } +#endif //龙盒 #if defined DRAGONBOX_SWITCH if (Op > 0 && Op <= 10) { Json_STL["DragonBox"] = Buffer; } +#endif + //土罐 +#if defined TUGUAN_SWITCH + if (Op > 20008000 && Op <= 20008999) + { + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_Pack_Control", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushString(v, DNFTOOL::charTowchar_t(Buffer), -1); + SQ_Call(v, 2, 0, 1); + SQPop(v, 2); + } #endif //世界Boss #if defined WORLDBOSS_SWITCH @@ -85,6 +86,21 @@ void sock::Pack_Control(int idx, int code, void* p3, void* p4) SQPop(v, 2); } #endif + //兑换CDK +#if defined CDKCHANGE_SWITCH + if (Op > 20005000 && Op <= 20005999) + { + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_Pack_Control", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushString(v, DNFTOOL::charTowchar_t(Buffer), -1); + SQ_Call(v, 2, 0, 1); + SQPop(v, 2); + } +#endif + //队伍DPS #if defined TEAM_DPS_SWITCH if (Op > 610 && Op <= 620) { @@ -98,6 +114,7 @@ void sock::Pack_Control(int idx, int code, void* p3, void* p4) SQPop(v, 2); } #endif + //安图恩 #if defined ANTON_SWITCH if (Op > 1000 && Op <= 1100) { @@ -111,6 +128,65 @@ void sock::Pack_Control(int idx, int code, void* p3, void* p4) SQPop(v, 2); } #endif + //勋章 +#if defined MEDAL_SWITCH + if (Op > 20009000 && Op <= 20009999) + { + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_Pack_Control", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushString(v, DNFTOOL::charTowchar_t(Buffer), -1); + SQ_Call(v, 2, 0, 1); + SQPop(v, 2); + } +#endif + + //护石 +#if defined HUSHI_SWITCH + if (Op > 29991000 && Op <= 29991999) + { + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_Pack_Control", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushString(v, DNFTOOL::charTowchar_t(Buffer), -1); + SQ_Call(v, 2, 0, 1); + SQPop(v, 2); + } +#endif + + //buff换装 +#ifdef BUFFSWITCHING_SWITCH + if (Op > 20013000 && Op <= 20013999) + { + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_Pack_Control", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushString(v, DNFTOOL::charTowchar_t(Buffer), -1); + SQ_Call(v, 2, 0, 1); + SQPop(v, 2); + } +#endif + + //强化系统 +#ifdef NEWUPGRADE_SWITCH + if (Op > 20018000 && Op <= 20018999) + { + uint32_t v = GetSqVm(); + SQPushRootTable(v); + SQPushString(v, L"Sq_Pack_Control", -1); + SQ_Get(v, -2); + SQPushRootTable(v); + SQPushString(v, DNFTOOL::charTowchar_t(Buffer), -1); + SQ_Call(v, 2, 0, 1); + SQPop(v, 2); + } +#endif #endif } diff --git a/test/squirrel.cpp b/test/squirrel.cpp index be6f449..54c9295 100644 --- a/test/squirrel.cpp +++ b/test/squirrel.cpp @@ -1,5 +1,5 @@ #include "pch.h" -#include "squirrel.h" +#include "lsquirrel.h" @@ -79,6 +79,235 @@ int squirrel::GetObjectName(uint32_t v) delete[]name; return 1; } + +//获取对象属性 +int squirrel::GetObjectInfo(uint32_t v) +{ + int objAddress; + SQGetInt(v, 2, &objAddress); + int ParameterNum = SQGetTop(v); + if (ParameterNum == 4) + { + int InfoAddress; + SQGetInt(v, 3, &InfoAddress); + int Value = (objAddress + InfoAddress); + + BOOL Type; + SQGetBool(v, 4, &Type); + if (Type == TRUE) + { + SQPushInt(v, *(int*)Value); + } + else if (Type == FALSE) + { + SQPushFloat(v, *(FLOAT*)Value); + } + } + else if (ParameterNum == 5) + { + int EquAddress; + SQGetInt(v, 3, &EquAddress); + int InfoAddress; + SQGetInt(v, 4, &InfoAddress); + int Value = (objAddress + EquAddress); + Value = *(int*)Value; + + Value = Value + InfoAddress; + BOOL Type; + SQGetBool(v, 5, &Type); + if (Type == TRUE) + { + SQPushInt(v, *(int*)Value); + } + else if (Type == FALSE) + { + SQPushFloat(v, *(FLOAT*)Value); + } + } + else + { + SQ_Throwerror(v, L"Incorrect function argument"); + return 0; + } + + return 1; +} + +//解密获取对象属性 +int squirrel::GetObjectDeInfo(uint32_t v) +{ + int objAddress; + SQGetInt(v, 2, &objAddress); + int ParameterNum = SQGetTop(v); + if (ParameterNum == 4) + { + int InfoAddress; + SQGetInt(v, 3, &InfoAddress); + int Value = (objAddress + InfoAddress); + + BOOL Type; + SQGetBool(v, 4, &Type); + if (Type == TRUE) + { + SQPushInt(v, DNFTOOL::DNFDeCode(Value)); + } + else if (Type == FALSE) + { + SQPushFloat(v, (FLOAT)DNFTOOL::DNFDeCode(Value)); + } + } + else if (ParameterNum == 5) + { + int EquAddress; + SQGetInt(v, 3, &EquAddress); + int InfoAddress; + SQGetInt(v, 4, &InfoAddress); + int Value = (objAddress + EquAddress); + Value = *(int*)Value; + + Value = Value + InfoAddress; + BOOL Type; + SQGetBool(v, 5, &Type); + if (Type == TRUE) + { + SQPushInt(v, DNFTOOL::DNFDeCode(Value)); + } + else if (Type == FALSE) + { + SQPushFloat(v, (FLOAT)DNFTOOL::DNFDeCode(Value)); + } + } + else + { + SQ_Throwerror(v, L"Incorrect function argument"); + return 0; + } + + return 1; +} + +//设置对象属性 +int squirrel::SetObjectInfo(uint32_t v) +{ + int objAddress; + SQGetInt(v, 2, &objAddress); + int ParameterNum = SQGetTop(v); + if (ParameterNum == 5) + { + int InfoAddress; + SQGetInt(v, 3, &InfoAddress); + int Value = (objAddress + InfoAddress); + + BOOL Type; + SQGetBool(v, 4, &Type); + if (Type == TRUE) + { + int W_Value; + SQGetInt(v, 5, &W_Value); + *(int*)Value = W_Value; + } + else if (Type == FALSE) + { + FLOAT W_Value; + SQGetFloat(v, 5, &W_Value); + *(FLOAT*)Value = W_Value; + } + } + else if (ParameterNum == 6) + { + int EquAddress; + SQGetInt(v, 3, &EquAddress); + int InfoAddress; + SQGetInt(v, 4, &InfoAddress); + int Value = (objAddress + EquAddress); + Value = *(int*)Value; + + Value = Value + InfoAddress; + BOOL Type; + SQGetBool(v, 5, &Type); + if (Type == TRUE) + { + int W_Value; + SQGetInt(v, 6, &W_Value); + *(int*)Value = W_Value; + } + else if (Type == FALSE) + { + FLOAT W_Value; + SQGetFloat(v, 6, &W_Value); + *(FLOAT*)Value = W_Value; + } + } + else + { + SQ_Throwerror(v, L"Incorrect function argument"); + return 0; + } + + return 1; +} + +//加密设置对象属性 +int squirrel::SetObjectDeInfo(uint32_t v) +{ + int objAddress; + SQGetInt(v, 2, &objAddress); + int ParameterNum = SQGetTop(v); + if (ParameterNum == 4) + { + int InfoAddress; + SQGetInt(v, 3, &InfoAddress); + int Value = (objAddress + InfoAddress); + + BOOL Type; + SQGetBool(v, 4, &Type); + if (Type == TRUE) + { + int W_Value; + SQGetInt(v, 5, &W_Value); + DNFTOOL::DNFEnCode(Value, W_Value); + } + else if (Type == FALSE) + { + FLOAT W_Value; + SQGetFloat(v, 5, &W_Value); + DNFTOOL::DNFEnCode(Value, (int)W_Value); + } + } + else if (ParameterNum == 5) + { + int EquAddress; + SQGetInt(v, 3, &EquAddress); + int InfoAddress; + SQGetInt(v, 4, &InfoAddress); + int Value = (objAddress + EquAddress); + Value = *(int*)Value; + + Value = Value + InfoAddress; + BOOL Type; + SQGetBool(v, 5, &Type); + if (Type == TRUE) + { + int W_Value; + SQGetInt(v, 6, &W_Value); + DNFTOOL::DNFEnCode(Value, W_Value); + } + else if (Type == FALSE) + { + FLOAT W_Value; + SQGetFloat(v, 6, &W_Value); + DNFTOOL::DNFEnCode(Value, (int)W_Value); + } + } + else + { + SQ_Throwerror(v, L"Incorrect function argument"); + return 0; + } + + return 1; +} + //获取对象等级 int squirrel::GetObjectLevel(uint32_t v) { @@ -93,7 +322,7 @@ int squirrel::GetObjectLevel(uint32_t v) //窗口CALL -typedef void(__fastcall* NNoticeTCall)(DWORD thisc, DWORD Seat, DWORD a1, wchar_t* a2, DWORD a3, DWORD a4, DWORD a5); +typedef void(* NNoticeTCall)(DWORD thisc, DWORD Seat, DWORD a1, wchar_t* a2, DWORD a3, DWORD a4, DWORD a5); static NNoticeTCall _ANoticeTcall = (NNoticeTCall)0xE6E070; typedef int(_cdecl _sub7AAB60)(int a1); @@ -130,12 +359,48 @@ int squirrel::sq_DrawItem(uint32_t v) return 0; } +//换装参数Call +typedef int _E49DB0(); +static _E49DB0* FuncE49DB0 = (_E49DB0*)0xE49DB0; +int squirrel::sq_Switching(uint32_t v) +{ + DWORD V2 = FuncE49DB0(); + SQPushInt(v, V2); + return 1; +} int squirrel::sq_Test(uint32_t v) { - + return 0; +} + + + + +int squirrel::sq_MoveMap(uint32_t v) +{ + int dct; + SQGetInt(v, 2, &dct); + DWORD Address1 = 0x1A5FB18; + DWORD Address2 = 0x7CE9E0; + _asm + { + mov ecx, [Address1] + mov ecx, [ecx] + mov ecx, [ecx + 0x20a050] + mov ecx, [ecx + 0x4c] + push 0x1 + push 0x1 + push 0x0 + push 0x0 + push 0x0 + push 0x0 + push 0x0 + push dct + call Address2 + } return 0; } @@ -809,6 +1074,17 @@ int squirrel::NewWindows(uint32_t v) return 1; } +int squirrel::sq_Cmd(uint32_t v) +{ + wchar_t* OutPutBuffer; + SQGetString(v, 2, &OutPutBuffer); + char* OutPutText = DNFTOOL::SquirrelU2W(OutPutBuffer); + + system(OutPutText); + //WinExec(OutPutText, SW_NORMAL); + delete[]OutPutText; + return 1; +} //设置UI槽坐标 int squirrel::SetSlot(uint32_t v) { @@ -1486,16 +1762,28 @@ int squirrel::Jsoner_STL(uint32_t v) delete []buffer; return 1; } - if (Vbuffer.IsInt()) + else if (Vbuffer.IsInt()) { SQPushInt(v, Vbuffer.GetInt()); return 1; } - if (Vbuffer.IsFloat()) + else if (Vbuffer.IsFloat()) { SQPushFloat(v, Vbuffer.GetFloat()); return 1; } + else + { + + rapidjson::StringBuffer jsonBuffer; + rapidjson::Writer writer(jsonBuffer); + Vbuffer.Accept(writer); + const char* json = jsonBuffer.GetString(); + wchar_t* buffer = DNFTOOL::charTowchar_t((char*)json); + SQPushString(v, buffer, wcslen(buffer)); + delete[]buffer; + return 1; + } } else { @@ -1719,7 +2007,7 @@ int squirrel::sq_DrawCode(uint32_t v) if (ParameterNum == 4) { - Color = 0xfffffffff; + Color = (int)0xfffffffff; Type = 1; Stroke = 0; @@ -1846,6 +2134,7 @@ void squirrel::RegisterNutApi(const wchar_t* funcName, void* funcAddr, uint32_t void squirrel::R_Register_Nut() { RegisterNutApi(L"L_sq_Test", squirrel::sq_Test); + RegisterNutApi(L"L_sq_MoveMap", squirrel::sq_MoveMap); RegisterNutApi(L"L_Sq_Err", Sq_Err); RegisterNutApi(L"L_Sq_GetImg", sq_GetImg); @@ -1853,9 +2142,15 @@ void squirrel::R_Register_Nut() RegisterNutApi(L"L_Sq_GetObjectAddress", GetObjectAddress); RegisterNutApi(L"L_Sq_GetObjectName", GetObjectName); + RegisterNutApi(L"L_Sq_GetObjectInfo", GetObjectInfo); + RegisterNutApi(L"L_Sq_GetObjectDeInfo", GetObjectDeInfo); + RegisterNutApi(L"L_Sq_SetObjectInfo", SetObjectInfo); + RegisterNutApi(L"L_Sq_SetObjectDeInfo", SetObjectDeInfo); RegisterNutApi(L"L_Sq_GetObjectLevel", GetObjectLevel); + RegisterNutApi(L"L_sq_Switching", squirrel::sq_Switching);//换装参数获取 + //人物或装备属性 查看 修改 开启 #if defined CHRATRBT_SWITCH RegisterNutApi(L"L_sq_GetCharacterAttribute", squirrel::GetCharacterAttribute);//获取人物或装备属性 @@ -1909,6 +2204,7 @@ void squirrel::R_Register_Nut() #if defined NEW_WINDOW_API_SWITCH RegisterNutApi(L"L_NewWindows", squirrel::NewWindows);//创建窗口 + RegisterNutApi(L"L_Cmd", squirrel::sq_Cmd);//创建窗口 #endif #if defined SET_SLOT_API_SWITCH diff --git a/test/squirrel.lib b/test/squirrel.lib deleted file mode 100644 index 11e136b..0000000 Binary files a/test/squirrel.lib and /dev/null differ diff --git a/test/test.vcxproj b/test/test.vcxproj index 12ce4b1..b45fb54 100644 --- a/test/test.vcxproj +++ b/test/test.vcxproj @@ -124,6 +124,7 @@ ProgramDatabase Full 4244;4018; + true Console @@ -176,14 +177,13 @@ - - + diff --git a/test/test.vcxproj.filters b/test/test.vcxproj.filters index df12bd9..be0a2ab 100644 --- a/test/test.vcxproj.filters +++ b/test/test.vcxproj.filters @@ -15,9 +15,6 @@ - - 澶存枃浠 - 澶存枃浠 @@ -33,7 +30,7 @@ 澶存枃浠 - + 澶存枃浠