2020/03/14更新:获取、导出微信所有表情

前言

适用:PC端微信 2.8.0.121 版本
更新与于2020年3月14日
本文仅作技术研究

具体原理见上一篇:

https://blog.csdn.net/qq_43572067/article/details/100062493

本次主要是在上次的源码基础上进行更新,适用于当前版本的微信版本

其实就更新了两个地址
1、强制把聊天收发的表情全部保存下来
2、强制把打开收藏的表情全部保存下来

成品:

链接: https://pan.baidu.com/s/1UYXXEU0kKGvpSHNqTFnBcg
提取码: t4qt

源代码:

使用VS2015以上编译

RemoteInject.exe
// RemoteInject.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include "windows.h"
#include "atlstr.h"
#include <TlHelp32.h>

char* GetProgramDll()
{
	static char exeFullPath[MAX_PATH] = { 0 }; // Full path
	char *nWeak;

	GetModuleFileNameA(NULL, exeFullPath, MAX_PATH);
	nWeak = strrchr(exeFullPath, '\\');

	memcpy(nWeak + 1, "GetWeChatPic.dll", strlen("GetWeChatPic.dll"));

	return exeFullPath;
}


DWORD GetProcessPid(CString nProcessName)
{
	PROCESSENTRY32 nPT;
	nPT.dwSize = sizeof(nPT);
	HANDLE nSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

	BOOL nRet = Process32First(nSnapShot, &nPT);
	while (nRet)
	{
		if (nProcessName.MakeLower() == CString(nPT.szExeFile).MakeLower())
		{
			return nPT.th32ProcessID;
		}
		nRet = Process32Next(nSnapShot, &nPT);
	}
	return 0;
}


int main()
{	
	printf("适用:PC端微信 2.8.0.121版本\r\n更新与2020年3月14日\r\n");

	DWORD nPid = GetProcessPid("wechat.exe");
	HANDLE nHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, nPid);

	printf("进程ID:%d  -  进程句柄:%d\r\n", nPid, nHandle);


	CHAR *DllPath = GetProgramDll();
	int nLen = strlen(DllPath)+1;
	LPVOID pBuf = VirtualAllocEx(nHandle, NULL, nLen, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
	if (!pBuf)
	{
		printf("申请内存失败!\r\n");		
		getchar();
		return 0;
	}

	if (!WriteProcessMemory(nHandle, pBuf, DllPath, nLen, 0))
	{
		printf("写入内存失败!\r\n");
		getchar();
		return 0;

	}

	HANDLE hRemoteThread = CreateRemoteThread(nHandle, NULL, NULL,(LPTHREAD_START_ROUTINE)LoadLibraryA, pBuf, 0, 0);

	WaitForSingleObject(hRemoteThread, -1);

	CloseHandle(hRemoteThread);

	VirtualFreeEx(nHandle, pBuf, 0, MEM_FREE);

	printf("注入完成!\r\n");
	getchar();
    return 0;
}
GetWeChatPic.dll
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include <shellapi.h>

DWORD FileBuff;
DWORD FileSize;

CHAR FileName[MAX_PATH];

FILE *pFile;

DWORD Old_wxam_dec_isWXGF_4;


extern "C" _declspec(dllexport) void ExportFun()
{
}

void MyHook(LPVOID HookAddress, LPVOID NewAddress, DWORD *OldAddress,DWORD HookBytesNum)
{

	BYTE JumpByte[6] = { 0x68,0x00,0x00,0x00,0x00,0xc3 };

	*(DWORD*)(JumpByte + 1) = (DWORD)HookAddress + HookBytesNum;

	*OldAddress = (DWORD)VirtualAlloc(NULL, 1024, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

	memcpy((LPVOID)*OldAddress, HookAddress, HookBytesNum);

	memcpy((BYTE*)*OldAddress + HookBytesNum, JumpByte,6);

	*(DWORD*)(JumpByte + 1) = (DWORD)NewAddress;

	WriteProcessMemory((HANDLE)-1, HookAddress, JumpByte, 6, 0);

}

DWORD GetHash(char *nBuff,int nBuffSize)
{
	DWORD nHash = 0;

	for (int i = 0; i < nBuffSize; i++)
	{
		nHash = ((nHash << 25) | (nHash >> 7));
		nHash = nHash + nBuff[i];
	}
	return nHash;
}

char* GetProgramDir()
{
	static char exeFullPath[MAX_PATH] = { 0 }; // Full path
	char *nWeak;

	GetModuleFileNameA(NULL, exeFullPath, MAX_PATH);
	nWeak = strrchr(exeFullPath, '\\');

	memcpy(nWeak + 1, "GetWeChatPic", strlen("GetWeChatPic"));

	return exeFullPath;
}

__declspec(naked) void Hook()
{
	__asm
	{
		pushad;
		mov eax, [esp + 36];
		mov FileBuff, eax;
		mov eax, [esp + 40];
		mov FileSize, eax;
	}

	sprintf_s(FileName, 256, "GetWeChatPic\\%08X.gif", GetHash((char*)FileBuff, FileSize));

	fopen_s(&pFile, FileName, "wb+");

	fwrite((LPVOID)FileBuff, FileSize, 1, pFile);

	fclose(pFile);

	__asm
	{
		popad;
		jmp Old_wxam_dec_isWXGF_4;
	}
}



BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	{

		{
			HMODULE nHmodule = GetModuleHandleA("WeChatWin.dll");

			BYTE HookByte2[] = { 0xeb };
			//DWORD pFunAddress = (DWORD)nHmodule + 0x7DB79;//聊天收发的表情全部保存下来20190820
			DWORD pFunAddress = (DWORD)nHmodule + 0x94016;//聊天收发的表情全部保存下来20200314
			WriteProcessMemory((HANDLE)-1, (LPVOID)pFunAddress, HookByte2, 1, 0);

			BYTE HookByte5[] = { 0xeb };
			//pFunAddress = (DWORD)nHmodule + 0x2841DC;//打开收藏的表情全部保存下来20190820
			pFunAddress = (DWORD)nHmodule + 0x2BE71F;//打开收藏的表情全部保存下来20200314
			WriteProcessMemory((HANDLE)-1, (LPVOID)pFunAddress, HookByte5, 1, 0);
		}



		HMODULE nHmodule = GetModuleHandleA("WXAMDecoder.dll");
		LPVOID pFunAddress = GetProcAddress(nHmodule, "wxam_dec_isWXGF_4");

		if (pFunAddress)
		{
			MyHook(pFunAddress, Hook, &Old_wxam_dec_isWXGF_4, 9);

			SECURITY_ATTRIBUTES SecurityAttributes;
			SecurityAttributes.lpSecurityDescriptor = 0;
			SecurityAttributes.bInheritHandle = false;
			SecurityAttributes.nLength = sizeof(SecurityAttributes);
			CreateDirectoryA("GetWeChatPic", &SecurityAttributes);


			if (MessageBoxA(0, "注入成功!\r\n是否打开储存的表情文件夹?", "Tips", MB_ICONINFORMATION | MB_YESNO)==IDYES)
				ShellExecuteA(NULL, ("open"), ("explorer"), GetProgramDir(), NULL, SW_SHOW);

		}
		else
		{
			MessageBoxA(0, "注入失败!请重启微信进入到聊天框内再注入!", "Tips", MB_ICONERROR);
		}

	}
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 这句话的意思是将系统路径设置为/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin,并将其导出为环境变量PATH。这样在终端中执行命令时,系统会在这些路径中查找可执行文件。 ### 回答2: 这行代码是将环境变量 PATH 设置为 '/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin',然后使用 export 命令导出 PATH 变量。 环境变量 PATH 是一个用于指定系统在哪些目录中搜索可执行程序的变量。当我们在命令行中输入一个命令时,系统会按照 PATH 中定义的顺序逐个查找这些目录,直到找到命令所在的位置才会执行。 在这行代码中,PATH 的值包含了一系列目录路径,它们是用冒号分隔的。具体来说,它们是 '/bin', '/sbin', '/usr/bin', '/usr/sbin', '/usr/local/bin', '/usr/local/sbin' 和 ' ~/bin'(表示当前用户的家目录下的 bin 目录)。 通过使用 export 命令,我们将设置好的 PATH 变量导出,使其对当前的 shell 进程以及其子进程都可见。这样,当我们运行命令行中输入的命令时,系统就会按照 PATH 中定义的目录顺序来搜索命令所在的位置,并将其执行。 总结来说,这行代码的作用是设置 PATH 环境变量,用于指定系统在哪些目录中搜索可执行程序,并通过 export 命令将设置好的 PATH 导出,使其对当前 shell 进程以及其子进程可见。 ### 回答3: 这是一条Shell命令,其作用是将路径环境变量PATH设置为/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin,并导出该变量。 路径环境变量PATH是一种存储着系统搜索可执行文件的路径列表的环境变量。通过将路径添加到PATH变量中,可以使系统在执行命令时能够找到所需的可执行文件。 在这条命令中,PATH变量被设置为一个由多个路径组成的列表。这些路径是用冒号(:)分隔的。/bin是存储常用命令的目录,/sbin是存储系统命令的目录,/usr/bin是用于安装软件的目录,/usr/sbin是存储系统和网络服务命令的目录,/usr/local/bin是存储本地程序的目录,/usr/local/sbin是存储本地系统和网络服务命令的目录,而~表示用户的家目录。 通过export命令将PATH变量导出,可以使其在当前Shell会话中对其他命令可见。这意味着在执行命令时,系统将在这些定义的路径中搜索可执行文件,如果找到则执行相应的命令,否则会给出“命令未找到”或类似的错误。 通过使用这条命令,我们可以方便地扩展系统对命令的搜索路径,使其能够找到我们所需的可执行文件,提高命令的可用性和方便性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值