首页 > 编程知识 正文

微信pc加好友,二次转发的名片如何添加

时间:2023-05-04 07:56:16 阅读:51913 作者:2304

文章目录如何自动添加好友分享名片定位和好友call相关思路实现微信加好友call定位和好友call微信加好友call定位微信加好友call验证和好友call微信加好友call分析名片添加call参数的分析后自动添加名片短信代码实现好友分享名片扩展实现自动聊天思路实现好友同意申请思路实现自动收款思路

如何自动添加朋友并共享名片

我的成品微信实现了四个自动系列的功能,自动添加朋友分享名片、自动收款、自动同意朋友的要求、自动聊天。 今天自动添加朋友分享名片的方法。 其他三种功能的想法大致相同。

要实现自动添加朋友共享的名片的功能,首先需要找到添加朋友的呼叫,分析添加朋友所需的参数,在收到朋友的名片推送时,取出这些参数,调用添加朋友的呼叫。 现在,您可以自动添加朋友共享的名片

要决定关于朋友调用的想法,首先考虑一下朋友添加函数背后的编程逻辑。 一定需要传递两个参数。 第一个参数是需要添加朋友的微信,第二个参数是添加朋友时发送给对方的消息。 我们点击发送朋友验证后,就会调用此人的call。

那么,从要添加的朋友的微信开始吧。 首先,在当前窗口中找到添加好友时使用的微信id,访问微信id下的内存,发送好友验证,触发断点,追溯到堆栈,找到添加人的call

微信定位加好友call定位加好友call的微信ID

首先,在CE中搜索删除的朋友的微信ID,并将所有地址添加到下面的地址栏中

然后单击“添加好友验证”,可以看到CE的结果有变化。 这是因为单击可获取客户端当前单击的微信id,将其放入变量中,然后将该变量作为参数传递给函数。 所以我们点击后搜索的结果一定有这个变量。 接下来我们要做的是找到这个变量。

那么我怎么找到这个变量? 通过将下面地址栏中的单击前数据与当前搜索结果中的单击后数据进行比较,可以找到作为参数传递给添加者call的微信id。

在该在线文本比较网站http://www.jq22.com/text difference上,输入点击前和点击后的数据(a为点击前,b为点击后),可以筛选两组数据中的不同之处需要找到点击后的数据中的地址,点击前的数据中没有的地址。

在这里,我点击找到了两个不同的地址。 然后,直接在CE上搜索这两个地址,以确定哪个地址保存了这两个地址

从搜索结果中可以看到,第一个地址已经是另一个字符串,第二个地址是用指针保存的。 因此,可以确认该地址是我们希望接收的添加者call的微信id的地址。 哈哈,这一步需要一点耐心。 我也找了好几次才找到。

微信添加朋友call使用OD添加微信,在找到的微信ID地址下点击内存访问断点,然后点击ok。 中断点此时断开,删除内存访问中断点

在这里,看到堆栈内第二个回复地址中有添加的朋友的微信id,这里很可能是我们要找的添加者的call

验证朋友的呼叫,我们在这里去下一个突破点。 然后,执行F9,使程序再次在该位置中断

此时,我们将修改此微信id,如果此时添加的微信没有收到添加朋友的消息,则表明此呼叫是我们需要的呼叫

执行了F9,表示由于对方的隐私设定,无法添加到通讯录中。 说明这个呼叫是我们要找的朋友的呼叫

微信好友呼叫分析好友呼叫参数分析

ebx指向微信的结构体,该结构体有5个成员

中间这个汇编指令mov dword ptr ss:[ebp-0xE0]可以由esp经过测试而不需要写入。

然后,这一句将0xFFFFFFFF推入堆栈,即-1。 但是,我们没有找到向这个call所在的寄存器添加朋友时发送的消息。 这个结构体必须找到,所以我们继续分析其上的call

上面的呼叫传达了消息的内容,没有得到消息的结构,所以继续分析这个呼叫上面的呼叫

一步步追溯这个函数,这里会推送6。 此参数表示添加的通道,组和朋友为6,组内和朋友为e,名片推送为0x11

另外,这个call在编写和调用代码时很麻烦,需要同时调用6个call。 6个呼叫中的任意一个减少都会导致微信崩溃

添加名片的call参数微信添加朋友的名片call和添加朋友使用相同的call,区别只有两点。 点击添加朋友共享的名片,让程序中断。

区别一方

这个地方传了0x11,不是6了

区别2

V1结构进入这个地方,不再是微信的结构。 V1的结构体在收到名片推送消息时,可以从消息结构体获得。

分析了名片消息和收到朋友的呼叫。 我们已经找到了。 然后呢

已经知道需要传入哪些数据,那么下一步就是去接收名片消息的地方,去拿到这些数据。

直接来到接收消息的地方,至于怎么找到接收消息的call,请看我上一篇文章

https://blog.csdn.net/qq_38474570/article/details/93339861

这里直接给出偏移2.6.8.52版本的接收消息的偏移是0x315E98

直接来到接收消息的地方,在这里下断点,然后用小号分享一个名片,让程序断下

程序断下后,我们查看[[esp]]里面的内容,这里面保存了接收到的消息参数,往下拉

这里有消息发送者的微信ID和xml格式的消息内容

数据窗口跟随进去,里面有我们需要的V1数据,至于其他的数据我们并不关心。OK,分析到这里,自动添加好友分享的名片基本也就完成了。接下来贴代码

代码实现自动添加好友分享名片

第一步 取出V1数据 我这里用的是字符串查找和匹配的方法,你们可以xml解析库来解析数据

void AutoAddCardUser(wstring msg){//拿到V1int v1strat = msg.find(L"v1_");int v1end = msg.find(L"@stranger");wstring v1;v1 = msg.substr(v1strat, v1end - v1strat + 9);//调用添加名片好友函数AddCardUser((wchar_t*)v1.c_str(), (wchar_t*)L"快通过~快通过~ 吼吼!");}

第二步 调用call添加好友

void AddCardUser(wchar_t* v1, wchar_t* msg){DWORD dwWeChatWinAddr = (DWORD)GetModuleHandle(L"WeChatWin.dll");DWORD dwParam1 = dwWeChatWinAddr + WxAddWxUserParam1;DWORD dwCall1 = dwWeChatWinAddr + WxAddWxUserCall1;DWORD dwCall2 = dwWeChatWinAddr + WxAddWxUserCall2;DWORD dwCall3 = dwWeChatWinAddr + WxAddWxUserCall3;DWORD dwCall4 = dwWeChatWinAddr + WxAddWxUserCall4;DWORD dwCall5 = dwWeChatWinAddr + WxAddWxUserCall5;struct TextStruct{wchar_t* pStr;int strLen;int strMaxLen;};TextStruct pV1 = { 0 };pV1.pStr = v1;pV1.strLen = wcslen(v1) + 1;pV1.strMaxLen = (wcslen(v1) + 1) * 2;char* asmV1 = (char*)&pV1.pStr;char buff3[0x100] = { 0 };char* buff = buff3;__asm{sub esp, 0x18;mov ecx, esp;mov dword ptr ss : [ebp - 0xDC], esp;push dwParam1;call dwCall1;sub esp, 0x18;mov eax, buff;mov dword ptr ss : [ebp - 0xE4], esp;mov ecx, esp;push eax;call dwCall2;push 0x11;sub esp, 0x14;mov ecx, esp;mov dword ptr ss : [ebp - 0xE8], esp;push - 0x1;mov edi, msg;push edi;call dwCall3;push 0x2;sub esp, 0x14;mov ecx, esp;mov dword ptr ss : [ebp - 0xE0], esp;mov ebx, asmV1;push ebx;call dwCall4;mov ecx, eax;call dwCall5;}} 拓展 实现自动聊天思路

首先在好友消息的时候保存一下好友的微信ID,然后调用获取到好友的消息内容,并且将消息内容转发给图灵机器人的公众号


接着拿到图灵机器人回复的内容,将内容转发给好友

这样就实现了自动聊天

实现自动同意好友请求思路

我们在接收消息的地方下个断点,让好友发送请求时断下,并且查看[[esp]]里的消息内容

这里保存有两个重要的数据,一个是V1,一个是V2,我们只要在这个地方取出V1和V2,然后调用同意好友请求的call,就能实现自动同意好友请求

同意好友请求的call,我这里直接给出偏移 微信2.6.8.52版本

#define WxAgreeUserRequestCall1 0x1865B0; //同意好友请求#define WxAgreeUserRequestCall2 0x4F4F0; //同意好友请求#define WxAgreeUserRequestCall3 0xCE4F0; //同意好友请求#define WxAgreeUserRequestCall4 0x16BD40; //同意好友请求#define WxAgreeUserRequestParam 0x126E050; //同意好友请求

这里需要同时调用4个call,接着附上代码

//取出V1和V2void AutoAgreeUserRequest(wstring msg){int v1strat = msg.find(L"v1_");int v1end = msg.find(L"@stranger");wstring v1;v1 = msg.substr(v1strat, v1end - v1strat + 9);//找到v2int v2strat = msg.find(L"v2_");int v2end = msg.rfind(L"@stranger");wstring v2;v2 = msg.substr(v2strat, v2end - v2strat + 9);//调用同意好友请求的callAgreeUserRequest((wchar_t*)v1.c_str(), (wchar_t*)v2.c_str());} //调用同意好友请求callvoid AgreeUserRequest(wchar_t* v1, wchar_t* v2){struct v1Info{int fill = 0;wchar_t* v1 = 0;int v1Len;int maxV1Len;char fill2[0x41C] = { 0 };DWORD v2 = { 0 };};struct v2Info{char fill[0x24C] = { 0 };DWORD fill3 = 0x25;char fill4[0x40] = { 0 };wchar_t* v2;int v2Len;int maxV2Len;char fill2[0x8] = { 0 };};DWORD base = (DWORD)LoadLibrary(L"WeChatWin.dll");DWORD callAdd1 = base + WxAgreeUserRequestCall1;DWORD callAdd2 = base + WxAgreeUserRequestCall2;DWORD callAdd3 = base + WxAgreeUserRequestCall3;DWORD callAdd4 = base + WxAgreeUserRequestCall4;DWORD params = base + 0x126E050;DWORD* asmP = (DWORD*)params;v1Info userInfoV1 = { 0 };v2Info userInfoV2 = { 0 };userInfoV1.v2 = (DWORD)&userInfoV2.fill;userInfoV1.v1 = v1;userInfoV1.v1Len = wcslen(v1);userInfoV1.maxV1Len = wcslen(v1) * 2;userInfoV2.v2 = v2;userInfoV2.v2Len = wcslen(v2);userInfoV2.maxV2Len = wcslen(v2) * 2;char* asmUser = (char*)&userInfoV1.fill;char buff[0x14] = { 0 };char buff2[0x48] = { 0 };char* asmBuff = buff2;__asm{mov ecx, asmUser;push 0x6;sub esp, 0x14;push esp;call callAdd1;mov ecx, asmUser;lea eax, buff;push eax;call callAdd2;mov esi, eax;sub esp, 0x8;mov ecx, asmP;call callAdd3;mov ecx, asmBuff;mov edx, ecx;push edx;push eax;push esi;call callAdd4;}} 实现自动收款思路

同样在接收消息的地方下个断点,接收转账消息,并且查看[[esp]]里的消息内容

这里重要的数据只有一个,就是这个transferid,拿到这个转账ID和微信ID,然后调用收款的call,就能实现自动收款了

这里提供收款call的偏移,微信2.6.8.52版本

#define WxCllectMoneyCall1 0x676B10//收款#define WxCllectMoneyCall2 0x676B90//收款

接着附上代码

//取出转账IDvoid AutoCllectMoney(wstring msg,wchar_t* wxid){// 找到<transferid>字符串的位置int pos1 = msg.find(L"<transferid>");//找到]]></transferid>字符串的位置int pos2 = msg.find(L"]]></transferid>");//取出多余的字符串长度wstring noneed = L"<transferid><![CDATA[";int noneedLen = noneed.length();//取出转账IDwstring transferid;transferid = msg.substr(pos1 + noneedLen, (pos2 - pos1) - noneedLen);//调用收款call 实现自动收款CllectMoney((wchar_t*)transferid.c_str(), wxid);} //调用收款callvoid CllectMoney(wchar_t* transferid, wchar_t* wxid){struct CllectMoneyStruct{wchar_t* ptransferid;int transferidLen;int transferidMaxLen;char full[0x8] = { 0 };wchar_t* pwxid;int wxidLen;int wxidMaxLen;char full2[0x8] = { 0 };};CllectMoneyStruct cllect;cllect.ptransferid = transferid;cllect.transferidLen = wcslen(transferid) + 1;cllect.transferidMaxLen = (wcslen(transferid) + 1) * 2;cllect.pwxid = wxid;cllect.wxidLen = wcslen(wxid) + 1;cllect.wxidMaxLen = (wcslen(wxid) + 1) * 2;char* asmBuff = (char*)&cllect.ptransferid;DWORD dwWeChatWinAddr = (DWORD)GetModuleHandle(L"WeChatWin.dll");DWORD dwCall1 = dwWeChatWinAddr + WxCllectMoneyCall1;DWORD dwCall2 = dwWeChatWinAddr + WxCllectMoneyCall2;__asm{sub esp, 0x30;mov ecx, esp;mov eax, asmBuff;push eax;call dwCall1;call dwCall2;add esp, 0x30;}}

最后附上Github地址,还请亲们帮忙点个star

https://github.com/TonyChen56/WeChatRobot

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。