未验证 提交 db86c422 编写于 作者: J Jack Li 提交者: GitHub

Merge pull request #59 from ljc545w/temp_branch

新增群管理功能
#include "pch.h"
struct AddChatRoomMemberStruct
{
DWORD chatroomid;
DWORD wxids;
DWORD length;
};
BOOL AddChatRoomMember(wchar_t* chatroomid, wchar_t* wxid) {
if (!hProcess)
return 1;
DWORD WeChatRobotBase = GetWeChatRobotBase();
DWORD dwId = 0;
DWORD dwWriteSize = 0;
DWORD dwRet = 0;
AddChatRoomMemberStruct params;
ZeroMemory(&params, sizeof(params));
LPVOID chatroomidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
LPVOID wxidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
AddChatRoomMemberStruct* paramAndFunc = (AddChatRoomMemberStruct*)::VirtualAllocEx(hProcess, 0, sizeof(AddChatRoomMemberStruct), MEM_COMMIT, PAGE_READWRITE);
if (!chatroomidaddr || !wxidaddr || !paramAndFunc || !WeChatRobotBase) {
return 1;
}
DWORD dwTId = 0;
if (chatroomidaddr)
WriteProcessMemory(hProcess, chatroomidaddr, chatroomid, wcslen(chatroomid) * 2 + 2, &dwWriteSize);
if (wxidaddr)
WriteProcessMemory(hProcess, wxidaddr, wxid, wcslen(wxid) * 2 + 2, &dwWriteSize);
params.chatroomid = (DWORD)chatroomidaddr;
params.wxids = (DWORD)wxidaddr;
params.length = 1;
if (paramAndFunc) {
WriteProcessMemory(hProcess, paramAndFunc, &params, sizeof(AddChatRoomMemberStruct), &dwTId);
}
else {
return 1;
}
DWORD AddChatRoomMemberAddr = WeChatRobotBase + AddChatRoomMemberRemoteOffset;
HANDLE hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)AddChatRoomMemberAddr, (LPVOID)paramAndFunc, 0, &dwId);
if (hThread) {
WaitForSingleObject(hThread, INFINITE);
GetExitCodeThread(hThread, &dwRet);
CloseHandle(hThread);
}
else {
return 1;
}
VirtualFreeEx(hProcess, chatroomidaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, wxidaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, paramAndFunc, 0, MEM_RELEASE);
return dwRet == 0;
}
BOOL AddChatRoomMember(wchar_t* chatroomid, SAFEARRAY* psaValue) {
if (!hProcess)
return 1;
VARIANT rgvar;
rgvar.vt = VT_BSTR;
HRESULT hr = S_OK;
long lLbound = psaValue->rgsabound->lLbound;
long cElements = psaValue->rgsabound->cElements;
if (cElements == 1) {
VariantInit(&rgvar);
long pIndex = 0;
hr = SafeArrayGetElement(psaValue, &pIndex, &rgvar);
return AddChatRoomMember(chatroomid, rgvar.bstrVal);
}
vector<void*> wxidptrs;
DWORD dwWriteSize = 0;
DWORD dwTId = 0; DWORD dwId = 0; DWORD dwRet = 0;
DWORD WeChatRobotBase = GetWeChatRobotBase();
AddChatRoomMemberStruct params = { 0 };
LPVOID chatroomidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
LPVOID wxidptrsaddr = VirtualAllocEx(hProcess, NULL, sizeof(void*) * cElements, MEM_COMMIT, PAGE_READWRITE);
AddChatRoomMemberStruct* paramAndFunc = (AddChatRoomMemberStruct*)::VirtualAllocEx(hProcess, 0, sizeof(AddChatRoomMemberStruct), MEM_COMMIT, PAGE_READWRITE);
if (!chatroomidaddr || !wxidptrsaddr || !paramAndFunc || !WeChatRobotBase) {
return 1;
}
for (long i = lLbound; i < lLbound + cElements; i++) {
VariantInit(&rgvar);
hr = SafeArrayGetElement(psaValue, &i, &rgvar);
LPVOID wxidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
if (wxidaddr) {
WriteProcessMemory(hProcess, wxidaddr, rgvar.bstrVal, wcslen(rgvar.bstrVal) * 2 + 2, &dwWriteSize);
wxidptrs.push_back(wxidaddr);
}
}
if (chatroomidaddr)
WriteProcessMemory(hProcess, chatroomidaddr, chatroomid, wcslen(chatroomid) * 2 + 2, &dwWriteSize);
if (wxidptrsaddr)
WriteProcessMemory(hProcess, wxidptrsaddr, &wxidptrs[0], wxidptrs.size() * sizeof(void*), &dwWriteSize);
params.chatroomid = (DWORD)chatroomidaddr;
params.wxids = (DWORD)wxidptrsaddr;
params.length = wxidptrs.size();
if (paramAndFunc) {
WriteProcessMemory(hProcess, paramAndFunc, &params, sizeof(AddChatRoomMemberStruct), &dwTId);
}
else {
return 1;
}
DWORD AddChatRoomMemberAddr = WeChatRobotBase + AddChatRoomMemberRemoteOffset;
HANDLE hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)AddChatRoomMemberAddr, (LPVOID)paramAndFunc, 0, &dwId);
if (hThread) {
WaitForSingleObject(hThread, INFINITE);
GetExitCodeThread(hThread, &dwRet);
CloseHandle(hThread);
}
else {
return 1;
}
for (unsigned int i = 0; i < wxidptrs.size(); i++) {
VirtualFreeEx(hProcess, wxidptrs[i], 0, MEM_RELEASE);
}
VirtualFreeEx(hProcess, chatroomidaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, wxidptrsaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, paramAndFunc, 0, MEM_RELEASE);
return dwRet == 0;
}
\ No newline at end of file
#pragma once
#include<windows.h>
BOOL AddChatRoomMember(wchar_t* chatroomid, wchar_t* wxid);
BOOL AddChatRoomMember(wchar_t* chatroomid, SAFEARRAY* psaValue);
\ No newline at end of file
#include "pch.h"
struct DelChatRoomMemberStruct
{
DWORD chatroomid;
DWORD wxids;
DWORD length;
};
BOOL DelChatRoomMember(wchar_t* chatroomid, wchar_t* wxid) {
if (!hProcess)
return 1;
DWORD WeChatRobotBase = GetWeChatRobotBase();
DWORD dwId = 0;
DWORD dwWriteSize = 0;
DWORD dwRet = 0;
DelChatRoomMemberStruct params;
ZeroMemory(&params, sizeof(params));
LPVOID chatroomidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
LPVOID wxidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
DelChatRoomMemberStruct* paramAndFunc = (DelChatRoomMemberStruct*)::VirtualAllocEx(hProcess, 0, sizeof(DelChatRoomMemberStruct), MEM_COMMIT, PAGE_READWRITE);
if (!chatroomidaddr || !wxidaddr || !paramAndFunc || !WeChatRobotBase) {
return 1;
}
DWORD dwTId = 0;
if (chatroomidaddr)
WriteProcessMemory(hProcess, chatroomidaddr, chatroomid, wcslen(chatroomid) * 2 + 2, &dwWriteSize);
if (wxidaddr)
WriteProcessMemory(hProcess, wxidaddr, wxid, wcslen(wxid) * 2 + 2, &dwWriteSize);
params.chatroomid = (DWORD)chatroomidaddr;
params.wxids = (DWORD)wxidaddr;
params.length = 1;
if (paramAndFunc) {
WriteProcessMemory(hProcess, paramAndFunc, &params, sizeof(DelChatRoomMemberStruct), &dwTId);
}
else {
return 1;
}
DWORD DelChatRoomMemberAddr = WeChatRobotBase + DelChatRoomMemberRemoteOffset;
HANDLE hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)DelChatRoomMemberAddr, (LPVOID)paramAndFunc, 0, &dwId);
if (hThread) {
WaitForSingleObject(hThread, INFINITE);
GetExitCodeThread(hThread, &dwRet);
CloseHandle(hThread);
}
else {
return 1;
}
VirtualFreeEx(hProcess, chatroomidaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, wxidaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, paramAndFunc, 0, MEM_RELEASE);
return dwRet == 0;
}
BOOL DelChatRoomMember(wchar_t* chatroomid, SAFEARRAY* psaValue) {
if (!hProcess)
return 1;
VARIANT rgvar;
rgvar.vt = VT_BSTR;
HRESULT hr = S_OK;
long lLbound = psaValue->rgsabound->lLbound;
long cElements = psaValue->rgsabound->cElements;
if (cElements == 1) {
VariantInit(&rgvar);
long pIndex = 0;
hr = SafeArrayGetElement(psaValue, &pIndex, &rgvar);
return DelChatRoomMember(chatroomid, rgvar.bstrVal);
}
vector<void*> wxidptrs;
DWORD dwWriteSize = 0;
DWORD dwTId = 0; DWORD dwId = 0; DWORD dwRet = 0;
DWORD WeChatRobotBase = GetWeChatRobotBase();
DelChatRoomMemberStruct params = { 0 };
LPVOID chatroomidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
LPVOID wxidptrsaddr = VirtualAllocEx(hProcess, NULL, sizeof(void*) * cElements, MEM_COMMIT, PAGE_READWRITE);
DelChatRoomMemberStruct* paramAndFunc = (DelChatRoomMemberStruct*)::VirtualAllocEx(hProcess, 0, sizeof(DelChatRoomMemberStruct), MEM_COMMIT, PAGE_READWRITE);
if (!chatroomidaddr || !wxidptrsaddr || !paramAndFunc || !WeChatRobotBase) {
return 1;
}
for (long i = lLbound; i < lLbound + cElements; i++) {
VariantInit(&rgvar);
hr = SafeArrayGetElement(psaValue, &i, &rgvar);
LPVOID wxidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
if (wxidaddr) {
WriteProcessMemory(hProcess, wxidaddr, rgvar.bstrVal, wcslen(rgvar.bstrVal) * 2 + 2, &dwWriteSize);
wxidptrs.push_back(wxidaddr);
}
}
if (chatroomidaddr)
WriteProcessMemory(hProcess, chatroomidaddr, chatroomid, wcslen(chatroomid) * 2 + 2, &dwWriteSize);
if (wxidptrsaddr)
WriteProcessMemory(hProcess, wxidptrsaddr, &wxidptrs[0], wxidptrs.size() * sizeof(void*), &dwWriteSize);
params.chatroomid = (DWORD)chatroomidaddr;
params.wxids = (DWORD)wxidptrsaddr;
params.length = wxidptrs.size();
if (paramAndFunc) {
WriteProcessMemory(hProcess, paramAndFunc, &params, sizeof(DelChatRoomMemberStruct), &dwTId);
}
else {
return 1;
}
DWORD DelChatRoomMemberAddr = WeChatRobotBase + DelChatRoomMemberRemoteOffset;
HANDLE hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)DelChatRoomMemberAddr, (LPVOID)paramAndFunc, 0, &dwId);
if (hThread) {
WaitForSingleObject(hThread, INFINITE);
GetExitCodeThread(hThread, &dwRet);
CloseHandle(hThread);
}
else {
return 1;
}
for (unsigned int i = 0; i < wxidptrs.size(); i++) {
VirtualFreeEx(hProcess, wxidptrs[i], 0, MEM_RELEASE);
}
VirtualFreeEx(hProcess, chatroomidaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, wxidptrsaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, paramAndFunc, 0, MEM_RELEASE);
return dwRet == 0;
}
\ No newline at end of file
#pragma once
#include<windows.h>
BOOL DelChatRoomMember(wchar_t* chatroomid, wchar_t* wxid);
BOOL DelChatRoomMember(wchar_t* chatroomid, SAFEARRAY* psaValue);
\ No newline at end of file
#include "pch.h"
struct EditRemarkStruct {
DWORD wxid;
DWORD remark;
};
BOOL EditRemark(wchar_t* wxid, wchar_t* remark) {
if (!hProcess)
return 1;
DWORD WeChatRobotBase = GetWeChatRobotBase();
DWORD dwId = 0;
DWORD dwWriteSize = 0;
DWORD dwRet = 1;
LPVOID wxidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
LPVOID remarkaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
EditRemarkStruct* paramAndFunc = (EditRemarkStruct*)VirtualAllocEx(hProcess, 0, sizeof(EditRemarkStruct), MEM_COMMIT, PAGE_READWRITE);
if (!wxidaddr || !remarkaddr || !paramAndFunc)
return 1;
WriteProcessMemory(hProcess, wxidaddr, wxid, wcslen(wxid) * 2 + 2, &dwWriteSize);
if (remark)
WriteProcessMemory(hProcess, remarkaddr, remark, wcslen(remark) * 2 + 2, &dwWriteSize);
EditRemarkStruct params = { 0 };
params.wxid = (DWORD)wxidaddr;
params.remark = remark ? (DWORD)remarkaddr : 0;
WriteProcessMemory(hProcess, paramAndFunc, &params, sizeof(params), &dwWriteSize);
DWORD EditRemarkAddr = WeChatRobotBase + EditRemarkRemoteOffset;
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)EditRemarkAddr, (LPVOID)paramAndFunc, 0, &dwId);
if (hThread) {
WaitForSingleObject(hThread, INFINITE);
GetExitCodeThread(hThread, &dwRet);
CloseHandle(hThread);
}
VirtualFreeEx(hProcess, wxidaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, remarkaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, paramAndFunc, 0, MEM_RELEASE);
return dwRet == 0;
}
\ No newline at end of file
#pragma once
#include<windows.h>
BOOL EditRemark(wchar_t* wxid, wchar_t* remark);
\ No newline at end of file
#include "pch.h"
struct ChatRoomMemberNicknameStruct
{
DWORD chatroomid;
DWORD wxid;
DWORD nickname;
};
wstring GetChatRoomMemberNickname(wchar_t* chatroomid, wchar_t* wxid) {
if (!hProcess)
return L"";
DWORD WeChatRobotBase = GetWeChatRobotBase();
DWORD dwId = 0;
DWORD dwWriteSize = 0;
DWORD dwRet = 0;
ChatRoomMemberNicknameStruct params;
ZeroMemory(&params, sizeof(params));
LPVOID chatroomidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
LPVOID wxidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
LPVOID nicknameaddr = VirtualAllocEx(hProcess, NULL, 33 * 2, MEM_COMMIT, PAGE_READWRITE);
ChatRoomMemberNicknameStruct* paramAndFunc = (ChatRoomMemberNicknameStruct*)::VirtualAllocEx(hProcess, 0, sizeof(ChatRoomMemberNicknameStruct), MEM_COMMIT, PAGE_READWRITE);
if (!chatroomidaddr || !wxidaddr || !nicknameaddr || !paramAndFunc) {
return L"";
}
DWORD dwTId = 0;
if (chatroomidaddr)
WriteProcessMemory(hProcess, chatroomidaddr, chatroomid, wcslen(chatroomid) * 2 + 2, &dwWriteSize);
if (wxidaddr)
WriteProcessMemory(hProcess, wxidaddr, wxid, wcslen(wxid) * 2 + 2, &dwWriteSize);
params.chatroomid = (DWORD)chatroomidaddr;
params.wxid = (DWORD)wxidaddr;
params.nickname = (DWORD)nicknameaddr;
if (paramAndFunc) {
WriteProcessMemory(hProcess, paramAndFunc, &params, sizeof(params), &dwTId);
}
else {
return L"";
}
DWORD GetChatRoomMemberNicknameAddr = WeChatRobotBase + GetChatRoomMemberNicknameRemoteOffset;
HANDLE hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)GetChatRoomMemberNicknameAddr, (LPVOID)paramAndFunc, 0, &dwId);
if (hThread) {
WaitForSingleObject(hThread, INFINITE);
GetExitCodeThread(hThread, &dwRet);
CloseHandle(hThread);
}
else {
return L"";
}
wchar_t* buffer = new wchar_t[33];
ZeroMemory(buffer, 33 * 2);
ReadProcessMemory(hProcess, nicknameaddr, buffer, 32 * 2, 0);
wstring nickname(buffer);
delete[] buffer;
VirtualFreeEx(hProcess, chatroomidaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, nicknameaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, paramAndFunc, 0, MEM_RELEASE);
return nickname;
}
\ No newline at end of file
#pragma once
#include<windows.h>
#include<iostream>
using namespace std;
wstring GetChatRoomMemberNickname(wchar_t* chatroomid, wchar_t* wxid);
\ No newline at end of file
#include "pch.h"
struct ChatRoomAnnouncementStruct
{
DWORD chatroomid;
DWORD announcement;
};
BOOL SetChatRoomAnnouncement(wchar_t* chatroomid, wchar_t* announcement) {
if (!hProcess)
return 1;
DWORD WeChatRobotBase = GetWeChatRobotBase();
DWORD dwId = 0;
DWORD dwWriteSize = 0;
DWORD dwRet = 0;
ChatRoomAnnouncementStruct params;
ZeroMemory(&params, sizeof(params));
LPVOID chatroomidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
LPVOID announcementaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
ChatRoomAnnouncementStruct* paramAndFunc = (ChatRoomAnnouncementStruct*)::VirtualAllocEx(hProcess, 0, sizeof(ChatRoomAnnouncementStruct), MEM_COMMIT, PAGE_READWRITE);
if (!chatroomidaddr || !announcementaddr || !paramAndFunc) {
return 1;
}
DWORD dwTId = 0;
if (chatroomidaddr)
WriteProcessMemory(hProcess, chatroomidaddr, chatroomid, wcslen(chatroomid) * 2 + 2, &dwWriteSize);
if (announcement && announcementaddr)
WriteProcessMemory(hProcess, announcementaddr, announcement, wcslen(announcement) * 2 + 2, &dwWriteSize);
params.chatroomid = (DWORD)chatroomidaddr;
params.announcement = announcement ? (DWORD)announcementaddr : 0;
if (paramAndFunc) {
WriteProcessMemory(hProcess, paramAndFunc, &params, sizeof(params), &dwTId);
}
else {
return 1;
}
DWORD SetChatRoomAnnouncementAddr = WeChatRobotBase + SetChatRoomAnnouncementRemoteOffset;
HANDLE hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)SetChatRoomAnnouncementAddr, (LPVOID)paramAndFunc, 0, &dwId);
if (hThread) {
WaitForSingleObject(hThread, INFINITE);
GetExitCodeThread(hThread, &dwRet);
CloseHandle(hThread);
}
else {
return 1;
}
VirtualFreeEx(hProcess, chatroomidaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, announcementaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, paramAndFunc, 0, MEM_RELEASE);
return dwRet == 0;
}
\ No newline at end of file
#pragma once
#include<windows.h>
BOOL SetChatRoomAnnouncement(wchar_t* chatroomid, wchar_t* announcement);
\ No newline at end of file
#include "pch.h"
struct ChatRoomNameStruct
{
DWORD chatroomid;
DWORD name;
};
BOOL SetChatRoomName(wchar_t* chatroomid, wchar_t* name) {
if (!hProcess)
return 1;
DWORD WeChatRobotBase = GetWeChatRobotBase();
DWORD dwId = 0;
DWORD dwWriteSize = 0;
DWORD dwRet = 0;
ChatRoomNameStruct params;
ZeroMemory(&params, sizeof(params));
LPVOID chatroomidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
LPVOID nameaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
ChatRoomNameStruct* paramAndFunc = (ChatRoomNameStruct*)::VirtualAllocEx(hProcess, 0, sizeof(ChatRoomNameStruct), MEM_COMMIT, PAGE_READWRITE);
if (!chatroomidaddr || !nameaddr || !paramAndFunc) {
return 1;
}
DWORD dwTId = 0;
if (chatroomidaddr)
WriteProcessMemory(hProcess, chatroomidaddr, chatroomid, wcslen(chatroomid) * 2 + 2, &dwWriteSize);
if (nameaddr)
WriteProcessMemory(hProcess, nameaddr, name, wcslen(name) * 2 + 2, &dwWriteSize);
params.chatroomid = (DWORD)chatroomidaddr;
params.name = (DWORD)nameaddr;
if (paramAndFunc) {
WriteProcessMemory(hProcess, paramAndFunc, &params, sizeof(params), &dwTId);
}
else {
return 1;
}
DWORD SetChatRoomNameAddr = WeChatRobotBase + SetChatRoomNameRemoteOffset;
HANDLE hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)SetChatRoomNameAddr, (LPVOID)paramAndFunc, 0, &dwId);
if (hThread) {
WaitForSingleObject(hThread, INFINITE);
GetExitCodeThread(hThread, &dwRet);
CloseHandle(hThread);
}
else {
return 1;
}
VirtualFreeEx(hProcess, chatroomidaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, nameaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, paramAndFunc, 0, MEM_RELEASE);
return dwRet == 0;
}
\ No newline at end of file
#pragma once
#include<windows.h>
BOOL SetChatRoomName(wchar_t* chatroomid, wchar_t* name);
\ No newline at end of file
#include "pch.h"
struct ChatRoomSelfNicknameStruct
{
DWORD chatroomid;
DWORD nickname;
};
BOOL SetChatRoomSelfNickname(wchar_t* chatroomid, wchar_t* nickname) {
if (!hProcess)
return 1;
DWORD WeChatRobotBase = GetWeChatRobotBase();
DWORD dwId = 0;
DWORD dwWriteSize = 0;
DWORD dwRet = 0;
ChatRoomSelfNicknameStruct params;
ZeroMemory(&params, sizeof(params));
LPVOID chatroomidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
LPVOID nicknameaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE);
ChatRoomSelfNicknameStruct* paramAndFunc = (ChatRoomSelfNicknameStruct*)::VirtualAllocEx(hProcess, 0, sizeof(ChatRoomSelfNicknameStruct), MEM_COMMIT, PAGE_READWRITE);
if (!chatroomidaddr || !nicknameaddr || !paramAndFunc) {
return 1;
}
DWORD dwTId = 0;
if (chatroomidaddr)
WriteProcessMemory(hProcess, chatroomidaddr, chatroomid, wcslen(chatroomid) * 2 + 2, &dwWriteSize);
if (nicknameaddr)
WriteProcessMemory(hProcess, nicknameaddr, nickname, wcslen(nickname) * 2 + 2, &dwWriteSize);
params.chatroomid = (DWORD)chatroomidaddr;
params.nickname = (DWORD)nicknameaddr;
if (paramAndFunc) {
WriteProcessMemory(hProcess, paramAndFunc, &params, sizeof(params), &dwTId);
}
else {
return 1;
}
DWORD SetChatRoomSelfNicknameAddr = WeChatRobotBase + SetChatRoomSelfNicknameRemoteOffset;
HANDLE hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)SetChatRoomSelfNicknameAddr, (LPVOID)paramAndFunc, 0, &dwId);
if (hThread) {
WaitForSingleObject(hThread, INFINITE);
GetExitCodeThread(hThread, &dwRet);
CloseHandle(hThread);
}
else {
return 1;
}
VirtualFreeEx(hProcess, chatroomidaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, nicknameaddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, paramAndFunc, 0, MEM_RELEASE);
return dwRet == 0;
}
\ No newline at end of file
#pragma once
#include<windows.h>
BOOL SetChatRoomSelfNickname(wchar_t* chatroomid, wchar_t* nickname);
\ No newline at end of file
......@@ -354,4 +354,87 @@ STDMETHODIMP CWeChatRobot::CDeleteUser(BSTR wxid, int* __result) {
STDMETHODIMP CWeChatRobot::CIsWxLogin(int* __result) {
*__result = isWxLogin();
return S_OK;
}
/*
* 参数1:wxid或群聊id
* 参数2:备注内容
* 参数3:预返回的值,调用时无需提供
*/
STDMETHODIMP CWeChatRobot::CEditRemark(BSTR wxid,BSTR remark,int* __result) {
*__result = EditRemark(wxid,remark);
return S_OK;
}
/*
* 参数1:群聊id
* 参数2:群聊名称
* 参数3:预返回的值,调用时无需提供
*/
STDMETHODIMP CWeChatRobot::CSetChatRoomName(BSTR chatroomid, BSTR name, int* __result) {
*__result = SetChatRoomName(chatroomid, name);
return S_OK;
}
/*
* 参数1:群聊id
* 参数2:公告内容
* 参数3:预返回的值,调用时无需提供
*/
STDMETHODIMP CWeChatRobot::CSetChatRoomAnnouncement(BSTR chatroomid, BSTR announcement, int* __result) {
*__result = SetChatRoomAnnouncement(chatroomid, announcement);
return S_OK;
}
/*
* 参数1:群聊id
* 参数2:个人昵称
* 参数3:预返回的值,调用时无需提供
*/
STDMETHODIMP CWeChatRobot::CSetChatRoomSelfNickname(BSTR chatroomid, BSTR nickname, int* __result) {
*__result = SetChatRoomSelfNickname(chatroomid, nickname);
return S_OK;
}
/*
* 参数1:群聊id
* 参数2:群成员wxid
* 参数3:预返回的值,调用时无需提供
*/
STDMETHODIMP CWeChatRobot::CGetChatRoomMemberNickname(BSTR chatroomid, BSTR wxid, BSTR* __result) {
wstring nickname = GetChatRoomMemberNickname(chatroomid, wxid);
*__result = (_bstr_t)nickname.c_str();
return S_OK;
}
/*
* 参数1:群聊id
* 参数2:wxid列表
* 参数3:预返回的值,调用时无需提供
*/
STDMETHODIMP CWeChatRobot::CDelChatRoomMember(BSTR chatroomid, VARIANT* wxids, int* __result) {
if (wxids->vt == VT_BSTR) {
*__result = DelChatRoomMember(chatroomid, wxids->bstrVal);
}
else if (wxids->vt == (VT_ARRAY | VT_VARIANT)) {
SAFEARRAY* psaValue = wxids->parray;
*__result = DelChatRoomMember(chatroomid, psaValue);
}
return S_OK;
}
/*
* 参数1:群聊id
* 参数2:wxid列表
* 参数3:预返回的值,调用时无需提供
*/
STDMETHODIMP CWeChatRobot::CAddChatRoomMember(BSTR chatroomid, VARIANT* wxids, int* __result) {
if (wxids->vt == VT_BSTR) {
*__result = AddChatRoomMember(chatroomid, wxids->bstrVal);
}
else if (wxids->vt == (VT_ARRAY | VT_VARIANT)) {
SAFEARRAY* psaValue = wxids->parray;
*__result = AddChatRoomMember(chatroomid, psaValue);
}
return S_OK;
}
\ No newline at end of file
......@@ -86,6 +86,13 @@ public:
STDMETHODIMP CSendAppMsg(BSTR wxid, BSTR appid, int* __result);
STDMETHODIMP CDeleteUser(BSTR wxid, int* __result);
STDMETHODIMP CIsWxLogin(int* __result);
STDMETHODIMP CEditRemark(BSTR wxid,BSTR remark,int* __result);
STDMETHODIMP CSetChatRoomName(BSTR chatroomid, BSTR name, int* __result);
STDMETHODIMP CSetChatRoomAnnouncement(BSTR chatroomid, BSTR announcement, int* __result);
STDMETHODIMP CSetChatRoomSelfNickname(BSTR chatroomid, BSTR nickname, int* __result);
STDMETHODIMP CGetChatRoomMemberNickname(BSTR chatroomid, BSTR wxid, BSTR* __result);
STDMETHODIMP CDelChatRoomMember(BSTR chatroomid, VARIANT* wxids, int* __result);
STDMETHODIMP CAddChatRoomMember(BSTR chatroomid, VARIANT* wxids, int* __result);
};
OBJECT_ENTRY_AUTO(__uuidof(WeChatRobot), CWeChatRobot)
......@@ -51,6 +51,13 @@ interface IWeChatRobot : IDispatch
[id(36), helpstring("发送小程序")] HRESULT CSendAppMsg([in] BSTR wxid, [in] BSTR appid, [out, retval] int* __result);
[id(37), helpstring("删除好友")] HRESULT CDeleteUser([in] BSTR wxid, [out, retval] int* __result);
[id(38), helpstring("获取登录状态")] HRESULT CIsWxLogin([out, retval] int* __result);
[id(39), helpstring("修改好友备注")] HRESULT CEditRemark([in] BSTR wxid, [in] BSTR remark, [out, retval] int* __result);
[id(40), helpstring("修改群聊名称")] HRESULT CSetChatRoomName([in] BSTR chatroomid, [in] BSTR name, [out, retval] int* __result);
[id(41), helpstring("修改群公告")] HRESULT CSetChatRoomAnnouncement([in] BSTR chatroomid, [in] BSTR announcement, [out, retval] int* __result);
[id(42), helpstring("修改群聊个人昵称")] HRESULT CSetChatRoomSelfNickname([in] BSTR chatroomid, [in] BSTR nickname, [out, retval] int* __result);
[id(43), helpstring("获取指定群成员昵称")] HRESULT CGetChatRoomMemberNickname([in] BSTR chatroomid, [in] BSTR wxid, [out, retval] BSTR* __result);
[id(44), helpstring("删除群成员")] HRESULT CDelChatRoomMember([in] BSTR chatroomid, [in] VARIANT* wxids, [out, retval] int* __result);
[id(45), helpstring("添加群成员")] HRESULT CAddChatRoomMember([in] BSTR chatroomid, [in] VARIANT* wxids, [out, retval] int* __result);
};
[
object,
......
......@@ -211,13 +211,17 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="AddChatRoomMember.h" />
<ClInclude Include="AddFriend.h" />
<ClInclude Include="CheckFriendStatus.h" />
<ClInclude Include="DbBackup.h" />
<ClInclude Include="DbExecuteSql.h" />
<ClInclude Include="DelChatRoomMember.h" />
<ClInclude Include="DeleteUser.h" />
<ClInclude Include="EditRemark.h" />
<ClInclude Include="framework.h" />
<ClInclude Include="FriendList.h" />
<ClInclude Include="GetChatRoomMemberNickname.h" />
<ClInclude Include="GetChatRoomMembers.h" />
<ClInclude Include="GetDbHandles.h" />
<ClInclude Include="InjectDll.h" />
......@@ -234,6 +238,9 @@
<ClInclude Include="SendFile.h" />
<ClInclude Include="SendImage.h" />
<ClInclude Include="SendText.h" />
<ClInclude Include="SetChatRoomAnnouncement.h" />
<ClInclude Include="SetChatRoomName.h" />
<ClInclude Include="SetChatRoomSelfNickname.h" />
<ClInclude Include="targetver.h" />
<ClInclude Include="SearchContact.h" />
<ClInclude Include="VerifyFriendApply.h" />
......@@ -245,13 +252,17 @@
</ItemGroup>
<ItemGroup>
<ClCompile Include="AddBrandContact.cpp" />
<ClCompile Include="AddChatRoomMember.cpp" />
<ClCompile Include="AddFriendByV3.cpp" />
<ClCompile Include="AddFriendByWxid.cpp" />
<ClCompile Include="CheckFriendStatus.cpp" />
<ClCompile Include="DbBackup.cpp" />
<ClCompile Include="DbExecuteSql.cpp" />
<ClCompile Include="DelChatRoomMember.cpp" />
<ClCompile Include="DeleteUser.cpp" />
<ClCompile Include="EditRemark.cpp" />
<ClCompile Include="FriendList.cpp" />
<ClCompile Include="GetChatRoomMemberNickname.cpp" />
<ClCompile Include="GetChatRoomMembers.cpp" />
<ClCompile Include="GetDbHandles.cpp" />
<ClCompile Include="HookImageMessage.cpp" />
......@@ -275,6 +286,9 @@
<ClCompile Include="SendImage.cpp" />
<ClCompile Include="SendText.cpp" />
<ClCompile Include="SearchContactByCache.cpp" />
<ClCompile Include="SetChatRoomAnnouncement.cpp" />
<ClCompile Include="SetChatRoomName.cpp" />
<ClCompile Include="SetChatRoomSelfNickname.cpp" />
<ClCompile Include="VerifyFriendApply.cpp" />
<ClCompile Include="WeChatRobot.cpp" />
<ClCompile Include="WeChatRobotCOM.cpp" />
......
......@@ -59,9 +59,6 @@
<Filter Include="群相关">
<UniqueIdentifier>{2f19dd43-78d1-4a4b-8aad-fb047f4274e6}</UniqueIdentifier>
</Filter>
<Filter Include="群相关\获取群成员">
<UniqueIdentifier>{dce4ab67-7d14-41b1-8e89-cbf9a8315a3a}</UniqueIdentifier>
</Filter>
<Filter Include="数据库">
<UniqueIdentifier>{c41b73aa-9ccc-4cfe-88e5-6b2849fa1fae}</UniqueIdentifier>
</Filter>
......@@ -92,6 +89,30 @@
<Filter Include="好友相关\删除好友">
<UniqueIdentifier>{68a69a6f-dba9-412e-9030-a9dc0544d31c}</UniqueIdentifier>
</Filter>
<Filter Include="群相关\添加成员">
<UniqueIdentifier>{e6b99ddc-dda9-4b29-a793-2861f938f25e}</UniqueIdentifier>
</Filter>
<Filter Include="群相关\删除成员">
<UniqueIdentifier>{08a7171a-4e53-4e3c-8620-51d210d7e6cd}</UniqueIdentifier>
</Filter>
<Filter Include="群相关\修改群内昵称">
<UniqueIdentifier>{94e0d459-3155-4667-9344-c37fff4b2884}</UniqueIdentifier>
</Filter>
<Filter Include="群相关\修改群聊名称">
<UniqueIdentifier>{4ceb1ebc-e375-482f-a991-bc25b7e76ff4}</UniqueIdentifier>
</Filter>
<Filter Include="群相关\修改群公告">
<UniqueIdentifier>{beb056e4-4b7b-445b-bdb3-6a9ca841c926}</UniqueIdentifier>
</Filter>
<Filter Include="好友相关\修改备注">
<UniqueIdentifier>{077fd0e6-3a34-4a2d-8289-b3f0fa6576de}</UniqueIdentifier>
</Filter>
<Filter Include="群相关\获取群成员昵称">
<UniqueIdentifier>{a543b25f-9bb5-4a91-b7a8-a7af0047491e}</UniqueIdentifier>
</Filter>
<Filter Include="群相关\获取群成员列表">
<UniqueIdentifier>{dce4ab67-7d14-41b1-8e89-cbf9a8315a3a}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="framework.h">
......@@ -155,7 +176,7 @@
<Filter>发送消息\发送艾特</Filter>
</ClInclude>
<ClInclude Include="GetChatRoomMembers.h">
<Filter>群相关\获取群成员</Filter>
<Filter>群相关\获取群成员列表</Filter>
</ClInclude>
<ClInclude Include="GetDbHandles.h">
<Filter>数据库\获取句柄</Filter>
......@@ -187,6 +208,27 @@
<ClInclude Include="RobotEvent.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="EditRemark.h">
<Filter>好友相关\修改备注</Filter>
</ClInclude>
<ClInclude Include="DelChatRoomMember.h">
<Filter>群相关\删除成员</Filter>
</ClInclude>
<ClInclude Include="AddChatRoomMember.h">
<Filter>群相关\添加成员</Filter>
</ClInclude>
<ClInclude Include="SetChatRoomAnnouncement.h">
<Filter>群相关\修改群公告</Filter>
</ClInclude>
<ClInclude Include="SetChatRoomName.h">
<Filter>群相关\修改群聊名称</Filter>
</ClInclude>
<ClInclude Include="SetChatRoomSelfNickname.h">
<Filter>群相关\修改群内昵称</Filter>
</ClInclude>
<ClInclude Include="GetChatRoomMemberNickname.h">
<Filter>群相关\获取群成员昵称</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="WeChatRobotCOM.cpp">
......@@ -241,7 +283,7 @@
<Filter>发送消息\发送艾特</Filter>
</ClCompile>
<ClCompile Include="GetChatRoomMembers.cpp">
<Filter>群相关\获取群成员</Filter>
<Filter>群相关\获取群成员列表</Filter>
</ClCompile>
<ClCompile Include="GetDbHandles.cpp">
<Filter>数据库\获取句柄</Filter>
......@@ -285,6 +327,27 @@
<ClCompile Include="RobotEvent.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="EditRemark.cpp">
<Filter>好友相关\修改备注</Filter>
</ClCompile>
<ClCompile Include="DelChatRoomMember.cpp">
<Filter>群相关\删除成员</Filter>
</ClCompile>
<ClCompile Include="AddChatRoomMember.cpp">
<Filter>群相关\添加成员</Filter>
</ClCompile>
<ClCompile Include="SetChatRoomAnnouncement.cpp">
<Filter>群相关\修改群公告</Filter>
</ClCompile>
<ClCompile Include="SetChatRoomName.cpp">
<Filter>群相关\修改群聊名称</Filter>
</ClCompile>
<ClCompile Include="SetChatRoomSelfNickname.cpp">
<Filter>群相关\修改群内昵称</Filter>
</ClCompile>
<ClCompile Include="GetChatRoomMemberNickname.cpp">
<Filter>群相关\获取群成员昵称</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="WeChatRobotCOM.rc">
......
......@@ -3,5 +3,6 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LocalDebuggerCommandArguments>/regserver</LocalDebuggerCommandArguments>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerWorkingDirectory>D:\VS2019C++\MyWeChatRobot\Debug\</LocalDebuggerWorkingDirectory>
</PropertyGroup>
</Project>
\ No newline at end of file
......@@ -260,6 +260,41 @@ EXTERN_C const IID IID_IWeChatRobot;
virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CIsWxLogin(
/* [retval][out] */ int *__result) = 0;
virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CEditRemark(
/* [in] */ BSTR wxid,
/* [in] */ BSTR remark,
/* [retval][out] */ int *__result) = 0;
virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CSetChatRoomName(
/* [in] */ BSTR chatroomid,
/* [in] */ BSTR name,
/* [retval][out] */ int *__result) = 0;
virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CSetChatRoomAnnouncement(
/* [in] */ BSTR chatroomid,
/* [in] */ BSTR announcement,
/* [retval][out] */ int *__result) = 0;
virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CSetChatRoomSelfNickname(
/* [in] */ BSTR chatroomid,
/* [in] */ BSTR nickname,
/* [retval][out] */ int *__result) = 0;
virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CGetChatRoomMemberNickname(
/* [in] */ BSTR chatroomid,
/* [in] */ BSTR wxid,
/* [retval][out] */ BSTR *__result) = 0;
virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CDelChatRoomMember(
/* [in] */ BSTR chatroomid,
/* [in] */ VARIANT *wxids,
/* [retval][out] */ int *__result) = 0;
virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CAddChatRoomMember(
/* [in] */ BSTR chatroomid,
/* [in] */ VARIANT *wxids,
/* [retval][out] */ int *__result) = 0;
};
......@@ -499,6 +534,48 @@ EXTERN_C const IID IID_IWeChatRobot;
IWeChatRobot * This,
/* [retval][out] */ int *__result);
/* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CEditRemark )(
IWeChatRobot * This,
/* [in] */ BSTR wxid,
/* [in] */ BSTR remark,
/* [retval][out] */ int *__result);
/* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CSetChatRoomName )(
IWeChatRobot * This,
/* [in] */ BSTR chatroomid,
/* [in] */ BSTR name,
/* [retval][out] */ int *__result);
/* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CSetChatRoomAnnouncement )(
IWeChatRobot * This,
/* [in] */ BSTR chatroomid,
/* [in] */ BSTR announcement,
/* [retval][out] */ int *__result);
/* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CSetChatRoomSelfNickname )(
IWeChatRobot * This,
/* [in] */ BSTR chatroomid,
/* [in] */ BSTR nickname,
/* [retval][out] */ int *__result);
/* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CGetChatRoomMemberNickname )(
IWeChatRobot * This,
/* [in] */ BSTR chatroomid,
/* [in] */ BSTR wxid,
/* [retval][out] */ BSTR *__result);
/* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CDelChatRoomMember )(
IWeChatRobot * This,
/* [in] */ BSTR chatroomid,
/* [in] */ VARIANT *wxids,
/* [retval][out] */ int *__result);
/* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CAddChatRoomMember )(
IWeChatRobot * This,
/* [in] */ BSTR chatroomid,
/* [in] */ VARIANT *wxids,
/* [retval][out] */ int *__result);
END_INTERFACE
} IWeChatRobotVtbl;
......@@ -640,6 +717,27 @@ EXTERN_C const IID IID_IWeChatRobot;
#define IWeChatRobot_CIsWxLogin(This,__result) \
( (This)->lpVtbl -> CIsWxLogin(This,__result) )
#define IWeChatRobot_CEditRemark(This,wxid,remark,__result) \
( (This)->lpVtbl -> CEditRemark(This,wxid,remark,__result) )
#define IWeChatRobot_CSetChatRoomName(This,chatroomid,name,__result) \
( (This)->lpVtbl -> CSetChatRoomName(This,chatroomid,name,__result) )
#define IWeChatRobot_CSetChatRoomAnnouncement(This,chatroomid,announcement,__result) \
( (This)->lpVtbl -> CSetChatRoomAnnouncement(This,chatroomid,announcement,__result) )
#define IWeChatRobot_CSetChatRoomSelfNickname(This,chatroomid,nickname,__result) \
( (This)->lpVtbl -> CSetChatRoomSelfNickname(This,chatroomid,nickname,__result) )
#define IWeChatRobot_CGetChatRoomMemberNickname(This,chatroomid,wxid,__result) \
( (This)->lpVtbl -> CGetChatRoomMemberNickname(This,chatroomid,wxid,__result) )
#define IWeChatRobot_CDelChatRoomMember(This,chatroomid,wxids,__result) \
( (This)->lpVtbl -> CDelChatRoomMember(This,chatroomid,wxids,__result) )
#define IWeChatRobot_CAddChatRoomMember(This,chatroomid,wxids,__result) \
( (This)->lpVtbl -> CAddChatRoomMember(This,chatroomid,wxids,__result) )
#endif /* COBJMACROS */
......
......@@ -49,7 +49,7 @@
#include "WeChatRobotCOM_i.h"
#define TYPE_FORMAT_STRING_SIZE 1239
#define PROC_FORMAT_STRING_SIZE 1549
#define PROC_FORMAT_STRING_SIZE 1885
#define EXPR_FORMAT_STRING_SIZE 1
#define TRANSMIT_AS_TABLE_SIZE 0
#define WIRE_MARSHAL_TABLE_SIZE 2
......@@ -1440,43 +1440,343 @@ static const WeChatRobotCOM_MIDL_PROC_FORMAT_STRING WeChatRobotCOM__MIDL_ProcFor
/* 1504 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Procedure CPostMessage */
/* Procedure CEditRemark */
/* 1506 */ 0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 1508 */ NdrFcLong( 0x0 ), /* 0 */
/* 1512 */ NdrFcShort( 0x7 ), /* 7 */
/* 1514 */ NdrFcShort( 0x10 ), /* x86 Stack size/offset = 16 */
/* 1512 */ NdrFcShort( 0x2a ), /* 42 */
/* 1514 */ NdrFcShort( 0x14 ), /* x86 Stack size/offset = 20 */
/* 1516 */ NdrFcShort( 0x0 ), /* 0 */
/* 1518 */ NdrFcShort( 0x24 ), /* 36 */
/* 1520 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
0x3, /* 3 */
0x4, /* 4 */
/* 1522 */ 0x8, /* 8 */
0x45, /* Ext Flags: new corr desc, srv corr check, has range on conformance */
/* 1524 */ NdrFcShort( 0x0 ), /* 0 */
/* 1526 */ NdrFcShort( 0x1 ), /* 1 */
/* 1528 */ NdrFcShort( 0x0 ), /* 0 */
/* Parameter msg */
/* Parameter wxid */
/* 1530 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */
/* 1530 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
/* 1532 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */
/* 1534 */ NdrFcShort( 0x4cc ), /* Type Offset=1228 */
/* 1534 */ NdrFcShort( 0x2a ), /* Type Offset=42 */
/* Parameter __result */
/* Parameter remark */
/* 1536 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
/* 1536 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
/* 1538 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */
/* 1540 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* 1540 */ NdrFcShort( 0x2a ), /* Type Offset=42 */
/* Return value */
/* Parameter __result */
/* 1542 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 1542 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
/* 1544 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */
/* 1546 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Return value */
/* 1548 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 1550 */ NdrFcShort( 0x10 ), /* x86 Stack size/offset = 16 */
/* 1552 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Procedure CSetChatRoomName */
/* 1554 */ 0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 1556 */ NdrFcLong( 0x0 ), /* 0 */
/* 1560 */ NdrFcShort( 0x2b ), /* 43 */
/* 1562 */ NdrFcShort( 0x14 ), /* x86 Stack size/offset = 20 */
/* 1564 */ NdrFcShort( 0x0 ), /* 0 */
/* 1566 */ NdrFcShort( 0x24 ), /* 36 */
/* 1568 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
0x4, /* 4 */
/* 1570 */ 0x8, /* 8 */
0x45, /* Ext Flags: new corr desc, srv corr check, has range on conformance */
/* 1572 */ NdrFcShort( 0x0 ), /* 0 */
/* 1574 */ NdrFcShort( 0x1 ), /* 1 */
/* 1576 */ NdrFcShort( 0x0 ), /* 0 */
/* Parameter chatroomid */
/* 1578 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
/* 1580 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */
/* 1582 */ NdrFcShort( 0x2a ), /* Type Offset=42 */
/* Parameter name */
/* 1584 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
/* 1586 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */
/* 1588 */ NdrFcShort( 0x2a ), /* Type Offset=42 */
/* Parameter __result */
/* 1590 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
/* 1592 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */
/* 1594 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Return value */
/* 1596 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 1598 */ NdrFcShort( 0x10 ), /* x86 Stack size/offset = 16 */
/* 1600 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Procedure CSetChatRoomAnnouncement */
/* 1602 */ 0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 1604 */ NdrFcLong( 0x0 ), /* 0 */
/* 1608 */ NdrFcShort( 0x2c ), /* 44 */
/* 1610 */ NdrFcShort( 0x14 ), /* x86 Stack size/offset = 20 */
/* 1612 */ NdrFcShort( 0x0 ), /* 0 */
/* 1614 */ NdrFcShort( 0x24 ), /* 36 */
/* 1616 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
0x4, /* 4 */
/* 1618 */ 0x8, /* 8 */
0x45, /* Ext Flags: new corr desc, srv corr check, has range on conformance */
/* 1620 */ NdrFcShort( 0x0 ), /* 0 */
/* 1622 */ NdrFcShort( 0x1 ), /* 1 */
/* 1624 */ NdrFcShort( 0x0 ), /* 0 */
/* Parameter chatroomid */
/* 1626 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
/* 1628 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */
/* 1630 */ NdrFcShort( 0x2a ), /* Type Offset=42 */
/* Parameter announcement */
/* 1632 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
/* 1634 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */
/* 1636 */ NdrFcShort( 0x2a ), /* Type Offset=42 */
/* Parameter __result */
/* 1638 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
/* 1640 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */
/* 1642 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Return value */
/* 1644 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 1646 */ NdrFcShort( 0x10 ), /* x86 Stack size/offset = 16 */
/* 1648 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Procedure CSetChatRoomSelfNickname */
/* 1650 */ 0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 1652 */ NdrFcLong( 0x0 ), /* 0 */
/* 1656 */ NdrFcShort( 0x2d ), /* 45 */
/* 1658 */ NdrFcShort( 0x14 ), /* x86 Stack size/offset = 20 */
/* 1660 */ NdrFcShort( 0x0 ), /* 0 */
/* 1662 */ NdrFcShort( 0x24 ), /* 36 */
/* 1664 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
0x4, /* 4 */
/* 1666 */ 0x8, /* 8 */
0x45, /* Ext Flags: new corr desc, srv corr check, has range on conformance */
/* 1668 */ NdrFcShort( 0x0 ), /* 0 */
/* 1670 */ NdrFcShort( 0x1 ), /* 1 */
/* 1672 */ NdrFcShort( 0x0 ), /* 0 */
/* Parameter chatroomid */
/* 1674 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
/* 1676 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */
/* 1678 */ NdrFcShort( 0x2a ), /* Type Offset=42 */
/* Parameter nickname */
/* 1680 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
/* 1682 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */
/* 1684 */ NdrFcShort( 0x2a ), /* Type Offset=42 */
/* Parameter __result */
/* 1686 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
/* 1688 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */
/* 1690 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Return value */
/* 1692 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 1694 */ NdrFcShort( 0x10 ), /* x86 Stack size/offset = 16 */
/* 1696 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Procedure CGetChatRoomMemberNickname */
/* 1698 */ 0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 1700 */ NdrFcLong( 0x0 ), /* 0 */
/* 1704 */ NdrFcShort( 0x2e ), /* 46 */
/* 1706 */ NdrFcShort( 0x14 ), /* x86 Stack size/offset = 20 */
/* 1708 */ NdrFcShort( 0x0 ), /* 0 */
/* 1710 */ NdrFcShort( 0x8 ), /* 8 */
/* 1712 */ 0x47, /* Oi2 Flags: srv must size, clt must size, has return, has ext, */
0x4, /* 4 */
/* 1714 */ 0x8, /* 8 */
0x47, /* Ext Flags: new corr desc, clt corr check, srv corr check, has range on conformance */
/* 1716 */ NdrFcShort( 0x1 ), /* 1 */
/* 1718 */ NdrFcShort( 0x1 ), /* 1 */
/* 1720 */ NdrFcShort( 0x0 ), /* 0 */
/* Parameter chatroomid */
/* 1722 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
/* 1724 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */
/* 1726 */ NdrFcShort( 0x2a ), /* Type Offset=42 */
/* Parameter wxid */
/* 1728 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
/* 1730 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */
/* 1732 */ NdrFcShort( 0x2a ), /* Type Offset=42 */
/* Parameter __result */
/* 1734 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */
/* 1736 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */
/* 1738 */ NdrFcShort( 0x4ba ), /* Type Offset=1210 */
/* Return value */
/* 1740 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 1742 */ NdrFcShort( 0x10 ), /* x86 Stack size/offset = 16 */
/* 1744 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Procedure CDelChatRoomMember */
/* 1746 */ 0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 1748 */ NdrFcLong( 0x0 ), /* 0 */
/* 1752 */ NdrFcShort( 0x2f ), /* 47 */
/* 1754 */ NdrFcShort( 0x14 ), /* x86 Stack size/offset = 20 */
/* 1756 */ NdrFcShort( 0x0 ), /* 0 */
/* 1758 */ NdrFcShort( 0x24 ), /* 36 */
/* 1760 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
0x4, /* 4 */
/* 1762 */ 0x8, /* 8 */
0x45, /* Ext Flags: new corr desc, srv corr check, has range on conformance */
/* 1764 */ NdrFcShort( 0x0 ), /* 0 */
/* 1766 */ NdrFcShort( 0x1 ), /* 1 */
/* 1768 */ NdrFcShort( 0x0 ), /* 0 */
/* Parameter chatroomid */
/* 1770 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
/* 1772 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */
/* 1774 */ NdrFcShort( 0x2a ), /* Type Offset=42 */
/* Parameter wxids */
/* 1776 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */
/* 1778 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */
/* 1780 */ NdrFcShort( 0x4cc ), /* Type Offset=1228 */
/* Parameter __result */
/* 1782 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
/* 1784 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */
/* 1786 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Return value */
/* 1788 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 1790 */ NdrFcShort( 0x10 ), /* x86 Stack size/offset = 16 */
/* 1792 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Procedure CAddChatRoomMember */
/* 1794 */ 0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 1796 */ NdrFcLong( 0x0 ), /* 0 */
/* 1800 */ NdrFcShort( 0x30 ), /* 48 */
/* 1802 */ NdrFcShort( 0x14 ), /* x86 Stack size/offset = 20 */
/* 1804 */ NdrFcShort( 0x0 ), /* 0 */
/* 1806 */ NdrFcShort( 0x24 ), /* 36 */
/* 1808 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
0x4, /* 4 */
/* 1810 */ 0x8, /* 8 */
0x45, /* Ext Flags: new corr desc, srv corr check, has range on conformance */
/* 1812 */ NdrFcShort( 0x0 ), /* 0 */
/* 1814 */ NdrFcShort( 0x1 ), /* 1 */
/* 1816 */ NdrFcShort( 0x0 ), /* 0 */
/* Parameter chatroomid */
/* 1818 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
/* 1820 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */
/* 1822 */ NdrFcShort( 0x2a ), /* Type Offset=42 */
/* Parameter wxids */
/* 1824 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */
/* 1826 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */
/* 1828 */ NdrFcShort( 0x4cc ), /* Type Offset=1228 */
/* Parameter __result */
/* 1830 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
/* 1832 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */
/* 1834 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Return value */
/* 1836 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 1838 */ NdrFcShort( 0x10 ), /* x86 Stack size/offset = 16 */
/* 1840 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Procedure CPostMessage */
/* 1842 */ 0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 1844 */ NdrFcLong( 0x0 ), /* 0 */
/* 1848 */ NdrFcShort( 0x7 ), /* 7 */
/* 1850 */ NdrFcShort( 0x10 ), /* x86 Stack size/offset = 16 */
/* 1852 */ NdrFcShort( 0x0 ), /* 0 */
/* 1854 */ NdrFcShort( 0x24 ), /* 36 */
/* 1856 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
0x3, /* 3 */
/* 1858 */ 0x8, /* 8 */
0x45, /* Ext Flags: new corr desc, srv corr check, has range on conformance */
/* 1860 */ NdrFcShort( 0x0 ), /* 0 */
/* 1862 */ NdrFcShort( 0x1 ), /* 1 */
/* 1864 */ NdrFcShort( 0x0 ), /* 0 */
/* Parameter msg */
/* 1866 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */
/* 1868 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */
/* 1870 */ NdrFcShort( 0x4cc ), /* Type Offset=1228 */
/* Parameter __result */
/* 1872 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
/* 1874 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */
/* 1876 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Return value */
/* 1878 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 1880 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */
/* 1882 */ 0x8, /* FC_LONG */
0x0, /* 0 */
0x0
}
};
......@@ -2356,7 +2656,14 @@ static const unsigned short IWeChatRobot_FormatStringOffsetTable[] =
1338,
1380,
1428,
1470
1470,
1506,
1554,
1602,
1650,
1698,
1746,
1794
};
static const MIDL_STUBLESS_PROXY_INFO IWeChatRobot_ProxyInfo =
......@@ -2380,7 +2687,7 @@ static const MIDL_SERVER_INFO IWeChatRobot_ServerInfo =
0,
0,
0};
CINTERFACE_PROXY_VTABLE(42) _IWeChatRobotProxyVtbl =
CINTERFACE_PROXY_VTABLE(49) _IWeChatRobotProxyVtbl =
{
&IWeChatRobot_ProxyInfo,
&IID_IWeChatRobot,
......@@ -2425,7 +2732,14 @@ CINTERFACE_PROXY_VTABLE(42) _IWeChatRobotProxyVtbl =
(void *) (INT_PTR) -1 /* IWeChatRobot::CChangeWeChatVer */ ,
(void *) (INT_PTR) -1 /* IWeChatRobot::CSendAppMsg */ ,
(void *) (INT_PTR) -1 /* IWeChatRobot::CDeleteUser */ ,
(void *) (INT_PTR) -1 /* IWeChatRobot::CIsWxLogin */
(void *) (INT_PTR) -1 /* IWeChatRobot::CIsWxLogin */ ,
(void *) (INT_PTR) -1 /* IWeChatRobot::CEditRemark */ ,
(void *) (INT_PTR) -1 /* IWeChatRobot::CSetChatRoomName */ ,
(void *) (INT_PTR) -1 /* IWeChatRobot::CSetChatRoomAnnouncement */ ,
(void *) (INT_PTR) -1 /* IWeChatRobot::CSetChatRoomSelfNickname */ ,
(void *) (INT_PTR) -1 /* IWeChatRobot::CGetChatRoomMemberNickname */ ,
(void *) (INT_PTR) -1 /* IWeChatRobot::CDelChatRoomMember */ ,
(void *) (INT_PTR) -1 /* IWeChatRobot::CAddChatRoomMember */
};
......@@ -2469,6 +2783,13 @@ static const PRPC_STUB_FUNCTION IWeChatRobot_table[] =
NdrStubCall2,
NdrStubCall2,
NdrStubCall2,
NdrStubCall2,
NdrStubCall2,
NdrStubCall2,
NdrStubCall2,
NdrStubCall2,
NdrStubCall2,
NdrStubCall2,
NdrStubCall2
};
......@@ -2476,7 +2797,7 @@ CInterfaceStubVtbl _IWeChatRobotStubVtbl =
{
&IID_IWeChatRobot,
&IWeChatRobot_ServerInfo,
42,
49,
&IWeChatRobot_table[-3],
CStdStubBuffer_DELEGATING_METHODS
};
......@@ -2492,7 +2813,7 @@ static const unsigned short IRobotEvent_FormatStringOffsetTable[] =
(unsigned short) -1,
(unsigned short) -1,
(unsigned short) -1,
1506
1842
};
static const MIDL_STUBLESS_PROXY_INFO IRobotEvent_ProxyInfo =
......
......@@ -15,6 +15,7 @@ DWORD GetFriendListInitOffset = 0x0;
DWORD GetFriendListRemoteOffset = 0x0;
DWORD GetFriendListFinishOffset = 0x0;
DWORD EditRemarkRemoteOffset = 0x0;
DWORD GetWxUserInfoOffset = 0x0;
DWORD DeleteUserInfoCacheOffset = 0x0;
......@@ -30,7 +31,13 @@ DWORD CheckFriendStatusRemoteOffset = 0x0;
DWORD HookReceiveMessageRemoteOffset = 0x0;
DWORD UnHookReceiveMessageRemoteOffset = 0x0;
DWORD GetChatRoomMemberNicknameRemoteOffset = 0x0;
DWORD GetChatRoomMembersRemoteOffset = 0x0;
DWORD DelChatRoomMemberRemoteOffset = 0x0;
DWORD AddChatRoomMemberRemoteOffset = 0x0;
DWORD SetChatRoomAnnouncementRemoteOffset = 0x0;
DWORD SetChatRoomNameRemoteOffset = 0x0;
DWORD SetChatRoomSelfNicknameRemoteOffset = 0x0;
DWORD GetDbHandlesRemoteOffset = 0x0;
DWORD ExecuteSQLRemoteOffset = 0x0;
......@@ -131,6 +138,8 @@ BOOL GetProcOffset(wchar_t* workPath) {
DWORD GetFriendListFinishProcAddr = (DWORD)GetProcAddress(hd, GetFriendListFinish);
GetFriendListFinishOffset = GetFriendListFinishProcAddr - WeChatBase;
DWORD EditRemarkRemoteAddr = (DWORD)GetProcAddress(hd, EditRemarkRemote);
EditRemarkRemoteOffset = EditRemarkRemoteAddr - WeChatBase;
DWORD GetWxUserInfoProcAddr = (DWORD)GetProcAddress(hd, GetWxUserInfoRemote);
GetWxUserInfoOffset = GetWxUserInfoProcAddr - WeChatBase;
DWORD DeleteUserInfoCacheProcAddr = (DWORD)GetProcAddress(hd, DeleteUserInfoCacheRemote);
......@@ -156,9 +165,22 @@ BOOL GetProcOffset(wchar_t* workPath) {
DWORD UnHookReceiveMessageRemoteAddr = (DWORD)GetProcAddress(hd, UnHookReceiveMessageRemote);
UnHookReceiveMessageRemoteOffset = UnHookReceiveMessageRemoteAddr - WeChatBase;
DWORD GetChatRoomMemberNicknameRemoteAddr = (DWORD)GetProcAddress(hd, GetChatRoomMemberNicknameRemote);
GetChatRoomMemberNicknameRemoteOffset = GetChatRoomMemberNicknameRemoteAddr - WeChatBase;
DWORD GetChatRoomMembersRemoteAddr = (DWORD)GetProcAddress(hd, GetChatRoomMembersRemote);
GetChatRoomMembersRemoteOffset = GetChatRoomMembersRemoteAddr - WeChatBase;
DWORD DelChatRoomMemberRemoteAddr = (DWORD)GetProcAddress(hd, DelChatRoomMemberRemote);
DelChatRoomMemberRemoteOffset = DelChatRoomMemberRemoteAddr - WeChatBase;
DWORD AddChatRoomMemberRemoteAddr = (DWORD)GetProcAddress(hd, AddChatRoomMemberRemote);
AddChatRoomMemberRemoteOffset = AddChatRoomMemberRemoteAddr - WeChatBase;
DWORD SetChatRoomAnnouncementRemoteAddr = (DWORD)GetProcAddress(hd, SetChatRoomAnnouncementRemote);
SetChatRoomAnnouncementRemoteOffset = SetChatRoomAnnouncementRemoteAddr - WeChatBase;
DWORD SetChatRoomNameRemoteAddr = (DWORD)GetProcAddress(hd, SetChatRoomNameRemote);
SetChatRoomNameRemoteOffset = SetChatRoomNameRemoteAddr - WeChatBase;
DWORD SetChatRoomSelfNicknameRemoteAddr = (DWORD)GetProcAddress(hd, SetChatRoomSelfNicknameRemote);
SetChatRoomSelfNicknameRemoteOffset = SetChatRoomSelfNicknameRemoteAddr - WeChatBase;
DWORD GetDbHandlesRemoteAddr = (DWORD)GetProcAddress(hd, GetDbHandlesRemote);
GetDbHandlesRemoteOffset = GetDbHandlesRemoteAddr - WeChatBase;
DWORD ExecuteSQLRemoteAddr = (DWORD)GetProcAddress(hd, ExecuteSQLRemote);
......
......@@ -20,6 +20,13 @@
#include "wechatver.h"
#include "DeleteUser.h"
#include "SendAppMsg.h"
#include "EditRemark.h"
#include "SetChatRoomName.h"
#include "SetChatRoomAnnouncement.h"
#include "SetChatRoomSelfNickname.h"
#include "GetChatRoomMemberNickname.h"
#include "DelChatRoomMember.h"
#include "AddChatRoomMember.h"
extern HANDLE hProcess;
extern DWORD SendImageOffset;
......@@ -34,6 +41,7 @@ extern DWORD GetFriendListInitOffset;
extern DWORD GetFriendListRemoteOffset;
extern DWORD GetFriendListFinishOffset;
extern DWORD EditRemarkRemoteOffset;
extern DWORD GetWxUserInfoOffset;
extern DWORD DeleteUserInfoCacheOffset;
extern DWORD SearchContactByNetRemoteOffset;
......@@ -50,7 +58,13 @@ extern DWORD CheckFriendStatusRemoteOffset;
extern DWORD HookReceiveMessageRemoteOffset;
extern DWORD UnHookReceiveMessageRemoteOffset;
extern DWORD GetChatRoomMemberNicknameRemoteOffset;
extern DWORD GetChatRoomMembersRemoteOffset;
extern DWORD DelChatRoomMemberRemoteOffset;
extern DWORD AddChatRoomMemberRemoteOffset;
extern DWORD SetChatRoomAnnouncementRemoteOffset;
extern DWORD SetChatRoomNameRemoteOffset;
extern DWORD SetChatRoomSelfNicknameRemoteOffset;
extern DWORD GetDbHandlesRemoteOffset;
extern DWORD ExecuteSQLRemoteOffset;
......@@ -84,6 +98,7 @@ extern DWORD ChangeWeChatVerRemoteOffset;
#define GetFriendListRemote "GetFriendListRemote"
#define GetFriendListFinish "GetFriendListFinish"
#define EditRemarkRemote "EditRemarkRemote"
#define GetWxUserInfoRemote "GetWxUserInfoRemote"
#define DeleteUserInfoCacheRemote "DeleteUserInfoCacheRemote"
......@@ -99,7 +114,13 @@ extern DWORD ChangeWeChatVerRemoteOffset;
#define HookReceiveMessageRemote "HookReceiveMessage"
#define UnHookReceiveMessageRemote "UnHookReceiveMessage"
#define GetChatRoomMemberNicknameRemote "GetChatRoomMemberNicknameRemote"
#define GetChatRoomMembersRemote "GetChatRoomMembersRemote"
#define DelChatRoomMemberRemote "DelChatRoomMemberRemote"
#define AddChatRoomMemberRemote "AddChatRoomMemberRemote"
#define SetChatRoomAnnouncementRemote "SetChatRoomAnnouncementRemote"
#define SetChatRoomNameRemote "SetChatRoomNameRemote"
#define SetChatRoomSelfNicknameRemote "SetChatRoomSelfNicknameRemote"
#define GetDbHandlesRemote "GetDbHandlesRemote"
#define ExecuteSQLRemote "ExecuteSQLRemote"
......
#include "pch.h"
#define AddChatRoomMemeberCall1Offset 0x67CF29F0 - 0x67C10000
#define AddChatRoomMemeberCall2Offset 0x68381980 - 0x67C10000
#define AddChatRoomMemeberCall3Offset 0x6804D8D0 - 0x67C10000
#ifndef USE_SOCKET
struct AddChatRoomMemberStruct
{
DWORD chatroomid;
DWORD wxidlist;
DWORD length;
};
BOOL AddChatRoomMemberRemote(LPVOID lpParameter) {
AddChatRoomMemberStruct* rp = (AddChatRoomMemberStruct*)lpParameter;
wchar_t* wsChatRoomId = (WCHAR*)rp->chatroomid;
if (rp->length == 0)
return false;
else if(rp->length == 1)
return AddChatRoomMember(wsChatRoomId, (wchar_t**)&rp->wxidlist, rp->length);
else
return AddChatRoomMember(wsChatRoomId, (wchar_t**)rp->wxidlist, rp->length);
}
#endif // !USE_SOCKET
BOOL AddChatRoomMember(wchar_t* chatroomid, wchar_t** wxids, int length) {
DWORD WeChatWinBase = GetWeChatWinBase();
DWORD AddChatRoomMemeberCall1 = WeChatWinBase + AddChatRoomMemeberCall1Offset;
DWORD AddChatRoomMemeberCall2 = WeChatWinBase + AddChatRoomMemeberCall2Offset;
DWORD AddChatRoomMemeberCall3 = WeChatWinBase + AddChatRoomMemeberCall3Offset;
WxBaseStruct pchatroomid(chatroomid);
vector<WxBaseStruct> members;
VectorStruct* vs = (VectorStruct*)&members;
DWORD pmembers = (DWORD)&vs->v_data;
for (int i = 0; i < length; i++) {
WxBaseStruct pwxid(wxids[i]);
members.push_back(pwxid);
}
int isSuccess = 0;
__asm {
pushad;
pushfd;
call AddChatRoomMemeberCall1;
sub esp, 0x14;
mov esi, eax;
mov ecx, esp;
lea ebx, pchatroomid;
push ebx;
call AddChatRoomMemeberCall2;
mov edi, dword ptr[pmembers];
push edi;
mov ecx, esi;
call AddChatRoomMemeberCall3;
mov isSuccess, eax;
popfd;
popad;
}
return isSuccess == 1;
}
\ No newline at end of file
#pragma once
#include<windows.h>
BOOL AddChatRoomMember(wchar_t* chatroomid, wchar_t** wxids, int length);
#ifndef USE_SOCKET
extern "C" __declspec(dllexport) BOOL AddChatRoomMemberRemote(LPVOID lpParameter);
#endif // !USE_SOCKET
\ No newline at end of file
......@@ -298,14 +298,18 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="AddChatRoomMember.h" />
<ClInclude Include="AddFriend.h" />
<ClInclude Include="comclient.h" />
<ClInclude Include="CheckFriendStatus.h" />
<ClInclude Include="DbBackup.h" />
<ClInclude Include="DbExecuteSql.h" />
<ClInclude Include="DelChatRoomMember.h" />
<ClInclude Include="DeleteUser.h" />
<ClInclude Include="EditRemark.h" />
<ClInclude Include="framework.h" />
<ClInclude Include="FriendList.h" />
<ClInclude Include="GetChatRoomMemberNickname.h" />
<ClInclude Include="GetChatRoomMembers.h" />
<ClInclude Include="GetDbHandles.h" />
<ClInclude Include="LogMsgInfo.h" />
......@@ -320,6 +324,9 @@
<ClInclude Include="SendImage.h" />
<ClInclude Include="SendText.h" />
<ClInclude Include="SearchContact.h" />
<ClInclude Include="SetChatRoomAnnouncement.h" />
<ClInclude Include="SetChatRoomName.h" />
<ClInclude Include="SetChatRoomSelfNickname.h" />
<ClInclude Include="sqlite3.h" />
<ClInclude Include="VerifyFriendApply.h" />
<ClInclude Include="wechatver.h" />
......@@ -328,6 +335,7 @@
<ClInclude Include="wxsocketapi.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="AddChatRoomMember.cpp" />
<ClCompile Include="AddFriendByV3.cpp" />
<ClCompile Include="AddFriendByWxid.cpp" />
<ClCompile Include="AddBrandContact.cpp" />
......@@ -335,9 +343,12 @@
<ClCompile Include="comclient.cpp" />
<ClCompile Include="DbBackup.cpp" />
<ClCompile Include="DbExecuteSql.cpp" />
<ClCompile Include="DelChatRoomMember.cpp" />
<ClCompile Include="DeleteUser.cpp" />
<ClCompile Include="dllmain.cpp" />
<ClCompile Include="EditRemark.cpp" />
<ClCompile Include="FriendList.cpp" />
<ClCompile Include="GetChatRoomMemberNickname.cpp" />
<ClCompile Include="GetChatRoomMemebers.cpp" />
<ClCompile Include="GetDbHandles.cpp" />
<ClCompile Include="HookImageMessage.cpp" />
......@@ -364,6 +375,9 @@
<ClCompile Include="SendText.cpp" />
<ClCompile Include="SearchContactByCache.cpp" />
<ClCompile Include="LogMsgInfo.cpp" />
<ClCompile Include="SetChatRoomAnnouncement.cpp" />
<ClCompile Include="SetChatRoomName.cpp" />
<ClCompile Include="SetChatRoomSelfNickname.cpp" />
<ClCompile Include="VerifyFriendApply.cpp" />
<ClCompile Include="wechatver.cpp" />
<ClCompile Include="wxsocket.cpp" />
......
......@@ -55,9 +55,6 @@
<Filter Include="群相关">
<UniqueIdentifier>{5bb967a4-4dc2-4b95-a3da-2795edc30b1b}</UniqueIdentifier>
</Filter>
<Filter Include="群相关\获取群成员">
<UniqueIdentifier>{fabe98aa-4f28-4bc6-b368-68808145a135}</UniqueIdentifier>
</Filter>
<Filter Include="数据库">
<UniqueIdentifier>{430d3dd8-bbd5-4ec2-85dc-7d853ea0096d}</UniqueIdentifier>
</Filter>
......@@ -94,6 +91,30 @@
<Filter Include="comclient">
<UniqueIdentifier>{79c2ec41-70f9-445a-8681-5a2dbfe01eca}</UniqueIdentifier>
</Filter>
<Filter Include="好友相关\修改备注">
<UniqueIdentifier>{23a3ba8c-2be4-4020-af6d-99f95ccf41c8}</UniqueIdentifier>
</Filter>
<Filter Include="群相关\删除成员">
<UniqueIdentifier>{97a29e84-9ac8-4a48-9fc6-040f93fc2239}</UniqueIdentifier>
</Filter>
<Filter Include="群相关\修改群公告">
<UniqueIdentifier>{e675d10e-10a3-47b5-a64f-d430df80a612}</UniqueIdentifier>
</Filter>
<Filter Include="群相关\添加成员">
<UniqueIdentifier>{a727c65d-1b9f-46f7-b343-4d9256129902}</UniqueIdentifier>
</Filter>
<Filter Include="群相关\修改群聊名称">
<UniqueIdentifier>{40cc017b-9cfc-43eb-8576-8244bd46f2c3}</UniqueIdentifier>
</Filter>
<Filter Include="群相关\修改群内昵称">
<UniqueIdentifier>{78f3a991-b957-43d0-9f21-669b33f28942}</UniqueIdentifier>
</Filter>
<Filter Include="群相关\获取群成员列表">
<UniqueIdentifier>{fabe98aa-4f28-4bc6-b368-68808145a135}</UniqueIdentifier>
</Filter>
<Filter Include="群相关\获取群成员昵称">
<UniqueIdentifier>{cb62e2bc-3505-49dd-9b35-def28c95ff8c}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="framework.h">
......@@ -139,7 +160,7 @@
<Filter>发送消息\发送艾特</Filter>
</ClInclude>
<ClInclude Include="GetChatRoomMembers.h">
<Filter>群相关\获取群成员</Filter>
<Filter>群相关\获取群成员列表</Filter>
</ClInclude>
<ClInclude Include="DbExecuteSql.h">
<Filter>数据库\执行SQL</Filter>
......@@ -180,6 +201,27 @@
<ClInclude Include="wxapi.h">
<Filter>通用标头</Filter>
</ClInclude>
<ClInclude Include="EditRemark.h">
<Filter>好友相关\修改备注</Filter>
</ClInclude>
<ClInclude Include="DelChatRoomMember.h">
<Filter>群相关\删除成员</Filter>
</ClInclude>
<ClInclude Include="AddChatRoomMember.h">
<Filter>群相关\添加成员</Filter>
</ClInclude>
<ClInclude Include="SetChatRoomAnnouncement.h">
<Filter>群相关\修改群公告</Filter>
</ClInclude>
<ClInclude Include="SetChatRoomSelfNickname.h">
<Filter>群相关\修改群内昵称</Filter>
</ClInclude>
<ClInclude Include="SetChatRoomName.h">
<Filter>群相关\修改群聊名称</Filter>
</ClInclude>
<ClInclude Include="GetChatRoomMemberNickname.h">
<Filter>群相关\获取群成员昵称</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="dllmain.cpp">
......@@ -225,7 +267,7 @@
<Filter>发送消息\发送艾特</Filter>
</ClCompile>
<ClCompile Include="GetChatRoomMemebers.cpp">
<Filter>群相关\获取群成员</Filter>
<Filter>群相关\获取群成员列表</Filter>
</ClCompile>
<ClCompile Include="DbExecuteSql.cpp">
<Filter>数据库\执行SQL</Filter>
......@@ -272,5 +314,26 @@
<ClCompile Include="comclient.cpp">
<Filter>comclient</Filter>
</ClCompile>
<ClCompile Include="EditRemark.cpp">
<Filter>好友相关\修改备注</Filter>
</ClCompile>
<ClCompile Include="DelChatRoomMember.cpp">
<Filter>群相关\删除成员</Filter>
</ClCompile>
<ClCompile Include="AddChatRoomMember.cpp">
<Filter>群相关\添加成员</Filter>
</ClCompile>
<ClCompile Include="SetChatRoomAnnouncement.cpp">
<Filter>群相关\修改群公告</Filter>
</ClCompile>
<ClCompile Include="SetChatRoomSelfNickname.cpp">
<Filter>群相关\修改群内昵称</Filter>
</ClCompile>
<ClCompile Include="SetChatRoomName.cpp">
<Filter>群相关\修改群聊名称</Filter>
</ClCompile>
<ClCompile Include="GetChatRoomMemberNickname.cpp">
<Filter>群相关\获取群成员昵称</Filter>
</ClCompile>
</ItemGroup>
</Project>
\ No newline at end of file
#include "pch.h"
#define DelChatRoomMemeberCall1Offset 0x67CF29F0 - 0x67C10000
#define DelChatRoomMemeberCall2Offset 0x68381980 - 0x67C10000
#define DelChatRoomMemeberCall3Offset 0x6804DC10 - 0x67C10000
#ifndef USE_SOCKET
struct DelChatRoomMemberStruct
{
DWORD chatroomid;
DWORD wxidlist;
DWORD length;
};
BOOL DelChatRoomMemberRemote(LPVOID lpParameter) {
DelChatRoomMemberStruct* rp = (DelChatRoomMemberStruct*)lpParameter;
wchar_t* wsChatRoomId = (WCHAR*)rp->chatroomid;
if (rp->length == 0)
return false;
else if(rp->length == 1)
return DelChatRoomMember(wsChatRoomId, (wchar_t**)&rp->wxidlist,rp->length);
else
return DelChatRoomMember(wsChatRoomId, (wchar_t**)rp->wxidlist, rp->length);
}
#endif // !USE_SOCKET
BOOL DelChatRoomMember(wchar_t* chatroomid,wchar_t** wxids,int length) {
DWORD WeChatWinBase = GetWeChatWinBase();
DWORD DelChatRoomMemeberCall1 = WeChatWinBase + DelChatRoomMemeberCall1Offset;
DWORD DelChatRoomMemeberCall2 = WeChatWinBase + DelChatRoomMemeberCall2Offset;
DWORD DelChatRoomMemeberCall3 = WeChatWinBase + DelChatRoomMemeberCall3Offset;
WxBaseStruct pchatroomid(chatroomid);
vector<WxBaseStruct> members;
VectorStruct* vs = (VectorStruct*)&members;
DWORD pmembers = (DWORD)&vs->v_data;
for (int i = 0; i < length; i++) {
WxBaseStruct pwxid(wxids[i]);
members.push_back(pwxid);
}
int isSuccess = 0;
__asm {
pushad;
pushfd;
call DelChatRoomMemeberCall1;
sub esp, 0x14;
mov esi, eax;
mov ecx, esp;
lea ebx, pchatroomid;
push ebx;
call DelChatRoomMemeberCall2;
mov edi, dword ptr[pmembers];
push edi;
mov ecx, esi;
call DelChatRoomMemeberCall3;
mov isSuccess, eax;
popfd;
popad;
}
return isSuccess == 1;
}
\ No newline at end of file
#pragma once
#include<windows.h>
BOOL DelChatRoomMember(wchar_t* chatroomid, wchar_t** wxids, int length);
#ifndef USE_SOCKET
extern "C" __declspec(dllexport) BOOL DelChatRoomMemberRemote(LPVOID lpParameter);
#endif // !USE_SOCKET
#include "pch.h"
#define EditRemarkCallOffset 0x6806F6F0 - 0x67C10000
#ifndef USE_SOCKET
struct EditRemarkStruct {
wchar_t* wxid;
wchar_t* remark;
};
BOOL EditRemarkRemote(LPVOID lpParameter) {
EditRemarkStruct* ers = (EditRemarkStruct*)lpParameter;
return EditRemark(ers->wxid,ers->remark);
}
#endif // !USE_SOCKET
BOOL EditRemark(wchar_t* wxid, wchar_t* remark) {
DWORD EditRemarkCall = GetWeChatWinBase() + EditRemarkCallOffset;
WxBaseStruct pwxid(wxid);
WxBaseStruct premark(remark);
int isSuccess = 0;
__asm {
pushad;
pushfd;
lea eax, premark;
push eax;
lea eax, pwxid;
push eax;
call EditRemarkCall;
mov isSuccess, eax;
popfd;
popad;
}
return isSuccess == 1;
}
\ No newline at end of file
#pragma once
#include<windows.h>
BOOL EditRemark(wchar_t* wxid, wchar_t* remark);
#ifndef USE_SOCKET
extern "C" __declspec(dllexport) BOOL EditRemarkRemote(LPVOID lpParameter);
#endif // !USE_SOCKET
#include "pch.h"
#define GetChatRoomMemberNicknameCall1Offset 0x78F629F0 - 0x78E80000
#define GetChatRoomMemberNicknameCall2Offset 0x792C89A0 - 0x78E80000
#ifndef USE_SOCKET
struct ChatRoomMemberNicknameStruct {
wchar_t* chatroomid;
wchar_t* wxid;
wchar_t* nickname;
};
BOOL GetChatRoomMemberNicknameRemote(LPVOID lpParameter) {
ChatRoomMemberNicknameStruct* crmns = (ChatRoomMemberNicknameStruct*)lpParameter;
wstring nickname = GetChatRoomMemberNickname(crmns->chatroomid, crmns->wxid);
memcpy(crmns->nickname,nickname.c_str(),nickname.length() * 2);
return nickname.length() != 0;
}
#endif // !USE_SOCKET
wstring GetChatRoomMemberNickname(wchar_t* chatroomid, wchar_t* wxid) {
DWORD WeChatWinBase = GetWeChatWinBase();
DWORD GetChatRoomMemberNicknameCall1 = WeChatWinBase + GetChatRoomMemberNicknameCall1Offset;
DWORD GetChatRoomMemberNicknameCall2 = WeChatWinBase + GetChatRoomMemberNicknameCall2Offset;
WxBaseStruct pchatroomid(chatroomid);
WxBaseStruct pwxid(wxid);
WxBaseStruct pnickname(NULL);
__asm {
pushad;
pushfd;
call GetChatRoomMemberNicknameCall1;
lea edx, pnickname;
push edx;
lea edi, pwxid;
push edi;
lea ecx, pchatroomid;
push ecx;
mov ecx, eax;
call GetChatRoomMemberNicknameCall2;
popfd;
popad;
}
wstring nickname = L"";
if (pnickname.buffer) {
nickname += wstring(pnickname.buffer);
}
else {
wchar_t* buffer = GetUserNickNameByWxId(wxid);
nickname += wstring(buffer);
delete[] buffer;
}
return nickname;
}
\ No newline at end of file
#pragma once
#include<windows.h>
#include<iostream>
using namespace std;
wstring GetChatRoomMemberNickname(wchar_t* chatroomid, wchar_t* wxid);
#ifndef USE_SOCKET
extern "C" __declspec(dllexport) BOOL GetChatRoomMemberNicknameRemote(LPVOID lpParameter);
#endif // !USE_SOCKET
......@@ -2,6 +2,8 @@
#include <vector>
#define CheckLoginOffset 0x2366538
// 个人WXID偏移
#define SelfWxidAddrOffset 0x236607C
/*
* 外部调用时的返回类型
......@@ -32,6 +34,30 @@ DWORD GetSelfInfoRemote() {
}
#endif
wstring GetSelfWxid() {
DWORD baseAddr = GetWeChatWinBase() + SelfWxidAddrOffset;
char wxidbuffer[0x100] = { 0 };
DWORD SelfWxIdAddr = 0x0;
sprintf_s(wxidbuffer, "%s", (char*)baseAddr);
if (strlen(wxidbuffer) < 0x6 || strlen(wxidbuffer) > 0x14)
{
SelfWxIdAddr = *(DWORD*)baseAddr;
}
else
{
SelfWxIdAddr = baseAddr;
}
if (SelfWxIdAddr == 0) {
return L"";
}
char* sselfwxid = (char*)SelfWxIdAddr;
wchar_t* wselfwxid = new wchar_t[strlen(sselfwxid) + 1];
MultiByteToWideChar(CP_ACP, 0, sselfwxid, -1, wselfwxid, strlen(sselfwxid) + 1);
wstring wxid(wselfwxid);
delete[] wselfwxid;
return wxid;
}
/*
* 获取个人信息
*/
......
......@@ -3,6 +3,7 @@
#include<iostream>
using namespace std;
wstring GetSelfInfo();
wstring GetSelfWxid();
#ifndef USE_SOCKET
extern "C" __declspec(dllexport) DWORD GetSelfInfoRemote();
extern "C" __declspec(dllexport) VOID DeleteSelfInfoCacheRemote();
......
......@@ -10,8 +10,6 @@
#define SendArticleCall4Offset 0x78A8D7B0 - 0x786A0000
// 发送文章CALL参数偏移
#define SendArticleParamOffset 0x7AA26FE4 - 0x786A0000
// 个人WXID偏移
#define SelfWxidAddrOffset 0x236607C
// 清空缓存CALL1偏移
#define SendArticleClearCacheCall1Offset 0x78D46450 - 0x786A0000
......@@ -52,26 +50,6 @@ VOID SendArticleRemote(LPVOID lparameter) {
}
#endif
/*
* 获取自己的wxid保存地址
* return:DWORD,个人wxid保存地址
*/
DWORD GetSelfWxIdAddr() {
DWORD baseAddr = GetWeChatWinBase() + SelfWxidAddrOffset;
char wxidbuffer[0x100] = { 0 };
DWORD SelfWxIdAddr = 0x0;
sprintf_s(wxidbuffer, "%s", (char*)baseAddr);
if (strlen(wxidbuffer) < 0x6 || strlen(wxidbuffer) > 0x14)
{
SelfWxIdAddr = *(DWORD*)baseAddr;
}
else
{
SelfWxIdAddr = baseAddr;
}
return SelfWxIdAddr;
}
/*
* 发送文章消息的具体实现
* wxid:消息接收人wxid
......@@ -92,17 +70,15 @@ BOOL __stdcall SendArticle(wchar_t* wxid,wchar_t* title, wchar_t* abstract, wcha
DWORD SendArticleClearCacheCall1 = WeChatWinBase + SendArticleClearCacheCall1Offset;
DWORD SendArticleClearCacheCall2 = WeChatWinBase + SendArticleClearCacheCall2Offset;
// 自己的wxid,发送者
char* sselfwxid = (char*)GetSelfWxIdAddr();
wchar_t* wselfwxid = new wchar_t[strlen(sselfwxid) + 1];
MultiByteToWideChar(CP_ACP, 0, sselfwxid, -1, wselfwxid, strlen(sselfwxid) + 1);
wstring wselfwxid = GetSelfWxid();
// 构造xml数据
wchar_t* xmlbuffer = new wchar_t[0x2000];
ZeroMemory(xmlbuffer, 0x2000 * 2);
swprintf_s(xmlbuffer,0x2000, (wchar_t*)L"<msg>\n <fromusername>%ws</fromusername>\n <scene>0</scene>\n <commenturl></commenturl>\n <appmsg appid=\"\" sdkver=\"0\">\n <title>%ws</title>\n <des>%ws</des>\n <action>view</action>\n <type>5</type>\n <showtype>0</showtype>\n <content></content>\n <url>%ws</url>\n <dataurl></dataurl>\n <lowurl></lowurl>\n <lowdataurl></lowdataurl>\n <recorditem>\n <![CDATA[]]>\n </recorditem>\n <thumburl></thumburl>\n <messageaction></messageaction>\n <extinfo></extinfo>\n <sourceusername></sourceusername>\n <sourcedisplayname></sourcedisplayname>\n <commenturl></commenturl>\n <appattach>\n <totallen>0</totallen>\n <attachid></attachid>\n <emoticonmd5></emoticonmd5>\n <fileext></fileext>\n <aeskey></aeskey>\n </appattach>\n <weappinfo>\n <pagepath></pagepath>\n <username></username>\n <appid></appid>\n <appservicetype>0</appservicetype>\n </weappinfo>\n <websearch />\n </appmsg>\n <appinfo>\n <version>1</version>\n <appname>Window wechat</appname>\n </appinfo>\n</msg>",
wselfwxid,title,abstract,url);
wselfwxid.c_str(),title,abstract,url);
DWORD sendtype = 0x5;
WxBaseStruct pSender(wselfwxid);
WxBaseStruct pSender((wchar_t*)wselfwxid.c_str());
char nullbuffer[0x1C] = { 0 };
WxBaseStruct pXml(xmlbuffer);
WxBaseStruct pReceiver(wxid);
......@@ -154,7 +130,5 @@ BOOL __stdcall SendArticle(wchar_t* wxid,wchar_t* title, wchar_t* abstract, wcha
}
delete[] xmlbuffer;
xmlbuffer = NULL;
delete[] wselfwxid;
wselfwxid = NULL;
return (isSuccess == 0x1);
}
\ No newline at end of file
#include "pch.h"
#define SetChatRoomAnnouncementCallOffset 0x68057ED0 - 0x67C10000
#define SetChatRoomAnnouncementParam1Offset 0x69A911F8 - 0x67C10000
#define SetChatRoomAnnouncementParam2Offset 0x69A90714 - 0x67C10000
#define SetChatRoomAnnouncementParam3Offset 0x69A90768 - 0x67C10000
#ifndef USE_SOCKET
struct SetChatRoomAnnouncementStruct {
wchar_t* chatroomid;
wchar_t* announcement;
};
BOOL SetChatRoomAnnouncementRemote(LPVOID lpParameter) {
SetChatRoomAnnouncementStruct* scras = (SetChatRoomAnnouncementStruct*)lpParameter;
return SetChatRoomAnnouncement(scras->chatroomid,scras->announcement);
}
#endif
struct SetChatRoomAnnouncementParam1Struct {
DWORD addr;
WxString chatroomid;
WxString announcement;
WxString selfwxid;
DWORD fill1 = 0x0;
DWORD time = 0x0;
DWORD fill2 = 0x0;
DWORD fill3 = 0x0;
WxString xml;
char nullbuffer[0x2C] = { 0 };
};
struct SetChatRoomAnnouncementParam2Struct {
DWORD head = 0x1;
DWORD addr;
WxString chatroomid;
WxString announcement;
WxString selfwxid;
DWORD time = 0x0;
DWORD fill1 = 0x0;
DWORD fill2 = 0x2;
};
BOOL SetChatRoomAnnouncement(wchar_t* chatroomid, wchar_t* announcement) {
DWORD WeChatWinBase = GetWeChatWinBase();
DWORD SetChatRoomAnnouncementCall = WeChatWinBase + SetChatRoomAnnouncementCallOffset;
DWORD SetChatRoomAnnouncementParam1Addr = WeChatWinBase + SetChatRoomAnnouncementParam1Offset;
DWORD SetChatRoomAnnouncementParam2Addr = WeChatWinBase + SetChatRoomAnnouncementParam2Offset;
DWORD SetChatRoomAnnouncementParam3Addr = WeChatWinBase + SetChatRoomAnnouncementParam3Offset;
wstring selfwxid = GetSelfWxid();
time_t cTime = time(NULL);
/*wchar_t* xmlbuffer = new wchar_t[0x1000];
ZeroMemory(xmlbuffer, 0x1000 * 2);
swprintf_s(xmlbuffer, 0x1000, L"<group_notice_item>\n\t<edittime>%d</edittime>\n\t<datalist count=\"2\">\n\t\t<dataitem dataid=\"f4086b1d1cce7ca08c1ab0ae8b6b50af\" datatype=\"8\" htmlid=\"WeNoteHtmlFile\">\n\t\t\t<datafmt>.htm</datafmt>\n\t\t\t<fullmd5>b1e2c9070ed939767187635505ff4a96</fullmd5>\n\t\t\t<fullsize>64</fullsize>\n\t\t\t<cdn_dataurl>http://wxapp.tc.qq.com/264/20303/stodownload?m=b1e2c9070ed939767187635505ff4a96&amp;filekey=3033020101041f301d02020108040253480410b1e2c9070ed939767187635505ff4a96020140040d00000004627466730000000131&amp;hy=SH&amp;storeid=323032323037313731323039323430303030666233613665663030306233626336626234306230303030303130383030303034663466&amp;bizid=1023</cdn_dataurl>\n\t\t\t<cdn_datakey>3c5e83e10c6b766107c11eed520aaaaa</cdn_datakey>\n\t\t</dataitem>\n\t\t<dataitem dataid=\"2563007f8c87c6ed4ccc40666e8076d4\" datatype=\"1\" htmlid=\" - 1\">\n\t\t\t<datadesc>%ws</datadesc>\n\t\t</dataitem>\n\t</datalist>\n\t<source>\n\t\t<fromusr>%s</fromusr>\n\t\t<tousr>%s</tousr>\n\t\t<sourceid>4918e03e3605937ef668cb588a459806</sourceid>\n\t</source>\n</group_notice_item>",
(DWORD)cTime,announcement,selfwxid.c_str(),chatroomid);*/
vector<SetChatRoomAnnouncementParam1Struct> v_param1;
SetChatRoomAnnouncementParam1Struct param1 = { 0 };
param1.addr = SetChatRoomAnnouncementParam1Addr;
param1.chatroomid.buffer = chatroomid;
param1.chatroomid.length = wcslen(chatroomid);
param1.chatroomid.maxLength = wcslen(chatroomid) * 2;
param1.announcement.buffer = announcement;
param1.announcement.length = announcement ? wcslen(announcement) : 0;
param1.announcement.maxLength = announcement ? wcslen(announcement) * 2 : 0;
param1.selfwxid.buffer = (wchar_t*)selfwxid.c_str();
param1.selfwxid.length = selfwxid.length();
param1.selfwxid.maxLength = selfwxid.length() * 2;
/*param1.xml.buffer = xmlbuffer;
param1.xml.length = wcslen(xmlbuffer);
param1.xml.maxLength = wcslen(xmlbuffer) * 2;*/
param1.time = (DWORD)cTime;
v_param1.push_back(param1);
VectorStruct* vs = (VectorStruct*)&v_param1;
DWORD ptrParam1 = (DWORD)&vs->v_data;
SetChatRoomAnnouncementParam2Struct param2 = { 0 };
param2.head = 0x1;
param2.addr = SetChatRoomAnnouncementParam2Addr;
param2.chatroomid.buffer = chatroomid;
param2.chatroomid.length = wcslen(chatroomid);
param2.chatroomid.maxLength = wcslen(chatroomid) * 2;
param2.announcement.buffer = announcement;
param2.announcement.length = announcement ? wcslen(announcement) : 0;
param2.announcement.maxLength = announcement ? wcslen(announcement) * 2 : 0;
param2.selfwxid.buffer = (wchar_t*)selfwxid.c_str();
param2.selfwxid.length = selfwxid.length();
param2.selfwxid.maxLength = selfwxid.length() * 2;
param2.time = (DWORD)cTime;
DWORD pnote = 0;
pnote = (DWORD)&pnote;
param2.fill1 = pnote;
param2.fill2 = 0x2;
__asm {
pushad;
pushfd;
lea eax, param2;
push eax;
mov eax, dword ptr[ptrParam1];
push eax;
call SetChatRoomAnnouncementCall;
popfd;
popad;
}
/*delete[] xmlbuffer;*/
return true;
}
\ No newline at end of file
#pragma once
#include<windows.h>
BOOL SetChatRoomAnnouncement(wchar_t* chatroomid, wchar_t* announcement);
#ifndef USE_SOCKET
extern "C" __declspec(dllexport) BOOL SetChatRoomAnnouncementRemote(LPVOID lpParameter);
#endif // !USE_SOCKET
#include "pch.h"
#define SetChatRoomNameCall1Offset 0x680CD620 - 0x68010000
#define SetChatRoomNameCall2Offset 0x685090A0 - 0x68010000
#ifndef USE_SOCKET
struct SetChatRoomNameStruct {
wchar_t* chatroomid;
wchar_t* chatroomname;
};
BOOL SetChatRoomNameRemote(LPVOID lpParameter) {
SetChatRoomNameStruct* scrns = (SetChatRoomNameStruct*)lpParameter;
return SetChatRoomName(scrns->chatroomid, scrns->chatroomname);
}
#endif // !USE_SOCKET
BOOL SetChatRoomName(wchar_t* chatroomid, wchar_t* chatroomname) {
DWORD WeChatWinBase = GetWeChatWinBase();
DWORD SetChatRoomNameCall1 = WeChatWinBase + SetChatRoomNameCall1Offset;
DWORD SetChatRoomNameCall2 = WeChatWinBase + SetChatRoomNameCall2Offset;
WxBaseStruct pchatroomid(chatroomid);
WxBaseStruct pchatroomname(chatroomname);
int isSuccess = 0;
__asm {
pushad;
pushfd;
call SetChatRoomNameCall1;
lea ebx, pchatroomname;
push ebx;
lea esi, pchatroomid;
push esi;
mov ecx, eax;
call SetChatRoomNameCall2;
movzx eax, al;
mov isSuccess, eax;
popfd;
popad;
}
return isSuccess == 0x1;
}
\ No newline at end of file
#pragma once
#include<windows.h>
BOOL SetChatRoomName(wchar_t* chatroomid, wchar_t* chatroomname);
#ifndef USE_SOCKET
extern "C" __declspec(dllexport) BOOL SetChatRoomNameRemote(LPVOID lpParameter);
#endif // !USE_SOCKET
\ No newline at end of file
#include "pch.h"
#define SetChatRoomSelfNicknameCall1Offset 0x680CD620 - 0x68010000
#define SetChatRoomSelfNicknameCall2Offset 0x68781980 - 0x68010000
#define SetChatRoomSelfNicknameCall3Offset 0x68509FE0 - 0x68010000
#ifndef USE_SOCKET
struct SetChatRoomSelfNicknameStruct {
wchar_t* chatroomid;
wchar_t* nickname;
};
BOOL SetChatRoomSelfNicknameRemote(LPVOID lpParameter) {
SetChatRoomSelfNicknameStruct* scrsns = (SetChatRoomSelfNicknameStruct*)lpParameter;
if (!scrsns->nickname)
return false;
return SetChatRoomSelfNickname(scrsns->chatroomid, scrsns->nickname);
}
#endif // !USE_SOCKET
BOOL SetChatRoomSelfNickname(wchar_t* chatroomid,wchar_t* nickname) {
DWORD WeChatWinBase = GetWeChatWinBase();
DWORD SetChatRoomSelfNicknameCall1 = WeChatWinBase + SetChatRoomSelfNicknameCall1Offset;
DWORD SetChatRoomSelfNicknameCall2 = WeChatWinBase + SetChatRoomSelfNicknameCall2Offset;
DWORD SetChatRoomSelfNicknameCall3 = WeChatWinBase + SetChatRoomSelfNicknameCall3Offset;
wstring selfwxid = GetSelfWxid();
WxBaseStruct pchatroomid(chatroomid);
WxBaseStruct pselfwxid((wchar_t*)selfwxid.c_str());
WxBaseStruct pnickname(nickname);
int isSuccess = 0x0;
__asm {
pushad;
pushfd;
call SetChatRoomSelfNicknameCall1;
sub esp, 0x14;
mov esi, eax;
lea eax, pnickname;
mov ecx, esp;
push eax;
call SetChatRoomSelfNicknameCall2;
sub esp, 0x14;
lea eax, pselfwxid;
mov ecx, esp;
push eax;
call SetChatRoomSelfNicknameCall2;
sub esp, 0x14;
lea eax, pchatroomid;
mov ecx, esp;
push eax;
call SetChatRoomSelfNicknameCall2;
mov ecx, esi;
call SetChatRoomSelfNicknameCall3;
mov isSuccess, eax;
popfd;
popad;
}
return isSuccess == 0x1;
}
\ No newline at end of file
#pragma once
#include<windows.h>
BOOL SetChatRoomSelfNickname(wchar_t* chatroomid, wchar_t* nickname);
#ifndef USE_SOCKET
extern "C" __declspec(dllexport) BOOL SetChatRoomSelfNicknameRemote(LPVOID lpParameter);
#endif // !USE_SOCKET
......@@ -195,6 +195,11 @@ void PrintProcAddr() {
printf("AddBrandContact 0x%08X\n", (DWORD)AddBrandContact);
printf("SelectData 0x%08X\n", (DWORD)SelectData);
printf("SearchContactByNet 0x%08X\n", (DWORD)SearchContactByNet);
printf("AddChatRoomMember 0x%08X\n", (DWORD)AddChatRoomMember);
printf("DelChatRoomMember 0x%08X\n", (DWORD)DelChatRoomMember);
printf("SetChatRoomAnnouncement 0x%08X\n", (DWORD)SetChatRoomAnnouncement);
printf("SetChatRoomSelfNickname 0x%08X\n", (DWORD)SetChatRoomSelfNickname);
printf("SetChatRoomName 0x%08X\n", (DWORD)SetChatRoomName);
}
BOOL ProcessIsWeChat()
......
......@@ -21,6 +21,13 @@
#include "wechatver.h"
#include "DeleteUser.h"
#include "SendAppMsg.h"
#include "EditRemark.h"
#include "DelChatRoomMember.h"
#include "AddChatRoomMember.h"
#include "SetChatRoomAnnouncement.h"
#include "SetChatRoomSelfNickname.h"
#include "SetChatRoomName.h"
#include "GetChatRoomMemberNickname.h"
using namespace std;
#pragma comment(lib,"version.lib")
......
......@@ -20,9 +20,16 @@ struct WxBaseStruct
DWORD fill2;
WxBaseStruct(wchar_t* pStr) {
buffer = pStr;
length = wcslen(pStr);
maxLength = wcslen(pStr) * 2;
if (pStr) {
buffer = pStr;
length = wcslen(pStr);
maxLength = wcslen(pStr) * 2;
}
else {
buffer = NULL;
length = 0x0;
maxLength = 0x0;
}
fill1 = 0x0;
fill2 = 0x0;
}
......
......@@ -79,8 +79,10 @@ def test_BackupDb():
if __name__ == '__main__':
wx = WeChatRobot()
print([i for i in dir(wx.robot) if '_' not in i and i[0] == 'C'])
print(wx.GetWeChatVer())
interfaces = [i for i in dir(wx.robot) if '_' not in i and i[0] == 'C']
for interface in interfaces:
print(interface)
wx.StartService()
wx.StartReceiveMessage()
wx.StopService()
\ No newline at end of file
......@@ -931,4 +931,137 @@ class WeChatRobot():
成功返回0,失败返回非0值.
"""
return self.robot.CSendAppMsg(wxid,appid)
\ No newline at end of file
return self.robot.CSendAppMsg(wxid,appid)
def EditRemark(self,wxid:str,remark:str or None) -> int:
"""
修改好友或群聊备注
Parameters
----------
wxid : str
wxid或chatroomid.
remark : str or None
要修改的备注.
Returns
-------
int
成功返回0,失败返回非0值.
"""
return self.robot.CEditRemark(wxid,remark)
def SetChatRoomName(self,chatroomid:str,name:str) -> int:
"""
修改群名称.请确认具有相关权限再调用。
Parameters
----------
chatroomid : str
群聊id.
name : str
要修改为的群名称.
Returns
-------
int
成功返回0,失败返回非0值.
"""
return self.robot.CSetChatRoomName(chatroomid,name)
def SetChatRoomAnnouncement(self,chatroomid:str,announcement:str or None) -> int:
"""
设置群公告.请确认具有相关权限再调用。
Parameters
----------
chatroomid : str
群聊id.
announcement : str or None
公告内容.
Returns
-------
int
成功返回0,失败返回非0值.
"""
return self.robot.CSetChatRoomAnnouncement(chatroomid,announcement)
def SetChatRoomSelfNickname(self,chatroomid:str,nickname:str) -> int:
"""
设置群内个人昵称
Parameters
----------
chatroomid : str
群聊id.
nickname : str
要修改为的昵称.
Returns
-------
int
成功返回0,失败返回非0值.
"""
return self.robot.CSetChatRoomSelfNickname(chatroomid,nickname)
def GetChatRoomMemberNickname(self,chatroomid:str,wxid:str) -> str:
"""
获取群成员昵称
Parameters
----------
chatroomid : str
群聊id.
wxid : str
群成员wxid.
Returns
-------
str
成功返回群成员昵称,失败返回空字符串.
"""
return self.robot.CGetChatRoomMemberNickname(chatroomid,wxid)
def DelChatRoomMember(self,chatroomid:str,wxids:str or list or tuple) -> str:
"""
删除群成员.请确认具有相关权限再调用。
Parameters
----------
chatroomid : str
群聊id.
wxids : str or list or tuple
要删除的成员wxid或wxid列表.
Returns
-------
int
成功返回0,失败返回非0值.
"""
return self.robot.CDelChatRoomMember(chatroomid,wxids)
def AddChatRoomMember(self,chatroomid:str,wxids:str or list or tuple) -> str:
"""
添加群成员.请确认具有相关权限再调用。
Parameters
----------
chatroomid : str
群聊id.
wxids : str or list or tuple
要添加的成员wxid或wxid列表.
Returns
-------
int
成功返回0,失败返回非0值.
"""
return self.robot.CAddChatRoomMember(chatroomid,wxids)
\ No newline at end of file
......@@ -107,6 +107,9 @@ CWeChatRobot.exe /unregserver
3. 感谢@shangdev 提供的思路,现在开启hook图片的时会修改自动下载图片时段为全天
## 2022.06.30
1. 已适配3.7.0.30版本
## 2022.07.19
1. 新增修改备注接口
1. 新增群管理功能,包括添加成员、删除成员、设置公告、修改群名称、设置群内个人昵称、获取群成员昵称
# 打赏作者
请给作者一个star,感谢感谢
# 免责声明
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册