111
This commit is contained in:
parent
1fddc97e20
commit
79185568a0
|
|
@ -128,9 +128,8 @@ static void example_listener_on_enter(GumInvocationListener* listener, GumInvoca
|
||||||
else if (CONTAINS_STRING(self->ArgumentCount[i], "bool"))
|
else if (CONTAINS_STRING(self->ArgumentCount[i], "bool"))
|
||||||
Sq_pushbool(v, (bool)Abuf);
|
Sq_pushbool(v, (bool)Abuf);
|
||||||
else if (CONTAINS_STRING(self->ArgumentCount[i], "string")) {
|
else if (CONTAINS_STRING(self->ArgumentCount[i], "string")) {
|
||||||
wchar_t* ss = DNFTOOL::charTowchar_t((char*)Abuf);
|
std::wstring ss = DNFTOOL::charTowchar_t((char*)Abuf);
|
||||||
Sq_pushstring(v, ss, -1);
|
Sq_pushstring(v, ss.c_str(), -1);
|
||||||
delete[]ss;
|
|
||||||
}
|
}
|
||||||
else if (CONTAINS_STRING(self->ArgumentCount[i], "pointer"))
|
else if (CONTAINS_STRING(self->ArgumentCount[i], "pointer"))
|
||||||
Sq_pushuserpointer(v, (void*)Abuf);
|
Sq_pushuserpointer(v, (void*)Abuf);
|
||||||
|
|
@ -228,9 +227,8 @@ static void example_listener_on_leave(GumInvocationListener* listener, GumInvoca
|
||||||
else if (CONTAINS_STRING(self->ArgumentCount[i], "bool"))
|
else if (CONTAINS_STRING(self->ArgumentCount[i], "bool"))
|
||||||
Sq_pushbool(v, (bool)Abuf);
|
Sq_pushbool(v, (bool)Abuf);
|
||||||
else if (CONTAINS_STRING(self->ArgumentCount[i], "string")) {
|
else if (CONTAINS_STRING(self->ArgumentCount[i], "string")) {
|
||||||
wchar_t* ss = DNFTOOL::charTowchar_t((char*)Abuf);
|
std::wstring ss = DNFTOOL::charTowchar_t((char*)Abuf);
|
||||||
Sq_pushstring(v, ss, -1);
|
Sq_pushstring(v, ss.c_str(), -1);
|
||||||
delete[]ss;
|
|
||||||
}
|
}
|
||||||
else if (CONTAINS_STRING(self->ArgumentCount[i], "pointer"))
|
else if (CONTAINS_STRING(self->ArgumentCount[i], "pointer"))
|
||||||
Sq_pushuserpointer(v, (void*)Abuf);
|
Sq_pushuserpointer(v, (void*)Abuf);
|
||||||
|
|
|
||||||
|
|
@ -416,3 +416,4 @@ bool CBASE64::decryptByPublicPEMString(const std::string& strIn, std::string& st
|
||||||
RSA_free(rsa);
|
RSA_free(rsa);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
#include <istream>
|
#include <istream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include "BASE64.h"
|
#include "BASE64.h"
|
||||||
|
#include "json.hpp"
|
||||||
|
#include "zlib.h"
|
||||||
|
|
||||||
#define CPPHTTPLIB_OPENSSL_SUPPORT
|
#define CPPHTTPLIB_OPENSSL_SUPPORT
|
||||||
#include "httplib.h"
|
#include "httplib.h"
|
||||||
|
|
@ -40,12 +42,16 @@ public:
|
||||||
szDst = psText;// std::string赋值
|
szDst = psText;// std::string赋值
|
||||||
delete[]psText;// psText的清除
|
delete[]psText;// psText的清除
|
||||||
}
|
}
|
||||||
static wchar_t* DNFTOOL::charTowchar_t(char* wbuffer)
|
static std::wstring DNFTOOL::charTowchar_t(char* wbuffer,size_t len = 0)
|
||||||
{
|
{
|
||||||
size_t requiredSize = mbstowcs(nullptr, wbuffer, 0);
|
size_t requiredSize = 0;
|
||||||
|
if (len == 0)requiredSize = mbstowcs(nullptr, wbuffer, 0);
|
||||||
|
else requiredSize = len;
|
||||||
wchar_t* wcString = new wchar_t[requiredSize + 1];
|
wchar_t* wcString = new wchar_t[requiredSize + 1];
|
||||||
mbstowcs(wcString, wbuffer, requiredSize + 1);
|
mbstowcs(wcString, wbuffer, requiredSize + 1);
|
||||||
return wcString;
|
std::wstring NewStr(wcString);
|
||||||
|
delete[]wcString;
|
||||||
|
return NewStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DNFTOOL::Split(const std::string& src, std::vector<std::string>& dest, const std::string& separator)
|
static void DNFTOOL::Split(const std::string& src, std::vector<std::string>& dest, const std::string& separator)
|
||||||
|
|
@ -439,33 +445,26 @@ public:
|
||||||
{
|
{
|
||||||
std::ifstream inFile;
|
std::ifstream inFile;
|
||||||
inFile.open("DFC180.dll"); // 默认当方式打开文件
|
inFile.open("DFC180.dll"); // 默认当方式打开文件
|
||||||
if (!inFile.is_open()) {
|
if (inFile.is_open()) {
|
||||||
int a = 10;
|
|
||||||
int b[2] = { 1,2 };
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
b[a] = -999999;
|
|
||||||
a++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string Ip;
|
std::string Ip;
|
||||||
while (1) {
|
|
||||||
// 从文件中读取第一个数据,并将其打印出来
|
|
||||||
inFile >> Ip;
|
inFile >> Ip;
|
||||||
if (inFile.eof()) {
|
inFile.close();
|
||||||
break;
|
|
||||||
|
std::string pub = R"(-----BEGIN PUBLIC KEY-----
|
||||||
|
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDafyp7gGautPZZ3I3IlYLf8Qyw
|
||||||
|
xGigvg0rkmXPaP34C6sHi//GLuYjwM6AUJTtbfo0pCNmLqBbCiiuzkBXEqM+GeS2
|
||||||
|
+7zhu1yeEXv+i9iySFPbYydy851uVip7oqsbNM4iGYpS5ERND9XYuhSGUFI5p9ik
|
||||||
|
Nsvz+z7r4iT2rd8vrwIDAQAB
|
||||||
|
-----END PUBLIC KEY-----)";
|
||||||
|
|
||||||
|
|
||||||
|
LenheartBase::CBASE64 bb;
|
||||||
|
std::string decryptedData = DNFTOOL::rsaDecrypt(bb.decode(Ip), pub);
|
||||||
|
return decryptedData;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
char* uncode = (char*)Ip.c_str();
|
|
||||||
int skey[] = DFCSkey;//定义解密数组
|
|
||||||
|
|
||||||
Cutecode(uncode, skey);//解密
|
|
||||||
|
|
||||||
Ip = uncode;
|
|
||||||
//std::cout << "获取Ip" << std::endl;
|
|
||||||
return Ip;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string DNFTOOL::GetUserIp()
|
static std::string DNFTOOL::GetUserIp()
|
||||||
|
|
@ -476,6 +475,46 @@ public:
|
||||||
return ippack;
|
return ippack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//zlib解压
|
||||||
|
static std::string gzip_decompress(const std::string& compressed) {
|
||||||
|
z_stream zs;
|
||||||
|
memset(&zs, 0, sizeof(zs));
|
||||||
|
|
||||||
|
if (inflateInit2(&zs, 16 + MAX_WBITS) != Z_OK) {
|
||||||
|
//throw std::runtime_error("inflateInit failed");
|
||||||
|
return "null";
|
||||||
|
}
|
||||||
|
|
||||||
|
zs.next_in = (Bytef*)compressed.data();
|
||||||
|
zs.avail_in = compressed.size();
|
||||||
|
|
||||||
|
int ret;
|
||||||
|
char outbuffer[32768];
|
||||||
|
std::string outstring;
|
||||||
|
|
||||||
|
do {
|
||||||
|
zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
|
||||||
|
zs.avail_out = sizeof(outbuffer);
|
||||||
|
|
||||||
|
ret = inflate(&zs, 0);
|
||||||
|
|
||||||
|
if (outstring.size() < zs.total_out) {
|
||||||
|
outstring.append(outbuffer, zs.total_out - outstring.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (ret == Z_OK);
|
||||||
|
|
||||||
|
inflateEnd(&zs);
|
||||||
|
|
||||||
|
if (ret != Z_STREAM_END) {
|
||||||
|
//throw std::runtime_error("Exception during zlib decompression: (" + std::to_string(ret) + ") " + zs.msg);
|
||||||
|
return "null";
|
||||||
|
}
|
||||||
|
|
||||||
|
return outstring;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static std::string DNFTOOL::rsaDecrypt(const std::string& encryptedData, const std::string& publicKeyStr) {
|
static std::string DNFTOOL::rsaDecrypt(const std::string& encryptedData, const std::string& publicKeyStr) {
|
||||||
RSA* rsa = RSA_new();
|
RSA* rsa = RSA_new();
|
||||||
BIO* bio = BIO_new_mem_buf(const_cast<char*>(publicKeyStr.c_str()), -1);
|
BIO* bio = BIO_new_mem_buf(const_cast<char*>(publicKeyStr.c_str()), -1);
|
||||||
|
|
@ -498,69 +537,103 @@ public:
|
||||||
return decryptedData;
|
return decryptedData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::string rsaDecrypt8(const std::string& encryptedData, const std::string& publicKeyStr) {
|
||||||
|
RSA* rsa = nullptr;
|
||||||
|
BIO* bio = BIO_new_mem_buf(const_cast<char*>(publicKeyStr.c_str()), -1);
|
||||||
|
if (bio == nullptr) {
|
||||||
|
std::cerr << "Error creating BIO" << std::endl;
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
rsa = PEM_read_bio_RSA_PUBKEY(bio, &rsa, nullptr, nullptr);
|
||||||
|
if (rsa == nullptr) {
|
||||||
|
std::cerr << "Error reading public key" << std::endl;
|
||||||
|
BIO_free(bio);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
int rsaSize = RSA_size(rsa);
|
||||||
|
std::string decryptedData(rsaSize, 0);
|
||||||
|
|
||||||
|
int decryptedSize = RSA_public_decrypt(encryptedData.size(),
|
||||||
|
reinterpret_cast<const unsigned char*>(encryptedData.c_str()),
|
||||||
|
reinterpret_cast<unsigned char*>(&decryptedData[0]),
|
||||||
|
rsa,
|
||||||
|
RSA_PKCS1_PADDING);
|
||||||
|
|
||||||
|
if (decryptedSize == -1) {
|
||||||
|
std::cerr << "Error decrypting data" << std::endl;
|
||||||
|
RSA_free(rsa);
|
||||||
|
BIO_free(bio);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
RSA_free(rsa);
|
||||||
|
BIO_free(bio);
|
||||||
|
|
||||||
|
decryptedData.resize(decryptedSize);
|
||||||
|
return decryptedData;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void UnHtRe(std::string ippack, std::string Rqip) {
|
static void UnHtRe(std::string ippack, std::string Rqip) {
|
||||||
httplib::Client* CliObj = NULL;// http连接主体
|
httplib::Client* CliObj = NULL;// http连接主体
|
||||||
CliObj = new httplib::Client(Rqip);//初始化 http 对象
|
CliObj = new httplib::Client(Rqip);//初始化 http 对象
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Unski(std::string Body, std::string Ti, std::string APath,std::string K) {
|
static void Unski(std::string Body , std::string KeyString) {
|
||||||
//必须在前面加载 不然会拿不到版本号
|
#ifndef SELL
|
||||||
std::string sustr = "ENUM_TW_GROWTYPE_TI <- " + Ti;
|
std::string sustr = "ENUM_RINDRO_LOCAL <- true";
|
||||||
BaseData.push_back(sustr);
|
BaseData.push_back(sustr);
|
||||||
|
#endif // SELL
|
||||||
|
|
||||||
std::string apstr = "ENUM_TW_GROWTYPE_PO <- \"" + APath + "\"";
|
|
||||||
BaseData.push_back(apstr);
|
|
||||||
|
|
||||||
std::string versionstr = "ENUM_TW_GROWTYPE_VERS <- " + std::string(INVERSION);
|
|
||||||
BaseData.push_back(versionstr);
|
|
||||||
|
|
||||||
std::string aSSpstr = "ENUM_TW_RINDRO_PO <- \"" + K + "\"";
|
|
||||||
BaseData.push_back(aSSpstr);
|
|
||||||
|
|
||||||
std::vector<std::string> BaseDataBuffer;
|
std::vector<std::string> BaseDataBuffer;
|
||||||
DNFTOOL::Split(Body, BaseDataBuffer, "$$$$$");
|
DNFTOOL::Split(Body, BaseDataBuffer, "$$$$$");
|
||||||
|
|
||||||
size_t Ds = BaseDataBuffer.size();
|
size_t Ds = BaseDataBuffer.size();
|
||||||
|
|
||||||
std::vector<std::string> NNKey;
|
int RealKey[20] = { 0 };
|
||||||
DNFTOOL::Split(APath, NNKey, ",");
|
// 转换字符串到数组
|
||||||
|
for (size_t i = 0; i < KeyString.length() && i < 20; ++i) {
|
||||||
|
RealKey[i] = KeyString[i] - '0'; // 将字符转换为对应的数字
|
||||||
|
}
|
||||||
|
|
||||||
int RealKey[5] = { atoi(NNKey[0].c_str()),atoi(NNKey[1].c_str()) ,atoi(NNKey[2].c_str()) ,atoi(NNKey[3].c_str()) ,atoi(NNKey[4].c_str()) };
|
|
||||||
for (size_t i = 0; i < (Ds - 1); i++)
|
for (size_t i = 0; i < (Ds - 1); i++)
|
||||||
{
|
{
|
||||||
std::string filename = "BaseData" + std::to_string(i);
|
|
||||||
std::string str = BaseDataBuffer[i];
|
std::string str = BaseDataBuffer[i];
|
||||||
|
|
||||||
str = str.substr(str.find("[") + 1, str.length() - 2);
|
//得到有多少个逗号
|
||||||
|
|
||||||
std::vector<std::string> Data;
|
std::vector<std::string> Data;
|
||||||
DNFTOOL::Split(str, Data, ", ");
|
DNFTOOL::Split(str, Data, ", ");
|
||||||
size_t DDs = Data.size();
|
size_t DDs = Data.size();
|
||||||
|
|
||||||
char* nutstr = new char[DDs + 1];
|
char* nutstr = new char[DDs + 1];
|
||||||
|
|
||||||
|
|
||||||
for (size_t s = 0; s < DDs; s++)
|
for (size_t s = 0; s < DDs; s++)
|
||||||
{
|
{
|
||||||
nutstr[s] = char(atoi(Data[s].c_str()));
|
nutstr[s] = char(atoi(Data[s].c_str()));
|
||||||
}
|
}
|
||||||
|
Cutecode(nutstr, RealKey, DDs,20);//解密
|
||||||
nutstr[DDs] = '\0';
|
nutstr[DDs] = '\0';
|
||||||
|
|
||||||
Cutecode(nutstr, RealKey, DDs);//解密
|
std::string RealStr(nutstr, DDs);
|
||||||
|
|
||||||
//std::cout << nutstr << std::endl << std::flush;;
|
|
||||||
|
|
||||||
BaseData.push_back(std::string(nutstr, DDs));
|
|
||||||
delete[]nutstr;
|
delete[]nutstr;
|
||||||
}
|
BaseData.push_back(RealStr);
|
||||||
|
|
||||||
|
// 写入文件:文件名格式为 "file + i"(如 file0, file1 等)
|
||||||
jiaoben = true;
|
std::string filename = "jb/file" + std::to_string(i);
|
||||||
}
|
std::ofstream outFile(filename, std::ios::binary); // 使用二进制模式确保数据完整性
|
||||||
|
if (outFile.is_open())
|
||||||
static bool DNFTOOL::ReqIpLicense(std::string ippack, std::string Rqip, std::string ym)
|
|
||||||
{
|
{
|
||||||
httplib::Client cli(ym);
|
outFile.write(RealStr.c_str(), RealStr.size());
|
||||||
|
outFile.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jiaoben = true;
|
||||||
|
//std::cout << "Decode" << clock() << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool DNFTOOL::ReqIpLicense(std::string ippack, std::string Rqip)
|
||||||
|
{
|
||||||
|
httplib::Client cli(Rqip);
|
||||||
|
|
||||||
httplib::Params ParamsObj;//新建 Params 对象
|
httplib::Params ParamsObj;//新建 Params 对象
|
||||||
ParamsObj.emplace("ip", ippack.c_str());//加入账号数据进数据包
|
ParamsObj.emplace("ip", ippack.c_str());//加入账号数据进数据包
|
||||||
|
|
@ -598,66 +671,38 @@ public:
|
||||||
timestamp.pop_back(); // Remove trailing newline character
|
timestamp.pop_back(); // Remove trailing newline character
|
||||||
ParamsObj.emplace("l", timestamp);//时间戳
|
ParamsObj.emplace("l", timestamp);//时间戳
|
||||||
|
|
||||||
|
auto res = cli.Post("/script/client", ParamsObj);
|
||||||
auto res = cli.Post("/c/user2/getproclient2", ParamsObj);
|
|
||||||
if (res) {
|
if (res) {
|
||||||
|
//std::cout << "status: " << res->status << std::endl;
|
||||||
if (res->status == 200)//如果返回包正常
|
if (res->status == 200)//如果返回包正常
|
||||||
{
|
{
|
||||||
std::string jso = res->body;//取得date
|
try
|
||||||
|
{
|
||||||
|
std::string StrBuf = LenheartBase::CBASE64::decode(res->body);
|
||||||
|
StrBuf = gzip_decompress(StrBuf);
|
||||||
|
|
||||||
|
nlohmann::json Jso = nlohmann::json::parse(StrBuf);
|
||||||
|
|
||||||
|
std::string Key = Jso["key"].dump();
|
||||||
|
Key = Key.substr(1, Key.length() - 2);
|
||||||
|
std::string Script = Jso["getBaseScriptStr"].dump();
|
||||||
|
Script = Script.substr(1, Script.length() - 2);
|
||||||
|
|
||||||
std::string pub = R"(-----BEGIN PUBLIC KEY-----
|
std::string pub = R"(-----BEGIN PUBLIC KEY-----
|
||||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCHXJ0Df2JAAZSAyW9sKmYGBB0S
|
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDafyp7gGautPZZ3I3IlYLf8Qyw
|
||||||
UXh7yFm3sjVe8ybDGXWUZkGCotljJjTB9wysluwgs3WK7x20OUMqj2GkNV/YVb+G
|
xGigvg0rkmXPaP34C6sHi//GLuYjwM6AUJTtbfo0pCNmLqBbCiiuzkBXEqM+GeS2
|
||||||
z81zykggVT4eQq9d1sCoId5YS5m5AP4SfYIkSKPY0+O3xxN0WiZInEcgqlg0ojrJ
|
+7zhu1yeEXv+i9iySFPbYydy851uVip7oqsbNM4iGYpS5ERND9XYuhSGUFI5p9ik
|
||||||
xe4DWCUH/DAGq5f6EwIDAQAB
|
Nsvz+z7r4iT2rd8vrwIDAQAB
|
||||||
-----END PUBLIC KEY-----)";
|
-----END PUBLIC KEY-----)";
|
||||||
|
|
||||||
|
std::string RealKey = DNFTOOL::rsaDecrypt(LenheartBase::CBASE64::decode(Key), pub);
|
||||||
|
|
||||||
LenheartBase::CBASE64 bb;
|
Unski(Script,RealKey);
|
||||||
std::string decryptedData = DNFTOOL::rsaDecrypt(bb.decode(jso), pub);
|
|
||||||
|
|
||||||
rapidjson::Document Dom;
|
}
|
||||||
Dom.Parse(decryptedData.c_str());//加载 字符串
|
catch (const std::exception& e)
|
||||||
|
|
||||||
//1级验证
|
|
||||||
if (Dom["c"].GetString() == s) {
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef SELL
|
|
||||||
|
|
||||||
httplib::Client nutcli(Rqip);
|
|
||||||
nutcli.enable_server_certificate_verification(false);
|
|
||||||
|
|
||||||
|
|
||||||
httplib::Headers headers = {
|
|
||||||
{"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
httplib::Params ParamsObjSQ;//新建 Params 对象
|
|
||||||
ParamsObjSQ.emplace("sj", Dom["k3"].GetString());//加入账号数据进数据包
|
|
||||||
|
|
||||||
|
|
||||||
auto nutres = nutcli.Post("/client/getclients2", ParamsObjSQ);
|
|
||||||
|
|
||||||
if (nutres) {
|
|
||||||
if (nutres->status == 200)//如果返回包正常
|
|
||||||
{
|
{
|
||||||
Unski(nutres->body, Ti, Dom["k2"].GetString(), Dom["k"].GetString());
|
std::cout << e.what() << std::endl;
|
||||||
MessageBox(NULL, L"完成!", NULL, NULL);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
#endif // SELL
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
DNFTOOL::UnHtRe(ippack, Rqip);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -665,7 +710,6 @@ xe4DWCUH/DAGq5f6EwIDAQAB
|
||||||
DNFTOOL::UnHtRe(ippack, Rqip);
|
DNFTOOL::UnHtRe(ippack, Rqip);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// 获取HTTP请求的错误码
|
// 获取HTTP请求的错误码
|
||||||
|
|
@ -684,3 +728,62 @@ DNFTOOL::DNFTOOL()
|
||||||
DNFTOOL::~DNFTOOL()
|
DNFTOOL::~DNFTOOL()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Base64 {
|
||||||
|
private:
|
||||||
|
static const std::string base64_chars;
|
||||||
|
|
||||||
|
static inline bool is_base64(unsigned char c) {
|
||||||
|
return (isalnum(c) || (c == '+') || (c == '/'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
static std::vector<unsigned char> decode(const std::string& encoded_string) {
|
||||||
|
int in_len = encoded_string.size();
|
||||||
|
int i = 0;
|
||||||
|
int j = 0;
|
||||||
|
int in_ = 0;
|
||||||
|
unsigned char char_array_4[4], char_array_3[3];
|
||||||
|
std::vector<unsigned char> ret;
|
||||||
|
|
||||||
|
while (in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
|
||||||
|
char_array_4[i++] = encoded_string[in_]; in_++;
|
||||||
|
if (i == 4) {
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
char_array_4[i] = base64_chars.find(char_array_4[i]);
|
||||||
|
|
||||||
|
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
|
||||||
|
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
|
||||||
|
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
|
||||||
|
|
||||||
|
for (i = 0; (i < 3); i++)
|
||||||
|
ret.push_back(char_array_3[i]);
|
||||||
|
i = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i) {
|
||||||
|
for (j = i; j < 4; j++)
|
||||||
|
char_array_4[j] = 0;
|
||||||
|
|
||||||
|
for (j = 0; j < 4; j++)
|
||||||
|
char_array_4[j] = base64_chars.find(char_array_4[j]);
|
||||||
|
|
||||||
|
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
|
||||||
|
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
|
||||||
|
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
|
||||||
|
|
||||||
|
for (j = 0; (j < i - 1); j++) ret.push_back(char_array_3[j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const std::string Base64::base64_chars =
|
||||||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
"abcdefghijklmnopqrstuvwxyz"
|
||||||
|
"0123456789+/";
|
||||||
399
Include/Hook.hpp
399
Include/Hook.hpp
|
|
@ -4,6 +4,7 @@
|
||||||
#include "inlinehook.h"
|
#include "inlinehook.h"
|
||||||
#include "RegisterSquirrel.hpp"
|
#include "RegisterSquirrel.hpp"
|
||||||
#include "IO_Ex.hpp"
|
#include "IO_Ex.hpp"
|
||||||
|
#include "Verify.hpp"
|
||||||
|
|
||||||
//游戏初始化完毕Flag
|
//游戏初始化完毕Flag
|
||||||
static bool InitGameFlag = false;
|
static bool InitGameFlag = false;
|
||||||
|
|
@ -37,36 +38,32 @@ int Sq_mycompilebuffer(HSQUIRRELVM v, const wchar_t* s, int size, const wchar_t*
|
||||||
|
|
||||||
|
|
||||||
void Suxn() {
|
void Suxn() {
|
||||||
|
|
||||||
size_t Ds = BaseData.size();
|
size_t Ds = BaseData.size();
|
||||||
|
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
|
||||||
|
|
||||||
for (size_t i = 0; i < Ds; i++)
|
for (size_t i = 0; i < Ds; i++)
|
||||||
{
|
{
|
||||||
std::string filenamebuf = "BaseData" + std::to_string(i);
|
std::string filenamebuf = "BaseData" + std::to_string(i) + BaseData[i].substr(0,50);
|
||||||
std::string strbuf = BaseData[i];
|
std::string strbuf = BaseData[i];
|
||||||
wchar_t* filename = DNFTOOL::charTowchar_t((char*)filenamebuf.c_str());
|
std::wstring filename = DNFTOOL::charTowchar_t((char*)filenamebuf.c_str());
|
||||||
wchar_t* str = DNFTOOL::charTowchar_t((char*)strbuf.c_str());
|
std::wstring str = DNFTOOL::charTowchar_t((char*)strbuf.c_str());
|
||||||
|
|
||||||
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
|
|
||||||
SQInteger Top = Sq_gettop(v);
|
SQInteger Top = Sq_gettop(v);
|
||||||
#ifdef SELL
|
#ifdef SELL
|
||||||
//std::cout << strbuf << std::endl;
|
if (Sq_mycompilebuffer(v, str.c_str(), str.length(), filename.c_str(), false) >= 0) {
|
||||||
if (Sq_mycompilebuffer(v, str, wcslen(str), L"interactive console", false) >= 0) {
|
|
||||||
Sq_pushroottable(v);
|
Sq_pushroottable(v);
|
||||||
Sq_call(v, 1, SQFalse, SQTrue);
|
Sq_call(v, 1, SQFalse, SQTrue);
|
||||||
Sq_pop(v, 1);
|
Sq_pop(v, 1);
|
||||||
//std::cout << "加载了: " << strbuf.substr(0, 100) << std::endl;
|
//std::cout << "加载了: " << strbuf.substr(0, 100) << std::endl;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (Sq_mycompilebuffer(v, str, wcslen(str), filename, false) >= 0) {
|
if (Sq_mycompilebuffer(v, str.c_str(), str.length(), filename.c_str(), false) >= 0) {
|
||||||
Sq_pushroottable(v);
|
Sq_pushroottable(v);
|
||||||
Sq_call(v, 1, SQFalse, SQTrue);
|
Sq_call(v, 1, SQFalse, SQTrue);
|
||||||
Sq_pop(v, 1);
|
Sq_pop(v, 1);
|
||||||
}
|
}
|
||||||
#endif // SELL
|
#endif // SELL
|
||||||
Sq_settop(v, Top);
|
Sq_settop(v, Top);
|
||||||
delete[] filename;
|
|
||||||
delete[] str;
|
|
||||||
}
|
}
|
||||||
BaseData.clear();
|
BaseData.clear();
|
||||||
jiaoben = false;
|
jiaoben = false;
|
||||||
|
|
@ -790,8 +787,6 @@ void __declspec(naked)MonsetrRace_Hook() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -938,7 +933,7 @@ typedef void(__cdecl* pack_handler_t)(int idx, int err, void*, void*);
|
||||||
typedef void(__cdecl* register_pack_handler_t)(int idx, pack_handler_t handler, int zero);
|
typedef void(__cdecl* register_pack_handler_t)(int idx, pack_handler_t handler, int zero);
|
||||||
typedef bool(__cdecl* _Net_Get_Dword)(DWORD*);
|
typedef bool(__cdecl* _Net_Get_Dword)(DWORD*);
|
||||||
static _Net_Get_Dword Net_Get_Dword = reinterpret_cast<_Net_Get_Dword>(0x011AEA60);
|
static _Net_Get_Dword Net_Get_Dword = reinterpret_cast<_Net_Get_Dword>(0x011AEA60);
|
||||||
typedef bool(__cdecl* _Net_Get_Buffer)(char*, int);
|
typedef bool(__cdecl* _Net_Get_Buffer)(void*, int);
|
||||||
static _Net_Get_Buffer Net_Get_Buffer = reinterpret_cast<_Net_Get_Buffer>(0x011AEA90);
|
static _Net_Get_Buffer Net_Get_Buffer = reinterpret_cast<_Net_Get_Buffer>(0x011AEA90);
|
||||||
//130号收包
|
//130号收包
|
||||||
void Pack_Control(int idx, int code, void* p3, void* p4)
|
void Pack_Control(int idx, int code, void* p3, void* p4)
|
||||||
|
|
@ -949,10 +944,11 @@ void Pack_Control(int idx, int code, void* p3, void* p4)
|
||||||
Net_Get_Dword(&Size);
|
Net_Get_Dword(&Size);
|
||||||
char* Buffer = new char[Size + 1];
|
char* Buffer = new char[Size + 1];
|
||||||
Net_Get_Buffer(Buffer, Size);
|
Net_Get_Buffer(Buffer, Size);
|
||||||
|
|
||||||
Buffer[Size] = '\0';
|
Buffer[Size] = '\0';
|
||||||
|
|
||||||
wchar_t* ss = DNFTOOL::charTowchar_t(Buffer);
|
std::wstring ss = DNFTOOL::charTowchar_t(Buffer);
|
||||||
|
delete[]Buffer;
|
||||||
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
|
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
|
||||||
SQInteger Top = Sq_gettop(v);
|
SQInteger Top = Sq_gettop(v);
|
||||||
Sq_pushroottable(v);
|
Sq_pushroottable(v);
|
||||||
|
|
@ -964,11 +960,84 @@ void Pack_Control(int idx, int code, void* p3, void* p4)
|
||||||
|
|
||||||
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
|
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
|
||||||
Sq_pushroottable(v);
|
Sq_pushroottable(v);
|
||||||
Sq_pushstring(v, ss, -1);
|
Sq_pushstring(v, ss.c_str(), -1);
|
||||||
Sq_call(v, 2, SQFalse, SQTrue);
|
Sq_call(v, 2, SQFalse, SQTrue);
|
||||||
}
|
}
|
||||||
Sq_settop(v, Top);
|
Sq_settop(v, Top);
|
||||||
delete[]ss;
|
}
|
||||||
|
}
|
||||||
|
void Pack_Control2(int idx, int code, void* p3, void* p4)
|
||||||
|
{
|
||||||
|
if (InitGameFlag)
|
||||||
|
{
|
||||||
|
DWORD Size;
|
||||||
|
Net_Get_Dword(&Size);
|
||||||
|
void* Buffer = malloc(Size);
|
||||||
|
Net_Get_Buffer(Buffer, Size);
|
||||||
|
|
||||||
|
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
|
||||||
|
SQInteger Top = Sq_gettop(v);
|
||||||
|
Sq_pushroottable(v);
|
||||||
|
Sq_pushstring(v, L"Sq_BlobPack_Control", -1);
|
||||||
|
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
|
||||||
|
Sq_pushroottable(v);
|
||||||
|
Sq_pushinteger(v, Size);
|
||||||
|
Sq_pushuserpointer(v,Buffer);
|
||||||
|
Sq_call(v, 3, SQFalse, SQTrue);
|
||||||
|
}
|
||||||
|
Sq_settop(v, Top);
|
||||||
|
free(Buffer);
|
||||||
|
|
||||||
|
|
||||||
|
//Buffer[Size] = '\0';
|
||||||
|
|
||||||
|
// std::wstring ss = DNFTOOL::charTowchar_t(Buffer);
|
||||||
|
//
|
||||||
|
// HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
|
||||||
|
// SQInteger Top = Sq_gettop(v);
|
||||||
|
// Sq_pushroottable(v);
|
||||||
|
//#if defined(SELL) || defined(EXPRESS)
|
||||||
|
// Sq_pushstring(v, L"Sq_Pack_Control", -1);
|
||||||
|
//#else
|
||||||
|
// Sq_pushstring(v, L"Sq_Pack_ControlLocal", -1);
|
||||||
|
//#endif // SELL
|
||||||
|
//
|
||||||
|
// if (SQ_SUCCEEDED(Sq_get(v, -2))) {
|
||||||
|
// Sq_pushroottable(v);
|
||||||
|
// Sq_pushstring(v, ss.c_str(), -1);
|
||||||
|
// Sq_call(v, 2, SQFalse, SQTrue);
|
||||||
|
// }
|
||||||
|
// Sq_settop(v, Top);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
DWORD Size;
|
||||||
|
Net_Get_Dword(&Size);
|
||||||
|
void* Buffer = malloc(Size);
|
||||||
|
Net_Get_Buffer(Buffer, Size);
|
||||||
|
|
||||||
|
std::string StringBuffer((char*)Buffer, Size);
|
||||||
|
//std::cout << "base64: " << StringBuffer << std::endl;
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<unsigned char> StrBuf = Base64::decode(StringBuffer);
|
||||||
|
|
||||||
|
char* strip = reinterpret_cast<char*>(StrBuf.data());;
|
||||||
|
|
||||||
|
int RealKey[5] = { 5,7,8,1,6 };
|
||||||
|
Cutecode(strip, RealKey, StrBuf.size(), 5);//解密
|
||||||
|
|
||||||
|
std::string Ip(strip, StrBuf.size());
|
||||||
|
|
||||||
|
#ifdef SELL
|
||||||
|
VerifyThreadParams* params = new VerifyThreadParams;
|
||||||
|
params->data = Ip;
|
||||||
|
//多线程验证
|
||||||
|
DWORD threadID;
|
||||||
|
HANDLE Thand = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)VerifyThread, params, 0, &threadID);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//std::cout << "IP++++++++:" << Ip << std::endl;
|
||||||
|
//std::cout << "IP++++++++:" << Ip.length() << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void H_Register_Pack(void* Ecx)
|
void H_Register_Pack(void* Ecx)
|
||||||
|
|
@ -976,7 +1045,9 @@ void H_Register_Pack(void* Ecx)
|
||||||
Lpfn_Init(Ecx);
|
Lpfn_Init(Ecx);
|
||||||
auto Registerfunc = reinterpret_cast<register_pack_handler_t>(0x7186D0);
|
auto Registerfunc = reinterpret_cast<register_pack_handler_t>(0x7186D0);
|
||||||
|
|
||||||
Registerfunc(130, Pack_Control, 0);
|
//Registerfunc(130, Pack_Control, 0);
|
||||||
|
//Registerfunc(131, Pack_Control2,0);
|
||||||
|
//std::cout << "注册1" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
//DrawMain HOOK
|
//DrawMain HOOK
|
||||||
|
|
@ -984,13 +1055,27 @@ typedef DWORD(_fastcall _4C61F0)(DWORD thisc, DWORD Seat);
|
||||||
static _4C61F0* Old4C61F0;
|
static _4C61F0* Old4C61F0;
|
||||||
DWORD _fastcall New4C61F0(DWORD thisc, DWORD Seat)
|
DWORD _fastcall New4C61F0(DWORD thisc, DWORD Seat)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//选择频道调用
|
||||||
|
static bool RegisterPackFlag = false;
|
||||||
|
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+", 0) == 6 && !RegisterPackFlag) {
|
||||||
|
RegisterPackFlag = true;
|
||||||
|
//注册包控制 (很多煞笔登录器不让开始注册)
|
||||||
|
auto Registerfunc = reinterpret_cast<register_pack_handler_t>(0x7186D0);
|
||||||
|
Registerfunc(130, Pack_Control, 0);
|
||||||
|
Registerfunc(131, Pack_Control2, 0);
|
||||||
|
//std::cout << "注册2" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
DWORD Ret = Old4C61F0(thisc, Seat);
|
DWORD Ret = Old4C61F0(thisc, Seat);
|
||||||
if (BaseData.size() > 0 && jiaoben == true && InitGameFlag) {
|
if (BaseData.size() > 0 && jiaoben == true && InitGameFlag) {
|
||||||
Suxn();
|
Suxn();
|
||||||
|
|
||||||
//注册包控制 (很多煞笔登录器不让开始注册)
|
////注册包控制 (很多煞笔登录器不让开始注册)
|
||||||
auto Registerfunc = reinterpret_cast<register_pack_handler_t>(0x7186D0);
|
//auto Registerfunc = reinterpret_cast<register_pack_handler_t>(0x7186D0);
|
||||||
Registerfunc(130, Pack_Control, 0);
|
//Registerfunc(130, Pack_Control, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
static bool mouseInit = false;
|
static bool mouseInit = false;
|
||||||
|
|
||||||
|
|
@ -1029,7 +1114,6 @@ DWORD _fastcall New4C61F0(DWORD thisc, DWORD Seat)
|
||||||
return Ret;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void InitBin() {
|
static void InitBin() {
|
||||||
void* buf = malloc(81443744);
|
void* buf = malloc(81443744);
|
||||||
int readsize;
|
int readsize;
|
||||||
|
|
@ -1056,32 +1140,22 @@ static void InitBin() {
|
||||||
free(buf);
|
free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PFunc(HSQUIRRELVM v, const SQChar* s, ...) {
|
|
||||||
va_list vl;
|
|
||||||
va_start(vl, s);
|
|
||||||
// 使用_vsnwprintf正确计算格式化后的宽字符字符串长度
|
|
||||||
int len = _vsnwprintf(nullptr, 0, s, vl);
|
|
||||||
va_end(vl);
|
|
||||||
|
|
||||||
va_start(vl, s);
|
|
||||||
// 动态分配足够的内存空间,注意长度计算需要考虑宽字符的字节数(通常一个宽字符占2字节或更多,取决于平台和编码)
|
|
||||||
wchar_t* buffer = new wchar_t[len + 1];
|
|
||||||
// 将格式化后的宽字符字符串拼接到动态分配的内存中
|
|
||||||
_vsnwprintf(buffer, len + 1, s, vl);
|
|
||||||
va_end(vl);
|
|
||||||
|
|
||||||
std::wofstream outFile("test.txt", std::ios::out | std::ios::app | std::ios::binary); // 以二进制模式打开文件用于追加写入
|
// 捕获函数
|
||||||
if (outFile) {
|
void CaptureSQPrint(HSQUIRRELVM v, const SQChar* format, ...) {
|
||||||
outFile << buffer << std::endl; // 将宽字符字符串写入文件,并添加换行符
|
va_list args;
|
||||||
outFile.close(); // 关闭文件流
|
va_start(args, format);
|
||||||
std::wcout << L"宽字符字符串已成功追加写入文件。" << std::endl;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
std::wcerr << L"无法打开文件进行追加写入。" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::wcout << buffer << std::endl; // 使用std::wcout输出宽字符字符串
|
|
||||||
delete[] buffer;
|
int requiredSize = _vscwprintf(format, args) + 1; // 计算所需长度
|
||||||
|
|
||||||
|
static wchar_t* capturedWString = new wchar_t[requiredSize];
|
||||||
|
// 安全地格式化字符串
|
||||||
|
vswprintf(capturedWString, requiredSize, format, args);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
std::wcout << capturedWString << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
//HookNut函数注册
|
//HookNut函数注册
|
||||||
|
|
@ -1089,122 +1163,87 @@ typedef void(__cdecl _Register_Nut)();
|
||||||
static _Register_Nut* Register_Nut_Old;
|
static _Register_Nut* Register_Nut_Old;
|
||||||
void __cdecl H_Register_Nut()
|
void __cdecl H_Register_Nut()
|
||||||
{
|
{
|
||||||
InitBin();
|
//原始注册逻辑
|
||||||
|
|
||||||
Register_Nut_Old();
|
Register_Nut_Old();
|
||||||
|
static bool init = false;
|
||||||
static bool Init = false;
|
if (!init) {
|
||||||
if (!Init) {
|
init = true;
|
||||||
Init = true;
|
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
|
||||||
//sq_setprintfunc(*(HSQUIRRELVM*)0x1AF3544, PFunc);
|
//读取bin文件字符串
|
||||||
|
InitBin();
|
||||||
|
//注册我自己的nut函数
|
||||||
R_Register_Nut();
|
R_Register_Nut();
|
||||||
|
|
||||||
std::string BaseFile = "YosinBaseC";
|
sq_setprintfunc(v,CaptureSQPrint);
|
||||||
std::string Base = R"(
|
|
||||||
FFI_FIRST_ABI <- 0;
|
|
||||||
FFI_SYSV <- 1;
|
|
||||||
FFI_STDCALL <- 2;
|
|
||||||
FFI_THISCALL <- 3;
|
|
||||||
FFI_FASTCALL <- 4;
|
|
||||||
FFI_MS_CDECL <- 5;
|
|
||||||
FFI_PASCAL <- 6;
|
|
||||||
FFI_REGISTER <- 7;
|
|
||||||
Lenheart_P_Update <- true;
|
|
||||||
function Sq_L_Medal (x,y) {}
|
|
||||||
function Sq_SettingWindowCallBack (x,y) {}
|
|
||||||
function Sq_BuffSwitchingCallBack (x,y) {}
|
|
||||||
function Sq_SwitchingCallBack (x,y) {}
|
|
||||||
function Sq_UpgradeCallBack (x,y) {}
|
|
||||||
function Sq_RecoveryCallBack (x,y) {}
|
|
||||||
function Sq_RecoveryTypeSetCallBack (Type) {}
|
|
||||||
function Sq_DrawMainMaxLayerCustomUI (pack) {}
|
|
||||||
function Lenheart (VmTop) {}
|
|
||||||
function Sq_MouseEventCallBack (Lb, Rb, Mb) {}
|
|
||||||
function Sq_SelectCharacter (Chunk) {}
|
|
||||||
function Sq_DrawMainTopLayerCustomUI (pack) {}
|
|
||||||
function Sq_GetExeStr_Event (StrIndex) {return StrIndex;}
|
|
||||||
function Sq_CreatChr (chunk) {}
|
|
||||||
function Sq_SendPackType_Event (Type) {}
|
|
||||||
function Sq_SendPackByte_Event (Parm) {}
|
|
||||||
function Sq_SendPackWord_Event (Parm) {}
|
|
||||||
function Sq_SendPackDWord_Event (Parm) {}
|
|
||||||
function Sq_SendPackChar_Event (Parm) {}
|
|
||||||
function Sq_SendPack_Event () {}
|
|
||||||
function Sq_DrawItemBack (Xpos, Ypos, Image) {}
|
|
||||||
function Sq_DrawItemFront (Xpos, Ypos, Image) {}
|
|
||||||
function Sq_GetDrawMonBloodSw () {return false;}
|
|
||||||
function Sq_DrawMonsterBlood (Object, X, Y) {}
|
|
||||||
function Sq_Set_Inventory_M_Pos (This) {}
|
|
||||||
function Sq_Get_Ex_IntData (SkillAddress, Idx, objAddress) {return 0;}
|
|
||||||
function Sq_Get_Ex_SkillCoolTime (SkillAddress, Idx, objAddress) {return 0;}
|
|
||||||
function Sq_Get_Ex_LevelData (SkillAddress, Idx, objAddress) {return 0;}
|
|
||||||
function Sq_PlayerEachPos (x, y) {}
|
|
||||||
function Sq_DrawMainMaxLayerCustomUI (pack) {}
|
|
||||||
function Sq_PushDamageFontData (ObjAddress, X, Y, Z, Value, Type,A8,A9) { return true;}
|
|
||||||
function Sq_PushDamageData(ObjAddress, MySelfAddress, Value);
|
|
||||||
function Sq_Pack_Control (chunk) {}
|
|
||||||
function Sq_MessageWindowDraw (a,c) {}
|
|
||||||
function Sq_Get_Event_Pos_X () {return 1;}
|
|
||||||
function Sq_Get_Event_Pos_Y () {return 1;}
|
|
||||||
function Sq_L_OtherPlayerInfo (x, y, Type, Value, ImgBuf) {local str = Value.tostring(); local lenght = L_sq_GetStringDrawLength(str); L_sq_DrawImg(ImgBuf, x + 70 - lenght, y + 5); return Value;}
|
|
||||||
function Sq_DrawMiniMapUI (a) {}
|
|
||||||
function Sq_CompleteTask(a1,a2,a3){}
|
|
||||||
function L_drawMainCustomUI_All(){}
|
|
||||||
function L_MouseCallBack(a, b, c,d) {}
|
|
||||||
function L_DrawWindow_A() {}
|
|
||||||
function L_DrawWindow_B() {}
|
|
||||||
function L_OpenOldWindowCallBack(WindowIndex) {}
|
|
||||||
function L_Old_Window_Get(WindowObject) {}
|
|
||||||
function L_Character_Info_Window(WindowObject) { return false;}
|
|
||||||
function L_Other_Character_Info_Window(WindowObject) {return false;}
|
|
||||||
function L_Old_Window_Visible(WindowObject,Flag) {}
|
|
||||||
|
|
||||||
|
//本地逻辑 直接读取配置文件来加载nut
|
||||||
|
#ifndef SELL
|
||||||
|
Sq_pushroottable(v);
|
||||||
|
Sq_pushstring(v, L"RINDROLOCAL", -1);
|
||||||
|
Sq_pushbool(v, true);
|
||||||
|
sq_newslot(v, -3, SQFalse);
|
||||||
|
Sq_pop(v, 1);
|
||||||
|
|
||||||
getroottable().LenheartBaseFuncTab <- {};
|
std::ifstream f("sqr/FileConfig.json");
|
||||||
getroottable().LenheartFuncTab <- {};
|
nlohmann::json Jso = nlohmann::json::parse(f);
|
||||||
getroottable().Rindro_Scr_Width <- L_sq_RA(0x4D848E);
|
f.close();
|
||||||
getroottable().Rindro_Scr_High <- L_sq_RA(0x4D8495);
|
|
||||||
|
|
||||||
)";
|
//加载基础脚本
|
||||||
|
for (const auto& elem : Jso["BaseScript"]) {
|
||||||
|
if (elem.is_string()) {
|
||||||
|
std::string line = elem.get<std::string>();
|
||||||
|
|
||||||
//是否为本地
|
std::string ContentString = "";
|
||||||
FILE* file = fopen("sqr/DofileList.nut", "rb");
|
std::fstream F;
|
||||||
if (file)
|
F.open(("sqr/" + line).c_str(), std::ios::in);
|
||||||
{
|
if (F.is_open()) {
|
||||||
Base += "RINDROLOCAL <- true";
|
std::stringstream ContentStringStream;
|
||||||
fclose(file);
|
ContentStringStream << F.rdbuf();
|
||||||
}
|
ContentString = (ContentStringStream.str());
|
||||||
else {
|
F.close();
|
||||||
Base += "RINDROLOCAL <- false";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
|
std::wstring filename = DNFTOOL::charTowchar_t((char*)line.c_str(), line.length());
|
||||||
|
std::wstring str = DNFTOOL::charTowchar_t((char*)ContentString.c_str(), ContentString.length());
|
||||||
wchar_t* filename = DNFTOOL::charTowchar_t((char*)BaseFile.c_str());
|
if (sq_mycompilebuffer(v, str.c_str(), str.length(), filename.c_str(), false) >= 0) {
|
||||||
wchar_t* str = DNFTOOL::charTowchar_t((char*)Base.c_str());
|
|
||||||
|
|
||||||
if (sq_mycompilebuffer(v, str, wcslen(str), filename, false) >= 0) {
|
|
||||||
Sq_pushroottable(v);
|
Sq_pushroottable(v);
|
||||||
Sq_call(v, 1, SQTrue, SQFalse);
|
Sq_call(v, 1, SQTrue, SQFalse);
|
||||||
Sq_pop(v, 1);
|
Sq_pop(v, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
delete[]filename;
|
|
||||||
delete[]str;
|
|
||||||
|
|
||||||
#ifndef SELL//本地模式要加在整体脚本
|
|
||||||
#ifndef EXPRESS//本地模式要加在整体脚本
|
|
||||||
Sq_pushroottable(v);
|
|
||||||
Sq_pushstring(v, L"dofile", -1);
|
|
||||||
if (SQ_SUCCEEDED(Sq_get(v, -2))) {
|
|
||||||
Sq_pushroottable(v);
|
|
||||||
Sq_pushstring(v, L"sqr/DofileList.nut", -1);
|
|
||||||
Sq_call(v, 2, SQFalse, SQTrue);
|
|
||||||
}
|
}
|
||||||
Sq_pop(v, 2);
|
}
|
||||||
#endif // !SELL
|
//加载项目脚本
|
||||||
#endif // !SELL
|
for (const auto& elem : Jso["ProjectScript"]) {
|
||||||
|
if (!Jso.contains("Enabled") || Jso["ProjectScript"] == true) {
|
||||||
|
for (const auto& path : elem["Script"]) {
|
||||||
|
if (path.is_string()) {
|
||||||
|
std::string line = path.get<std::string>();
|
||||||
|
|
||||||
|
std::string ContentString = "";
|
||||||
|
std::fstream F;
|
||||||
|
F.open(("sqr/" + line).c_str(), std::ios::in);
|
||||||
|
if (F.is_open()) {
|
||||||
|
std::stringstream ContentStringStream;
|
||||||
|
ContentStringStream << F.rdbuf();
|
||||||
|
ContentString = (ContentStringStream.str());
|
||||||
|
F.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring filename = DNFTOOL::charTowchar_t((char*)line.c_str(), line.length());
|
||||||
|
std::wstring str = DNFTOOL::charTowchar_t((char*)ContentString.c_str(), ContentString.length());
|
||||||
|
if (sq_mycompilebuffer(v, str.c_str(), str.length(), filename.c_str(), false) >= 0) {
|
||||||
|
Sq_pushroottable(v);
|
||||||
|
Sq_call(v, 1, SQTrue, SQFalse);
|
||||||
|
Sq_pop(v, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::cout << "weiqiyong" << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // !SELL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1229,10 +1268,6 @@ void _fastcall H_Register_DrawCode(DWORD thisc, int Seat, int a3, int a4, int a5
|
||||||
delete[]clone;
|
delete[]clone;
|
||||||
|
|
||||||
|
|
||||||
if (GameStr.find("将帐号金库中的物品存入金库中") != std::string::npos) {
|
|
||||||
std::cout << GameStr << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
return DrawCodeF(thisc, Seat, a3, a4, a5, a6);
|
return DrawCodeF(thisc, Seat, a3, a4, a5, a6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1930,24 +1965,26 @@ int __fastcall New43A1B0(DWORD thisc, DWORD Seat, int Xpos, int Ypos) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 原函数指针类型定义
|
||||||
|
typedef DWORD*(__stdcall _744CB0)(DWORD thisc, DWORD Address, DWORD S);
|
||||||
|
static _744CB0* Old744CB0;
|
||||||
|
DWORD* __stdcall New744CB0(DWORD Idx, DWORD Address, DWORD S) {
|
||||||
|
|
||||||
|
if (Idx == 370) {
|
||||||
|
std::cout << std::hex << Address << std::endl;
|
||||||
|
}
|
||||||
|
//std::cout << "regist: " << *(int*)Idx << std::endl;
|
||||||
|
return Old744CB0(Idx, Address, S);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void RegisterHook() {
|
void RegisterHook() {
|
||||||
|
|
||||||
#ifdef EXPRESS
|
//InlineHook//
|
||||||
InitGameFlag = true;
|
|
||||||
MH_Initialize();
|
|
||||||
|
|
||||||
//Hook收包
|
|
||||||
MH_CreateHook((void*)0x721EA0, &H_Register_Pack, reinterpret_cast<void**>(&Lpfn_Init));
|
|
||||||
MH_EnableHook((void*)0x721EA0);
|
|
||||||
|
|
||||||
//HookNut函数注册
|
|
||||||
MH_CreateHook((void*)0x67B910, &H_Register_Nut, reinterpret_cast<void**>(&Register_Nut_Old));
|
|
||||||
MH_EnableHook((void*)0x67B910);
|
|
||||||
|
|
||||||
return;
|
|
||||||
#endif // EXPRESS
|
|
||||||
|
|
||||||
//InlineHook///
|
|
||||||
|
|
||||||
//玩家菜单选项HOOK 有回调
|
//玩家菜单选项HOOK 有回调
|
||||||
inlinehook SSS(0x001004B52, (int)&PlayerEach2);
|
inlinehook SSS(0x001004B52, (int)&PlayerEach2);
|
||||||
|
|
@ -1970,6 +2007,10 @@ void RegisterHook() {
|
||||||
inlinehook MonsetrRaceHook(0x43A862, (int)&MonsetrRace_Hook);
|
inlinehook MonsetrRaceHook(0x43A862, (int)&MonsetrRace_Hook);
|
||||||
MonsetrRaceHook.Motify_address();
|
MonsetrRaceHook.Motify_address();
|
||||||
|
|
||||||
|
//血槽背景层Hook (图标绘制也在这里)
|
||||||
|
inlinehook HudBloodBackgroundHook(0x04CA035, (int)&HudBloodBackground);
|
||||||
|
HudBloodBackgroundHook.Motify_address();
|
||||||
|
|
||||||
////读取StringBin文件
|
////读取StringBin文件
|
||||||
//inlinehook ReadStringBinHookA(0x119F2F8, (int)&ReadStringBin_HookA);
|
//inlinehook ReadStringBinHookA(0x119F2F8, (int)&ReadStringBin_HookA);
|
||||||
//ReadStringBinHookA.Motify_address();
|
//ReadStringBinHookA.Motify_address();
|
||||||
|
|
@ -1977,15 +2018,27 @@ void RegisterHook() {
|
||||||
//ReadStringBinHookB.Motify_address();
|
//ReadStringBinHookB.Motify_address();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Fundction Hook//
|
//Fundction Hook//
|
||||||
MH_Initialize();
|
MH_Initialize();
|
||||||
|
|
||||||
|
|
||||||
|
//FILE* mengyiqufile = fopen("mengyiqukey.dll", "rb");
|
||||||
|
//if (!mengyiqufile)
|
||||||
|
//{
|
||||||
|
// MH_CreateHook(&connect, &HookedConnect, reinterpret_cast<LPVOID*>(&pOriginalConnect));
|
||||||
|
// MH_EnableHook(&connect);
|
||||||
|
//}
|
||||||
|
//else fclose(mengyiqufile);
|
||||||
|
//MH_CreateHook(&sendto, &HookedSendTo, reinterpret_cast<LPVOID*>(&originalSendTo));
|
||||||
|
//MH_EnableHook(&sendto);
|
||||||
|
|
||||||
//关闭原版商城
|
//关闭原版商城
|
||||||
//MH_CreateHook((void*)0x4294A0, &New4294A0, reinterpret_cast<void**>(&Old4294A0));
|
//MH_CreateHook((void*)0x4294A0, &New4294A0, reinterpret_cast<void**>(&Old4294A0));
|
||||||
//MH_EnableHook((void*)0x4294A0);
|
//MH_EnableHook((void*)0x4294A0);
|
||||||
|
|
||||||
|
// hook注册包
|
||||||
|
//MH_CreateHook((void*)0x744CB0, &New744CB0, reinterpret_cast<void**>(&Old744CB0));
|
||||||
|
//MH_EnableHook((void*)0x744CB0);
|
||||||
|
|
||||||
//绘制鼠标
|
//绘制鼠标
|
||||||
MH_CreateHook((void*)0xFFDC60, &NewFFDC60, reinterpret_cast<void**>(&OldFFDC60));
|
MH_CreateHook((void*)0xFFDC60, &NewFFDC60, reinterpret_cast<void**>(&OldFFDC60));
|
||||||
|
|
@ -2052,8 +2105,8 @@ void RegisterHook() {
|
||||||
|
|
||||||
//Hook发包相关
|
//Hook发包相关
|
||||||
//HOOK发包类型
|
//HOOK发包类型
|
||||||
MH_CreateHook((void*)0x1127D60, &NewSendPacksType, reinterpret_cast<void**>(&_OldSendPackType));
|
//MH_CreateHook((void*)0x1127D60, &NewSendPacksType, reinterpret_cast<void**>(&_OldSendPackType));
|
||||||
MH_EnableHook((void*)0x1127D60);
|
//MH_EnableHook((void*)0x1127D60);
|
||||||
//MH_CreateHook((void*)0x1128550, &NewSendPacksByte, reinterpret_cast<void**>(&_OldSendPackByte));
|
//MH_CreateHook((void*)0x1128550, &NewSendPacksByte, reinterpret_cast<void**>(&_OldSendPackByte));
|
||||||
//MH_EnableHook((void*)0x1128550);
|
//MH_EnableHook((void*)0x1128550);
|
||||||
//MH_CreateHook((void*)0x1128580, &NewSendPacksWord, reinterpret_cast<void**>(&_OldSendPackWord));
|
//MH_CreateHook((void*)0x1128580, &NewSendPacksWord, reinterpret_cast<void**>(&_OldSendPackWord));
|
||||||
|
|
@ -2073,10 +2126,6 @@ void RegisterHook() {
|
||||||
MH_CreateHook((void*)0x11A8F60, &newsub11A8F60, reinterpret_cast<void**>(&sub11A8F60));
|
MH_CreateHook((void*)0x11A8F60, &newsub11A8F60, reinterpret_cast<void**>(&sub11A8F60));
|
||||||
MH_EnableHook((void*)0x11A8F60);
|
MH_EnableHook((void*)0x11A8F60);
|
||||||
|
|
||||||
//血槽背景层Hook (图标绘制也在这里)
|
|
||||||
inlinehook HudBloodBackgroundHook(0x04CA035, (int)&HudBloodBackground);
|
|
||||||
HudBloodBackgroundHook.Motify_address();
|
|
||||||
|
|
||||||
//如果加载了百级UI
|
//如果加载了百级UI
|
||||||
FILE* file = fopen("ImagePacks2/!HUD_Yosin百级UI.NPK", "rb");
|
FILE* file = fopen("ImagePacks2/!HUD_Yosin百级UI.NPK", "rb");
|
||||||
if (file) {
|
if (file) {
|
||||||
|
|
@ -2154,8 +2203,8 @@ void RegisterHook() {
|
||||||
MH_EnableHook((void*)0x43A1B0);
|
MH_EnableHook((void*)0x43A1B0);
|
||||||
|
|
||||||
//他人信息Hook 数值
|
//他人信息Hook 数值
|
||||||
MH_CreateHook((void*)0xFA42D0, &NewFA42D0, reinterpret_cast<void**>(&OldFA42D0));
|
//MH_CreateHook((void*)0xFA42D0, &NewFA42D0, reinterpret_cast<void**>(&OldFA42D0));
|
||||||
MH_EnableHook((void*)0xFA42D0);
|
//MH_EnableHook((void*)0xFA42D0);
|
||||||
//他人信息Hook 图标
|
//他人信息Hook 图标
|
||||||
//MH_CreateHook((void*)0xFA8230, &NewFA8230, reinterpret_cast<void**>(&OldFA8230));
|
//MH_CreateHook((void*)0xFA8230, &NewFA8230, reinterpret_cast<void**>(&OldFA8230));
|
||||||
//MH_EnableHook((void*)0xFA8230);
|
//MH_EnableHook((void*)0xFA8230);
|
||||||
|
|
|
||||||
|
|
@ -182,6 +182,6 @@ void HookHudUi() {
|
||||||
//DNFTOOL::WriteInt(0x6F45F6, 1067);//ÔŘČë˝çĂćתȌYÖá
|
//DNFTOOL::WriteInt(0x6F45F6, 1067);//ÔŘČë˝çĂćתȌYÖá
|
||||||
|
|
||||||
|
|
||||||
*(char*)(0x10F17FA) = 235;//跳选择服务器
|
*(char*)(0x10F17FA) = (BYTE)235;//跳选择服务器
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include "json.hpp"
|
#include "json.hpp"
|
||||||
|
#include "Register_System.hpp"
|
||||||
|
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
|
|
@ -66,10 +67,9 @@ static SQInteger sq_StringBinById(HSQUIRRELVM v)
|
||||||
char* uncode = (char*)(StringBin[Idx]).c_str();
|
char* uncode = (char*)(StringBin[Idx]).c_str();
|
||||||
|
|
||||||
//char* ss = DNFTOOL::GBKTOUTF8(std::string(uncode));
|
//char* ss = DNFTOOL::GBKTOUTF8(std::string(uncode));
|
||||||
wchar_t* cfg = DNFTOOL::charTowchar_t(uncode);
|
std::wstring cfg = DNFTOOL::charTowchar_t(uncode);
|
||||||
|
|
||||||
Sq_pushstring(v, cfg, -1);
|
Sq_pushstring(v, cfg.c_str(), -1);
|
||||||
delete[]cfg;
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -129,9 +129,8 @@ static SQInteger sq_LongLongOperation(HSQUIRRELVM v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
wchar_t* ss = DNFTOOL::charTowchar_t((char*)RetString.c_str());
|
std::wstring ss = DNFTOOL::charTowchar_t((char*)RetString.c_str());
|
||||||
Sq_pushstring(v, ss, -1);
|
Sq_pushstring(v, ss.c_str(), -1);
|
||||||
delete[]ss;
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -190,9 +189,8 @@ static SQInteger sq_Dezlib(HSQUIRRELVM v)
|
||||||
std::string StrBuf = bb.decode(RealStr);
|
std::string StrBuf = bb.decode(RealStr);
|
||||||
StrBuf = gzip_decompress(StrBuf);
|
StrBuf = gzip_decompress(StrBuf);
|
||||||
|
|
||||||
wchar_t* ss = DNFTOOL::charTowchar_t((char*)StrBuf.c_str());
|
std::wstring ss = DNFTOOL::charTowchar_t((char*)StrBuf.c_str());
|
||||||
Sq_pushstring(v, ss, -1);
|
Sq_pushstring(v, ss.c_str(), -1);
|
||||||
delete[]ss;
|
|
||||||
|
|
||||||
//std::cout << StrBuf << std::endl;
|
//std::cout << StrBuf << std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
@ -509,6 +507,43 @@ static SQInteger sq_DrawButton(HSQUIRRELVM v)
|
||||||
Draw_Img(*(int*)0x1B45B94, 0, X + FirstWidth + FillWidth * widthCount, Y, rightFrame);
|
Draw_Img(*(int*)0x1B45B94, 0, X + FirstWidth + FillWidth * widthCount, Y, rightFrame);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SQInteger sq_Draw3Image_Vertical(HSQUIRRELVM v)
|
||||||
|
{
|
||||||
|
int Top = Sq_gettop(v);
|
||||||
|
int X;
|
||||||
|
Sq_getinteger(v, 2, &X);
|
||||||
|
int Y;
|
||||||
|
Sq_getinteger(v, 3, &Y);
|
||||||
|
int WindowHeight;
|
||||||
|
Sq_getinteger(v, 4, &WindowHeight);
|
||||||
|
const SQChar* File;
|
||||||
|
Sq_getstring(v, 5, &File);
|
||||||
|
int StartIdx;
|
||||||
|
Sq_getinteger(v, 6, &StartIdx);
|
||||||
|
//填充高度
|
||||||
|
int FillHeight;
|
||||||
|
Sq_getinteger(v, 7, &FillHeight);
|
||||||
|
//首节高度
|
||||||
|
int FirstHeight;
|
||||||
|
Sq_getinteger(v, 8, &FirstHeight);
|
||||||
|
|
||||||
|
int heightCount = round(WindowHeight / 2);
|
||||||
|
|
||||||
|
int npkbuf = Load_Npk(*(int*)0x1B4684C, 0, 0, (wchar_t*)File);
|
||||||
|
int topFrame = Get_Img(npkbuf, 0, 0 + StartIdx);
|
||||||
|
int centerFrame = Get_Img(npkbuf, 0, 1 + StartIdx);
|
||||||
|
int bottomFrame = Get_Img(npkbuf, 0, 2 + StartIdx);
|
||||||
|
|
||||||
|
Draw_Img(*(int*)0x1B45B94, 0, X, Y, topFrame);
|
||||||
|
for (int i = 0; i < heightCount; i++) {
|
||||||
|
Draw_Img(*(int*)0x1B45B94, 0, X, Y + FirstHeight + FillHeight * i, centerFrame);
|
||||||
|
}
|
||||||
|
|
||||||
|
Draw_Img(*(int*)0x1B45B94, 0, X, Y + FirstHeight + FillHeight * heightCount, bottomFrame);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
//获取文字绘制长度
|
//获取文字绘制长度
|
||||||
static std::map<std::string, int>LenheartCodeWidth;
|
static std::map<std::string, int>LenheartCodeWidth;
|
||||||
static SQInteger Sq_getstringDrawLength(HSQUIRRELVM v) {
|
static SQInteger Sq_getstringDrawLength(HSQUIRRELVM v) {
|
||||||
|
|
@ -516,6 +551,7 @@ static SQInteger Sq_getstringDrawLength(HSQUIRRELVM v) {
|
||||||
const SQChar* Str;
|
const SQChar* Str;
|
||||||
Sq_getstring(v, 2, &Str);
|
Sq_getstring(v, 2, &Str);
|
||||||
|
|
||||||
|
if (Str == NULL)Str = L"";
|
||||||
char* OutPutText = DNFTOOL::SquirrelU2W(Str);
|
char* OutPutText = DNFTOOL::SquirrelU2W(Str);
|
||||||
std::string RealStr = OutPutText;
|
std::string RealStr = OutPutText;
|
||||||
delete[]OutPutText;
|
delete[]OutPutText;
|
||||||
|
|
@ -787,10 +823,9 @@ static SQInteger Sq_getstringDrawArray(HSQUIRRELVM v) {
|
||||||
{
|
{
|
||||||
std::string Buf = PushStrBuf[i];
|
std::string Buf = PushStrBuf[i];
|
||||||
char* ss = DNFTOOL::GBKTOUTF8(Buf);
|
char* ss = DNFTOOL::GBKTOUTF8(Buf);
|
||||||
wchar_t* aa = DNFTOOL::charTowchar_t(ss);
|
std::wstring aa = DNFTOOL::charTowchar_t(ss);
|
||||||
Sq_pushstring(v, aa, -1);
|
Sq_pushstring(v, aa.c_str(), -1);
|
||||||
sq_arrayappend((HSQUIRRELVM)v, -2);
|
sq_arrayappend((HSQUIRRELVM)v, -2);
|
||||||
delete[]aa;
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -828,9 +863,8 @@ static SQInteger DecondeJson(HSQUIRRELVM v) {
|
||||||
|
|
||||||
str = DNFTOOL::ReplaceAll(str, ":", "=");
|
str = DNFTOOL::ReplaceAll(str, ":", "=");
|
||||||
|
|
||||||
wchar_t* ss = DNFTOOL::charTowchar_t((char*)str.c_str());
|
std::wstring ss = DNFTOOL::charTowchar_t((char*)str.c_str());
|
||||||
Sq_pushstring(v, ss, -1);
|
Sq_pushstring(v, ss.c_str(), -1);
|
||||||
delete[]ss;
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
//序列化Json
|
//序列化Json
|
||||||
|
|
@ -1016,10 +1050,11 @@ static SQInteger EncondeJson(HSQUIRRELVM v) {
|
||||||
std::string Jso = "";
|
std::string Jso = "";
|
||||||
std::string RealJso = EncodeTABLE((HSQUIRRELVM)v, Jso);
|
std::string RealJso = EncodeTABLE((HSQUIRRELVM)v, Jso);
|
||||||
char* sbuf = DNFTOOL::GBKTOUTF8(RealJso);
|
char* sbuf = DNFTOOL::GBKTOUTF8(RealJso);
|
||||||
wchar_t* ss = DNFTOOL::charTowchar_t(sbuf);
|
std::wstring ss = DNFTOOL::charTowchar_t(sbuf);
|
||||||
Sq_pushstring(v, ss, -1);
|
Sq_pushstring(v, ss.c_str(), -1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//按键是否按下
|
//按键是否按下
|
||||||
static SQInteger sq_IsKeyDown(HSQUIRRELVM v) {
|
static SQInteger sq_IsKeyDown(HSQUIRRELVM v) {
|
||||||
|
|
||||||
|
|
@ -1151,10 +1186,9 @@ static SQInteger sq_GetPlayerEachName(HSQUIRRELVM v)
|
||||||
{
|
{
|
||||||
int objNameAddress = *(int*)(0x1ade0e0);
|
int objNameAddress = *(int*)(0x1ade0e0);
|
||||||
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)(objNameAddress + 0x20));
|
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)(objNameAddress + 0x20));
|
||||||
wchar_t* name = DNFTOOL::charTowchar_t(str);
|
std::wstring name = DNFTOOL::charTowchar_t(str);
|
||||||
free(str);
|
free(str);
|
||||||
Sq_pushstring(v, name, -1);
|
Sq_pushstring(v, name.c_str(), -1);
|
||||||
delete[]name;
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
//获取技能地址
|
//获取技能地址
|
||||||
|
|
@ -1258,10 +1292,9 @@ static SQInteger GetObjectName(HSQUIRRELVM v)
|
||||||
int objAddress = GetSqrObject(v, 2);
|
int objAddress = GetSqrObject(v, 2);
|
||||||
int objNameAddress = *(int*)(objAddress + 0x258);
|
int objNameAddress = *(int*)(objAddress + 0x258);
|
||||||
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)objNameAddress);
|
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)objNameAddress);
|
||||||
wchar_t* name = DNFTOOL::charTowchar_t(str);
|
std::wstring name = DNFTOOL::charTowchar_t(str);
|
||||||
free(str);
|
free(str);
|
||||||
Sq_pushstring(v, name, -1);
|
Sq_pushstring(v, name.c_str(), -1);
|
||||||
delete[]name;
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
//设置对象名称
|
//设置对象名称
|
||||||
|
|
@ -1283,10 +1316,9 @@ static SQInteger GetObjectNameByAddress(HSQUIRRELVM v)
|
||||||
Sq_getinteger(v, 2, &objAddress);
|
Sq_getinteger(v, 2, &objAddress);
|
||||||
int objNameAddress = *(int*)(objAddress + 0x258);
|
int objNameAddress = *(int*)(objAddress + 0x258);
|
||||||
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)objNameAddress);
|
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)objNameAddress);
|
||||||
wchar_t* name = DNFTOOL::charTowchar_t(str);
|
std::wstring name = DNFTOOL::charTowchar_t(str);
|
||||||
free(str);
|
free(str);
|
||||||
Sq_pushstring(v, name, -1);
|
Sq_pushstring(v, name.c_str(), -1);
|
||||||
delete[]name;
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2687,10 +2719,8 @@ static SQInteger sq_GetInputBoxStr(HSQUIRRELVM v)
|
||||||
|
|
||||||
std::string str = WInfo->str;
|
std::string str = WInfo->str;
|
||||||
char* ss = DNFTOOL::GBKTOUTF8(str);
|
char* ss = DNFTOOL::GBKTOUTF8(str);
|
||||||
//wchar_t* name = DNFTOOL::charTowchar_t((char*)Buf.c_str());
|
std::wstring aa = DNFTOOL::charTowchar_t(ss);
|
||||||
|
Sq_pushstring(v, aa.c_str(), -1);
|
||||||
wchar_t* aa = DNFTOOL::charTowchar_t(ss);
|
|
||||||
Sq_pushstring(v, aa, -1);
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -2761,20 +2791,130 @@ static SQInteger sq_GetItem(HSQUIRRELVM v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 定义2D顶点结构(位置+纹理坐标)
|
||||||
|
struct Vertex2D {
|
||||||
|
float x, y, z; // 位置(z=0表示2D平面)
|
||||||
|
float u, v; // 纹理坐标
|
||||||
|
};
|
||||||
|
|
||||||
|
// 初始化顶点缓冲区(创建一次即可,不必每次绘制都创建)
|
||||||
|
LPDIRECT3DVERTEXBUFFER9 CreateVertexBuffer(LPDIRECT3DDEVICE9 pDevice, float x, float y, float width, float height) {
|
||||||
|
LPDIRECT3DVERTEXBUFFER9 pVB = nullptr;
|
||||||
|
|
||||||
|
// 定义矩形的四个顶点(左上角、右上角、左下角、右下角)
|
||||||
|
Vertex2D vertices[] = {
|
||||||
|
{x, y, 0.0f, 0.0f, 0.0f}, // 左上角
|
||||||
|
{x + width, y, 0.0f, 1.0f, 0.0f}, // 右上角
|
||||||
|
{x, y + height, 0.0f, 0.0f, 1.0f}, // 左下角
|
||||||
|
{x + width, y + height, 0.0f, 1.0f, 1.0f} // 右下角
|
||||||
|
};
|
||||||
|
|
||||||
|
// 创建顶点缓冲区
|
||||||
|
if (FAILED(pDevice->CreateVertexBuffer(
|
||||||
|
4 * sizeof(Vertex2D), // 大小
|
||||||
|
D3DUSAGE_WRITEONLY, // 用法
|
||||||
|
D3DFVF_XYZ | D3DFVF_TEX1, // 顶点格式(位置+1套纹理坐标)
|
||||||
|
D3DPOOL_MANAGED, // 内存池
|
||||||
|
&pVB,
|
||||||
|
nullptr))) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 锁定并写入顶点数据
|
||||||
|
void* pData = nullptr;
|
||||||
|
if (SUCCEEDED(pVB->Lock(0, 0, &pData, 0))) {
|
||||||
|
memcpy(pData, vertices, sizeof(vertices));
|
||||||
|
pVB->Unlock();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pVB->Release();
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pVB;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawMyImage(LPDIRECT3DDEVICE9 pDevice) {
|
||||||
|
// 1. 准备RGBA数据(100x100红色图像)
|
||||||
|
int width = 100, height = 100;
|
||||||
|
std::vector<BYTE> rgbaData(width * height * 4);
|
||||||
|
for (int i = 0; i < width * height; i++) {
|
||||||
|
rgbaData[i * 4 + 0] = 0; // R
|
||||||
|
rgbaData[i * 4 + 1] = 0; // G
|
||||||
|
rgbaData[i * 4 + 2] = 255; // B
|
||||||
|
rgbaData[i * 4 + 3] = 255; // A
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 创建纹理
|
||||||
|
LPDIRECT3DTEXTURE9 pTexture = nullptr;
|
||||||
|
if (FAILED(pDevice->CreateTexture(width, height, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &pTexture, nullptr))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 锁定纹理写入数据
|
||||||
|
D3DLOCKED_RECT lockedRect;
|
||||||
|
if (FAILED(pTexture->LockRect(0, &lockedRect, nullptr, 0))) {
|
||||||
|
pTexture->Release();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
BYTE* dst = (BYTE*)lockedRect.pBits;
|
||||||
|
const BYTE* src = rgbaData.data();
|
||||||
|
for (int y = 0; y < height; y++) {
|
||||||
|
memcpy(dst, src, width * 4);
|
||||||
|
src += width * 4;
|
||||||
|
dst += lockedRect.Pitch;
|
||||||
|
}
|
||||||
|
pTexture->UnlockRect(0);
|
||||||
|
|
||||||
|
// 4. 创建顶点缓冲区(绘制位置(0,0),大小800x600)
|
||||||
|
LPDIRECT3DVERTEXBUFFER9 pVB = CreateVertexBuffer(pDevice, 0, 0, 800, 600);
|
||||||
|
if (!pVB) {
|
||||||
|
pTexture->Release();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------
|
||||||
|
// 关键:保存原始渲染状态
|
||||||
|
// --------------------------
|
||||||
|
DWORD originalFVF, originalZEnable;
|
||||||
|
LPDIRECT3DBASETEXTURE9 originalTexture = nullptr;
|
||||||
|
pDevice->GetFVF(&originalFVF); // 保存原始顶点格式
|
||||||
|
pDevice->GetTexture(0, &originalTexture); // 保存原始纹理
|
||||||
|
pDevice->GetRenderState(D3DRS_ZENABLE, &originalZEnable); // 保存Z缓冲状态
|
||||||
|
|
||||||
|
// --------------------------
|
||||||
|
// 设置绘制所需状态
|
||||||
|
// --------------------------
|
||||||
|
pDevice->SetFVF(D3DFVF_XYZ | D3DFVF_TEX1); // 恢复顶点格式
|
||||||
|
pDevice->SetTexture(0, pTexture); // 绑定你的纹理
|
||||||
|
pDevice->SetStreamSource(0, pVB, 0, sizeof(Vertex2D)); // 绑定顶点缓冲区
|
||||||
|
pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); // 临时禁用Z缓冲
|
||||||
|
|
||||||
|
// 5. 绘制
|
||||||
|
pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
|
||||||
|
|
||||||
|
// --------------------------
|
||||||
|
// 关键:恢复原始渲染状态
|
||||||
|
// --------------------------
|
||||||
|
pDevice->SetFVF(originalFVF); // 恢复顶点格式
|
||||||
|
pDevice->SetTexture(0, originalTexture); // 恢复原始纹理
|
||||||
|
pDevice->SetRenderState(D3DRS_ZENABLE, originalZEnable); // 恢复Z缓冲
|
||||||
|
if (originalTexture) originalTexture->Release(); // 释放引用
|
||||||
|
|
||||||
|
// 6. 释放资源(必须释放,避免泄漏)
|
||||||
|
pVB->Release();
|
||||||
|
pTexture->Release();
|
||||||
|
}
|
||||||
|
|
||||||
typedef int(_fastcall _11A2030)(int thisc, void*, int a2, int a3, int a4, int a5);
|
typedef int(_fastcall _11A2030)(int thisc, void*, int a2, int a3, int a4, int a5);
|
||||||
static _11A2030* SUB_11A2030 = (_11A2030*)0x11A2030;
|
static _11A2030* SUB_11A2030 = (_11A2030*)0x11A2030;
|
||||||
static SQInteger sq_Test(HSQUIRRELVM v)
|
static SQInteger sq_Test(HSQUIRRELVM v)
|
||||||
{
|
{
|
||||||
const SQChar* Path;
|
SQInteger FuncAddressbuf;
|
||||||
sq_getstring(v, 2, &Path);
|
Sq_getinteger(v, 2, &FuncAddressbuf);
|
||||||
char* a = new char[1024];
|
|
||||||
//wchar_t* path = L"region/region.lst";
|
|
||||||
SUB_11A2030(0x1D17638, 0, (int)Path, (int)a, 0x100000, 0x19DAF4);
|
|
||||||
|
|
||||||
//std::cout << a << std::endl;
|
DrawMyImage((LPDIRECT3DDEVICE9)FuncAddressbuf);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static SQInteger Sq_ActiveCallFunc(HSQUIRRELVM v)
|
static SQInteger Sq_ActiveCallFunc(HSQUIRRELVM v)
|
||||||
|
|
@ -2939,9 +3079,8 @@ static SQInteger Sq_ActiveCallFunc(HSQUIRRELVM v)
|
||||||
else if (CONTAINS_STRING(RetTypeString, "bool"))
|
else if (CONTAINS_STRING(RetTypeString, "bool"))
|
||||||
Sq_pushbool(v, (bool)result);
|
Sq_pushbool(v, (bool)result);
|
||||||
else if (CONTAINS_STRING(RetTypeString, "string")) {
|
else if (CONTAINS_STRING(RetTypeString, "string")) {
|
||||||
wchar_t* ss = DNFTOOL::charTowchar_t((char*)result);
|
std::wstring ss = DNFTOOL::charTowchar_t((char*)result);
|
||||||
Sq_pushstring(v, ss, -1);
|
Sq_pushstring(v, ss.c_str(), -1);
|
||||||
delete[]ss;
|
|
||||||
}
|
}
|
||||||
else if (CONTAINS_STRING(RetTypeString, "pointer"))
|
else if (CONTAINS_STRING(RetTypeString, "pointer"))
|
||||||
Sq_pushuserpointer(v, (void*)result);
|
Sq_pushuserpointer(v, (void*)result);
|
||||||
|
|
@ -3055,18 +3194,16 @@ static SQInteger Memory_ReadString(HSQUIRRELVM v)
|
||||||
Sq_getinteger(v, 3, &Length);
|
Sq_getinteger(v, 3, &Length);
|
||||||
|
|
||||||
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)Address);
|
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)Address);
|
||||||
wchar_t* name = DNFTOOL::charTowchar_t(str);
|
std::wstring name = DNFTOOL::charTowchar_t(str);
|
||||||
free(str);
|
free(str);
|
||||||
Sq_pushstring(v, name, Length);
|
Sq_pushstring(v, name.c_str(), Length);
|
||||||
delete[]name;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)Address);
|
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)Address);
|
||||||
wchar_t* name = DNFTOOL::charTowchar_t(str);
|
std::wstring name = DNFTOOL::charTowchar_t(str);
|
||||||
free(str);
|
free(str);
|
||||||
Sq_pushstring(v, name, -1);
|
Sq_pushstring(v, name.c_str(), -1);
|
||||||
delete[]name;
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -3082,15 +3219,13 @@ static SQInteger Memory_ReadStringByUtf8(HSQUIRRELVM v)
|
||||||
SQInteger Length;
|
SQInteger Length;
|
||||||
Sq_getinteger(v, 3, &Length);
|
Sq_getinteger(v, 3, &Length);
|
||||||
|
|
||||||
wchar_t* name = DNFTOOL::charTowchar_t((char*)Address);
|
std::wstring name = DNFTOOL::charTowchar_t((char*)Address);
|
||||||
Sq_pushstring(v, name, Length);
|
Sq_pushstring(v, name.c_str(), Length);
|
||||||
delete[]name;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wchar_t* name = DNFTOOL::charTowchar_t((char*)Address);
|
std::wstring name = DNFTOOL::charTowchar_t((char*)Address);
|
||||||
Sq_pushstring(v, name, -1);
|
Sq_pushstring(v, name.c_str(), -1);
|
||||||
delete[]name;
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -3106,21 +3241,19 @@ static SQInteger Memory_ReadStringByBig5(HSQUIRRELVM v)
|
||||||
SQInteger Length;
|
SQInteger Length;
|
||||||
Sq_getinteger(v, 3, &Length);
|
Sq_getinteger(v, 3, &Length);
|
||||||
|
|
||||||
wchar_t* newadd = DNFTOOL::charTowchar_t((char*)Address);
|
std::wstring newadd = DNFTOOL::charTowchar_t((char*)Address);
|
||||||
char* str = DNFTOOL::Big5ToUtf8(newadd);
|
char* str = DNFTOOL::Big5ToUtf8(newadd.c_str());
|
||||||
wchar_t* name = DNFTOOL::charTowchar_t(str);
|
std::wstring name = DNFTOOL::charTowchar_t(str);
|
||||||
free(str);
|
free(str);
|
||||||
Sq_pushstring(v, name, Length);
|
Sq_pushstring(v, name.c_str(), Length);
|
||||||
delete[]name;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wchar_t* newadd = DNFTOOL::charTowchar_t((char*)Address);
|
std::wstring newadd = DNFTOOL::charTowchar_t((char*)Address);
|
||||||
char* str = DNFTOOL::Big5ToUtf8(newadd);
|
char* str = DNFTOOL::Big5ToUtf8(newadd.c_str());
|
||||||
wchar_t* name = DNFTOOL::charTowchar_t(str);
|
std::wstring name = DNFTOOL::charTowchar_t(str);
|
||||||
free(str);
|
free(str);
|
||||||
Sq_pushstring(v, name, -1);
|
Sq_pushstring(v, name.c_str(), -1);
|
||||||
delete[]name;
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -3142,20 +3275,18 @@ static SQInteger ConvertWideChar(HSQUIRRELVM v)
|
||||||
char* csa = DNFTOOL::wchar_tTochar((wchar_t*)Str);
|
char* csa = DNFTOOL::wchar_tTochar((wchar_t*)Str);
|
||||||
wchar_t* name = DNFTOOL::BIG5ToUnicode(csa);
|
wchar_t* name = DNFTOOL::BIG5ToUnicode(csa);
|
||||||
char* str = DNFTOOL::UnicodeToUtf8(name);
|
char* str = DNFTOOL::UnicodeToUtf8(name);
|
||||||
wchar_t* realname = DNFTOOL::charTowchar_t(str);
|
std::wstring realname = DNFTOOL::charTowchar_t(str);
|
||||||
free(str);
|
free(str);
|
||||||
|
|
||||||
Sq_pushstring(v, realname, -1);
|
Sq_pushstring(v, realname.c_str(), -1);
|
||||||
delete[]csa;
|
delete[]csa;
|
||||||
delete[]name;
|
delete[]name;
|
||||||
delete[]realname;
|
|
||||||
}
|
}
|
||||||
else if (CONTAINS_STRING(fromEncoding, "unicode")) {
|
else if (CONTAINS_STRING(fromEncoding, "unicode")) {
|
||||||
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)Str);
|
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)Str);
|
||||||
wchar_t* name = DNFTOOL::charTowchar_t(str);
|
std::wstring name = DNFTOOL::charTowchar_t(str);
|
||||||
free(str);
|
free(str);
|
||||||
Sq_pushstring(v, name, -1);
|
Sq_pushstring(v, name.c_str(), -1);
|
||||||
delete[]name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
@ -3194,6 +3325,7 @@ static SQInteger OutPutTable(HSQUIRRELVM v)
|
||||||
|
|
||||||
|
|
||||||
void R_Register_Nut() {
|
void R_Register_Nut() {
|
||||||
|
R_Register_System();
|
||||||
|
|
||||||
RegisterMyNutApi(L"L_sq_Test", sq_Test);//zlib解压
|
RegisterMyNutApi(L"L_sq_Test", sq_Test);//zlib解压
|
||||||
|
|
||||||
|
|
@ -3225,6 +3357,7 @@ void R_Register_Nut() {
|
||||||
RegisterMyNutApi(L"L_sq_DrawNumber", sq_DrawNumber);//绘制数字
|
RegisterMyNutApi(L"L_sq_DrawNumber", sq_DrawNumber);//绘制数字
|
||||||
RegisterMyNutApi(L"L_sq_DrawWindow", sq_DrawWindow);//绘制九宫格
|
RegisterMyNutApi(L"L_sq_DrawWindow", sq_DrawWindow);//绘制九宫格
|
||||||
RegisterMyNutApi(L"L_sq_DrawButton", sq_DrawButton);//绘制三联图
|
RegisterMyNutApi(L"L_sq_DrawButton", sq_DrawButton);//绘制三联图
|
||||||
|
RegisterMyNutApi(L"L_sq_Draw3Image_Vertical", sq_Draw3Image_Vertical);//绘制三联图
|
||||||
RegisterMyNutApi(L"L_sq_GetStringDrawLength", Sq_getstringDrawLength);//获取文字绘制长度
|
RegisterMyNutApi(L"L_sq_GetStringDrawLength", Sq_getstringDrawLength);//获取文字绘制长度
|
||||||
RegisterMyNutApi(L"L_sq_GetStringDrawArray", Sq_getstringDrawArray);//获取文字换行返回数组
|
RegisterMyNutApi(L"L_sq_GetStringDrawArray", Sq_getstringDrawArray);//获取文字换行返回数组
|
||||||
RegisterMyNutApi(L"L_sq_DecondeJson", DecondeJson);//反序列化Json
|
RegisterMyNutApi(L"L_sq_DecondeJson", DecondeJson);//反序列化Json
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,152 @@
|
||||||
|
#pragma once
|
||||||
|
#include "DNFTOOL.hpp"
|
||||||
|
|
||||||
|
#include "zlib.h"
|
||||||
|
#include <ctime>
|
||||||
|
#include <sstream>
|
||||||
|
#include <chrono>
|
||||||
|
#include "json.hpp"
|
||||||
|
|
||||||
|
using json = nlohmann::json;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 定义互斥锁和需要重载的文件列表
|
||||||
|
static std::mutex reloadListMutex;
|
||||||
|
static std::vector<std::string> reloadFileList;
|
||||||
|
struct AutoReloadSt
|
||||||
|
{
|
||||||
|
std::string Path;
|
||||||
|
};
|
||||||
|
std::string calculateMD5(const std::string& filePath)
|
||||||
|
{
|
||||||
|
std::ifstream file(filePath, std::ios::binary | std::ios::ate);
|
||||||
|
if (!file)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
std::streampos size = file.tellg();
|
||||||
|
file.seekg(0, std::ios::beg);
|
||||||
|
|
||||||
|
unsigned char buffer[16];
|
||||||
|
MD5_CTX md5Context;
|
||||||
|
MD5_Init(&md5Context);
|
||||||
|
|
||||||
|
while (file.read(reinterpret_cast<char*>(buffer), sizeof(buffer)))
|
||||||
|
{
|
||||||
|
MD5_Update(&md5Context, buffer, file.gcount());
|
||||||
|
}
|
||||||
|
|
||||||
|
MD5_Final(buffer, &md5Context);
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
return LenheartBase::CBASE64::encode((char*)buffer);
|
||||||
|
}
|
||||||
|
void processDirectory(const std::string& directoryPath, std::unordered_map<std::string, std::string>& fileMD5Map) {
|
||||||
|
std::string searchPath = directoryPath + "\\*";
|
||||||
|
WIN32_FIND_DATAA findData;
|
||||||
|
HANDLE hFind = FindFirstFileA(searchPath.c_str(), &findData);
|
||||||
|
|
||||||
|
if (hFind != INVALID_HANDLE_VALUE) {
|
||||||
|
do {
|
||||||
|
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
||||||
|
if (std::string(findData.cFileName) != "." && std::string(findData.cFileName) != "..") {
|
||||||
|
std::string subDirPath = directoryPath + "\\" + findData.cFileName;
|
||||||
|
processDirectory(subDirPath, fileMD5Map);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::string filePath = directoryPath + "\\" + findData.cFileName;
|
||||||
|
if (filePath.find(".nut") == std::string::npos)continue;
|
||||||
|
std::string currentMD5 = calculateMD5(filePath);
|
||||||
|
|
||||||
|
if (fileMD5Map.find(filePath) != fileMD5Map.end()) {
|
||||||
|
if (fileMD5Map[filePath] != currentMD5) {
|
||||||
|
fileMD5Map[filePath] = currentMD5;
|
||||||
|
// 加锁将需要重载的文件添加到列表中
|
||||||
|
std::lock_guard<std::mutex> lock(reloadListMutex);
|
||||||
|
reloadFileList.push_back(filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fileMD5Map[filePath] = currentMD5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (FindNextFileA(hFind, &findData) != 0);
|
||||||
|
FindClose(hFind);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::cerr << "无法打开目录:" << directoryPath << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static DWORD WINAPI AutoReloadThread(LPVOID lpParam)
|
||||||
|
{
|
||||||
|
AutoReloadSt* Info = static_cast<AutoReloadSt*>(lpParam);
|
||||||
|
std::string ReloadPath = Info->Path;
|
||||||
|
delete Info;
|
||||||
|
|
||||||
|
std::unordered_map<std::string, std::string> fileMD5Map;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
processDirectory(ReloadPath, fileMD5Map);
|
||||||
|
Sleep(10);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static SQInteger AutoReload(HSQUIRRELVM v) {
|
||||||
|
const SQChar* value;
|
||||||
|
Sq_getstring((HSQUIRRELVM)v, 2, &value);
|
||||||
|
char* vOutPutText = DNFTOOL::SquirrelU2W(value);
|
||||||
|
std::string ReloadPath = vOutPutText;
|
||||||
|
delete[]vOutPutText;
|
||||||
|
//构造路径结构体传递
|
||||||
|
AutoReloadSt* Info = new AutoReloadSt();
|
||||||
|
Info->Path = ReloadPath;
|
||||||
|
|
||||||
|
DWORD threadID;
|
||||||
|
HANDLE Thand = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)AutoReloadThread, Info, 0, &threadID);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static SQInteger ReloadLogic(HSQUIRRELVM v) {
|
||||||
|
// 加锁获取需要重载的文件列表
|
||||||
|
std::lock_guard<std::mutex> lock(reloadListMutex);
|
||||||
|
for (const auto& file : reloadFileList) {
|
||||||
|
std::string line = file;
|
||||||
|
|
||||||
|
std::string ContentString = "";
|
||||||
|
std::fstream F;
|
||||||
|
F.open((line).c_str(), std::ios::in);
|
||||||
|
if (F.is_open()) {
|
||||||
|
std::stringstream ContentStringStream;
|
||||||
|
ContentStringStream << F.rdbuf();
|
||||||
|
ContentString = (ContentStringStream.str());
|
||||||
|
F.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring filename = DNFTOOL::charTowchar_t((char*)line.c_str(), line.length());
|
||||||
|
std::wstring str = DNFTOOL::charTowchar_t((char*)ContentString.c_str(), ContentString.length());
|
||||||
|
if (sq_mycompilebuffer(v, str.c_str(), str.length(), filename.c_str(), true) >= 0) {
|
||||||
|
Sq_pushroottable(v);
|
||||||
|
Sq_call(v, 1, SQTrue, SQTrue);
|
||||||
|
Sq_pop(v, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 清空列表
|
||||||
|
reloadFileList.clear();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void RegisterNutApi_System(wchar_t* funcName, SQFUNCTION funcAddr)
|
||||||
|
{
|
||||||
|
HSQUIRRELVM v = *(HSQUIRRELVM*)0x1AF3544;
|
||||||
|
Sq_pushroottable(v);
|
||||||
|
Sq_pushstring(v, funcName, -1);
|
||||||
|
RealSqNewClosure(v, funcAddr, 0);
|
||||||
|
SQNewSlot(v, -3, SQFalse);
|
||||||
|
SQPopTop(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
void R_Register_System() {
|
||||||
|
RegisterNutApi_System(L"Sq_AutoReload", AutoReload);//开启热重载
|
||||||
|
RegisterNutApi_System(L"Sq_ReloadLogic", ReloadLogic);//热重载逻辑(保持主线程加载)
|
||||||
|
}
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<ProjectGuid>{75189a0e-e2ca-4ef0-a07e-3dc37c53ba21}</ProjectGuid>
|
<ProjectGuid>{75189a0e-e2ca-4ef0-a07e-3dc37c53ba21}</ProjectGuid>
|
||||||
<RootNamespace>RindroPlugin</RootNamespace>
|
<RootNamespace>RindroPlugin</RootNamespace>
|
||||||
<WindowsTargetPlatformVersion>7.0</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>10.0.22621.0</WindowsTargetPlatformVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
|
@ -36,7 +36,7 @@
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v141_xp</PlatformToolset>
|
<PlatformToolset>v141_xp</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
|
@ -71,9 +71,9 @@
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<IncludePath>H:\Zlib-win32;$(LocalDebuggerWorkingDirectory)OtherInc\nlohmann;$(LocalDebuggerWorkingDirectory)OtherInc\openssl\include;$(LocalDebuggerWorkingDirectory)OtherInc;$(LocalDebuggerWorkingDirectory)Include;$(IncludePath)</IncludePath>
|
<IncludePath>H:\Visual Studio\VS_C_AND_C++_PROJECT\Rindro_Plugin\OtherInc\squirrel_debug\sqdbg\include;H:\Zlib-win32;$(LocalDebuggerWorkingDirectory)OtherInc\nlohmann;$(LocalDebuggerWorkingDirectory)OtherInc\openssl\include;$(LocalDebuggerWorkingDirectory)OtherInc;$(LocalDebuggerWorkingDirectory)Include;$(IncludePath)</IncludePath>
|
||||||
<ExecutablePath>$(ExecutablePath)</ExecutablePath>
|
<ExecutablePath>$(ExecutablePath)</ExecutablePath>
|
||||||
<OutDir>I:\DOF\DNF-CC\Plugins\</OutDir>
|
<OutDir>F:\zhuomian\Sapphire_Case\Plugins\</OutDir>
|
||||||
<LibraryPath>$(LocalDebuggerWorkingDirectory)OtherLib;$(LibraryPath)</LibraryPath>
|
<LibraryPath>$(LocalDebuggerWorkingDirectory)OtherLib;$(LibraryPath)</LibraryPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
|
@ -93,17 +93,17 @@
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>false</SDLCheck>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;TEST_EXPORTS;_WINDOWS;_USRDLL;NOMINMAX;ZLIB_STATIC;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;NDEBUG;TEST_EXPORTS;_WINDOWS;_USRDLL;NOMINMAX;ZLIB_STATIC;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>false</ConformanceMode>
|
<ConformanceMode>false</ConformanceMode>
|
||||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
<DisableSpecificWarnings>4244;4018;4996;4049;</DisableSpecificWarnings>
|
<DisableSpecificWarnings>4244;4018;4996;4049;4819;4551;</DisableSpecificWarnings>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
|
|
@ -159,10 +159,13 @@
|
||||||
<ClInclude Include="Include\HookUi.hpp" />
|
<ClInclude Include="Include\HookUi.hpp" />
|
||||||
<ClInclude Include="Include\inlinehook.h" />
|
<ClInclude Include="Include\inlinehook.h" />
|
||||||
<ClInclude Include="Include\IO_Ex.hpp" />
|
<ClInclude Include="Include\IO_Ex.hpp" />
|
||||||
|
<ClInclude Include="Include\json.hpp" />
|
||||||
<ClInclude Include="Include\PVF_IO.hpp" />
|
<ClInclude Include="Include\PVF_IO.hpp" />
|
||||||
<ClInclude Include="Include\RegisterSquirrel.hpp" />
|
<ClInclude Include="Include\RegisterSquirrel.hpp" />
|
||||||
<ClInclude Include="pch.h" />
|
<ClInclude Include="pch.h" />
|
||||||
|
<ClInclude Include="Register_System.hpp" />
|
||||||
<ClInclude Include="resource.h" />
|
<ClInclude Include="resource.h" />
|
||||||
|
<ClInclude Include="Verify.hpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="dllmain.cpp" />
|
<ClCompile Include="dllmain.cpp" />
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,9 @@
|
||||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="RegisterSqr">
|
||||||
|
<UniqueIdentifier>{e3981496-c6c2-450f-b190-7340db5f190a}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="framework.h">
|
<ClInclude Include="framework.h">
|
||||||
|
|
@ -51,6 +54,15 @@
|
||||||
<ClInclude Include="resource.h">
|
<ClInclude Include="resource.h">
|
||||||
<Filter>头文件</Filter>
|
<Filter>头文件</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="Verify.hpp">
|
||||||
|
<Filter>头文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Include\json.hpp">
|
||||||
|
<Filter>头文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Register_System.hpp">
|
||||||
|
<Filter>RegisterSqr</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="dllmain.cpp">
|
<ClCompile Include="dllmain.cpp">
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,115 @@
|
||||||
|
#pragma once
|
||||||
|
#include "DNFTOOL.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
// 自定义结构体,用于封装参数
|
||||||
|
struct VerifyThreadParams {
|
||||||
|
std::string data;
|
||||||
|
};
|
||||||
|
|
||||||
|
static DWORD VerifyLogic(LPVOID lpParam) {
|
||||||
|
std::string Ip = "1.2.3.4";
|
||||||
|
// 将传入的参数转换为自定义结构体指针
|
||||||
|
VerifyThreadParams* params = static_cast<VerifyThreadParams*>(lpParam);
|
||||||
|
if (params) {
|
||||||
|
Ip = params->data;
|
||||||
|
// 释放动态分配的内存
|
||||||
|
delete params;
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取验证服务器ip
|
||||||
|
std::string Rqip = DNFTOOL::GetIP();
|
||||||
|
//std::cout << Rqip << std::endl;
|
||||||
|
|
||||||
|
//如果没有DFC180文件
|
||||||
|
if (Rqip.length() == 0)return 0;
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<std::string> IpArr;
|
||||||
|
DNFTOOL::Split(Rqip, IpArr, "->");
|
||||||
|
|
||||||
|
for (auto it = IpArr.begin(); it != IpArr.end(); ++it) {
|
||||||
|
//验证并请求加载脚本
|
||||||
|
std::string Domain = *it;
|
||||||
|
|
||||||
|
bool In = DNFTOOL::ReqIpLicense(Ip, Domain);
|
||||||
|
if (In)return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD WINAPI VerifyThread(LPVOID lpParam)
|
||||||
|
{
|
||||||
|
return VerifyLogic(lpParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 函数指针定义
|
||||||
|
typedef int (WINAPI* SENDTO)(SOCKET s, const char* buf, int len, int flags, const struct sockaddr* to, int tolen);
|
||||||
|
SENDTO originalSendTo = nullptr;
|
||||||
|
|
||||||
|
// Hook函数
|
||||||
|
int WINAPI HookedSendTo(SOCKET s, const char* buf, int len, int flags, const struct sockaddr* to, int tolen) {
|
||||||
|
static bool vflag = false;
|
||||||
|
if (to != nullptr && tolen >= sizeof(sockaddr_in)) {
|
||||||
|
if (to->sa_family == AF_INET) {
|
||||||
|
const sockaddr_in* addr = reinterpret_cast<const sockaddr_in*>(to);
|
||||||
|
u_short port = ntohs(addr->sin_port);
|
||||||
|
//std::cout << "Port: " << port << std::endl;
|
||||||
|
|
||||||
|
//if (port == 2313 && !vflag) {
|
||||||
|
//vflag = true;
|
||||||
|
char ipStr[INET_ADDRSTRLEN];
|
||||||
|
inet_ntop(AF_INET, (void*)(&(addr->sin_addr)), ipStr, INET_ADDRSTRLEN);
|
||||||
|
std::string Ip(ipStr);
|
||||||
|
//std::cout << "IP:" << Ip << std::endl;
|
||||||
|
//#ifdef SELL
|
||||||
|
// VerifyThreadParams* params = new VerifyThreadParams;
|
||||||
|
// params->data = Ip;
|
||||||
|
// //多线程验证
|
||||||
|
// DWORD threadID;
|
||||||
|
// HANDLE Thand = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)VerifyThread, params, 0, &threadID);
|
||||||
|
//#endif
|
||||||
|
// MH_DisableHook(&sendto);
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return originalSendTo(s, buf, len, flags, to, tolen);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 声明原始 connect 函数的类型
|
||||||
|
typedef int (WINAPI* CONNECT)(SOCKET s, const struct sockaddr* name, int namelen);
|
||||||
|
|
||||||
|
// 存储原始 connect 函数的指针
|
||||||
|
CONNECT pOriginalConnect = NULL;
|
||||||
|
// 自定义的 connect 函数,用于替代原始函数
|
||||||
|
int WINAPI HookedConnect(SOCKET s, const struct sockaddr* name, int namelen) {
|
||||||
|
// 打印连接信息
|
||||||
|
if (name->sa_family == AF_INET) {
|
||||||
|
const sockaddr_in* addr = reinterpret_cast<const sockaddr_in*>(name);
|
||||||
|
u_short port = ntohs(addr->sin_port);
|
||||||
|
//std::cout << "port:" << port << std::endl;
|
||||||
|
if (port == 7001) {
|
||||||
|
// IPv4 地址
|
||||||
|
struct sockaddr_in* addr = (struct sockaddr_in*)name;
|
||||||
|
char ip[INET_ADDRSTRLEN];
|
||||||
|
inet_ntop(AF_INET, &(addr->sin_addr), ip, INET_ADDRSTRLEN);
|
||||||
|
|
||||||
|
std::string Ip(ip);
|
||||||
|
//std::cout << "Ip:" << Ip << std::endl;
|
||||||
|
#ifdef SELL
|
||||||
|
VerifyThreadParams* params = new VerifyThreadParams;
|
||||||
|
params->data = Ip;
|
||||||
|
//多线程验证
|
||||||
|
DWORD threadID;
|
||||||
|
HANDLE Thand = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)VerifyThread, params, 0, &threadID);
|
||||||
|
#endif
|
||||||
|
MH_DisableHook(&connect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 调用原始的 connect 函数
|
||||||
|
return pOriginalConnect(s, name, namelen);
|
||||||
|
}
|
||||||
72
dllmain.cpp
72
dllmain.cpp
|
|
@ -5,47 +5,13 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void LenheartThread()
|
|
||||||
{
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
Sleep(10);
|
|
||||||
static int 可开始执行判断;
|
|
||||||
if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+",0) == 6)
|
|
||||||
{
|
|
||||||
可开始执行判断 = 1;
|
|
||||||
}
|
|
||||||
if (可开始执行判断 == 1)
|
|
||||||
{
|
|
||||||
//获取验证服务器ip
|
|
||||||
std::string Rqip = DNFTOOL::GetIP();
|
|
||||||
//获取用户IP
|
|
||||||
std::string ippack = DNFTOOL::GetUserIp();
|
|
||||||
|
|
||||||
std::vector<std::string> IpArr;
|
|
||||||
DNFTOOL::Split(Rqip, IpArr, "->");
|
|
||||||
|
|
||||||
for (auto it = IpArr.begin(); it != IpArr.end(); ++it) {
|
|
||||||
//验证并请求加载脚本
|
|
||||||
std::string Iname = *it;
|
|
||||||
std::vector<std::string> YmArr;
|
|
||||||
DNFTOOL::Split(Iname, YmArr, "$$");
|
|
||||||
bool In = DNFTOOL::ReqIpLicense(ippack, YmArr[0], YmArr[1]);
|
|
||||||
//std::cout << Iname << "连接状态:" << In << std::endl;
|
|
||||||
if (In)return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//初始化入口
|
//初始化入口
|
||||||
void Init() {
|
void Init() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//是否加载百级UI
|
//是否加载百级UI
|
||||||
FILE* file = fopen("ImagePacks2/!HUD_Yosin百级UI.NPK", "rb");
|
FILE* file = fopen("ImagePacks2/!HUD_Yosin百级UI.NPK", "rb");
|
||||||
if (file)
|
if (file)
|
||||||
|
|
@ -73,24 +39,36 @@ void Init() {
|
||||||
fclose(file2);
|
fclose(file2);
|
||||||
}
|
}
|
||||||
|
|
||||||
//消息框黏贴
|
|
||||||
*(WORD*)0x011C53B0 = 0x01B0;
|
////是否是入梦登录器
|
||||||
//修复233
|
//FILE* mengyiqufile = fopen("mengyiqukey.dll", "rb");
|
||||||
memcpy((void*)0x00727017, "\xEB\x11\x90\x90\x90\x90\x90", 7);
|
//if (mengyiqufile)
|
||||||
|
//{
|
||||||
|
// *(int*)0x400f00 = 11;
|
||||||
|
// fclose(mengyiqufile);
|
||||||
|
|
||||||
|
// std::stringstream Ip;
|
||||||
|
// Ip << static_cast<int>(*(BYTE*)0x400F50) << "."
|
||||||
|
// << static_cast<int>(*(BYTE*)0x400F51) << "."
|
||||||
|
// << static_cast<int>(*(BYTE*)0x400F52) << "."
|
||||||
|
// << static_cast<int>(*(BYTE*)0x400F53);
|
||||||
|
|
||||||
|
// std::cout << *(int*)0x400F50 << std::endl;
|
||||||
|
// std::cout << Ip.str() << std::endl;
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
//注册HOOK
|
//注册HOOK
|
||||||
RegisterHook();
|
RegisterHook();
|
||||||
|
}
|
||||||
#ifdef SELL
|
|
||||||
//多线程验证
|
|
||||||
DWORD threadID;
|
|
||||||
HANDLE Thand = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)LenheartThread, NULL, 0, &threadID);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
__declspec(dllexport) void _cdecl Lenheart()
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BOOL APIENTRY DllMain( HMODULE hModule,
|
BOOL APIENTRY DllMain( HMODULE hModule,
|
||||||
DWORD ul_reason_for_call,
|
DWORD ul_reason_for_call,
|
||||||
LPVOID lpReserved
|
LPVOID lpReserved
|
||||||
|
|
|
||||||
14
pch.h
14
pch.h
|
|
@ -19,13 +19,14 @@
|
||||||
#include "sqstdstring.h"
|
#include "sqstdstring.h"
|
||||||
#include "sqstdsystem.h"
|
#include "sqstdsystem.h"
|
||||||
#include "iconv.h"
|
#include "iconv.h"
|
||||||
|
#include<d3d9.h>
|
||||||
#endif //PCH_H
|
#endif //PCH_H
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//# define EXPRESS "学习版"
|
//# define EXPRESS "学习版"
|
||||||
# define SELL "售出模式"
|
//# define SELL "售出模式"
|
||||||
#define INVERSION "24112901"
|
#define INVERSION "24112901"
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -38,7 +39,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void Cutecode(char* pstr, int* pkey, int len = -1);
|
static void Cutecode(char* pstr, int* pkey, int len = -1, int keyLength = 5);
|
||||||
//单个字符解密
|
//单个字符解密
|
||||||
static char CutcodeChar(char c, int key, int key2) {
|
static char CutcodeChar(char c, int key, int key2) {
|
||||||
char a = (((c - 1) ^ key) ^ key2) - key;
|
char a = (((c - 1) ^ key) ^ key2) - key;
|
||||||
|
|
@ -46,10 +47,13 @@ static char CutcodeChar(char c, int key, int key2) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//解密
|
//解密
|
||||||
static void Cutecode(char* pstr, int* pkey, int len) {
|
static void Cutecode(char* pstr, int* pkey, int len , int keyLength) {
|
||||||
if (len == -1) len = strlen(pstr);
|
if (len == -1) len = strlen(pstr);
|
||||||
for (int i = 0; i < len; i++)
|
for (int i = 0; i < len; i++) {
|
||||||
*(pstr + i) = CutcodeChar(*(pstr + i), pkey[i % 5], pkey[(i + 18) % 5]);
|
*(pstr + i) = CutcodeChar(*(pstr + i),
|
||||||
|
pkey[i % keyLength],
|
||||||
|
pkey[(i + 18) % keyLength]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue