//---这个是我反编译的程序NetDeal(int sign,char *buffer,int *plen)--------------------------
//对应的汇编代码在最下面 希望高手帮我看看 哪些地方错了 帮我解决下面的问题 谢谢
//不知道socket是否因该是个全局的变量呢
//比较 socket == -1 代表什么意思呢
//WSAGetLastError()==4这个是什么错误啊 不解
//有的寄存器直接传值进函数代表的什么呢 是不是全局变量呢 这种我感到老火哦
//比如 0050B59D 8BF9 mov edi, ecx
//后面看来edi表示的是buffer最大长度
//这个buffer最大长度因该是全局变量吧?不知道对不对
int CallB520() //这个是哪个 防止阻塞的函数不管他
{}
int CallB4B0() //这个是哪个 防止阻塞的函数不管他
{}
char buffer[100];
int g_ilen = 100;
SOCKET g_sock;
int NetDeal(int sign,char *buffer,int *plen)
{
int m_iValue = -1; //存返回值
int m_iUnkSendCall,m_iUnkRecvCall; //分别记录 CallB520 的返回值
int tmplen; //存 收发包函数的返回值 字符长度
int len = g_ilen; //代表buffer还有多少剩余空间
if(g_sock != -1 && buffer != NULL && len > 0)
{
while(true)
{
//如果buffer剩余空间没了就 跳出
if(len <= 0)
{
m_iValue = 1;
break;
}
if(sign != 0)
{
m_iUnkSendCall = CallB520(); //这个是哪个 防止阻塞的函数不管他
if(m_iUnkSendCall == 0)
{
m_iValue = 0;
break;
}
else if(m_iUnkSendCall >= 0)
{
tmplen = send(g_sock,buffer,len,0);
}
else
{
//我检查了MSDN 但是没发现 为4是什么错误啊
if(WSAGetLastError()==4)
{
continue;
}
else
{
break;
}
}
}
else
{
m_iUnkRecvCall = CallB4B0(); //这个是哪个 防止阻塞的函数不管他
if(m_iUnkRecvCall == 0)
{
m_iValue = 0;
break;
}
else if(m_iUnkRecvCall >= 0)
{
tmplen = recv(g_sock,buffer,len,0);
}
else
{
//我检查了MSDN 但是没发现 为4是什么错误啊
if(WSAGetLastError()==4)
{
continue;
}
else
{
break;
}
}
}
if(tmplen > 0)
{
buffer = buffer + tmplen;
len = len + tmplen;
continue;
}
if(WSAGetLastError()!=4)
{
break;
}
}
}
if(plen != NULL)
{
*plen = len;
}
return m_iValue;
}
//------------------对应的汇编代码0================
//////////////////////
///////////////////////////////////////////////////////////
0050B590 51 push ecx
0050B591 53 push ebx
0050B592 55 push ebp
0050B593 8B6C24 14 mov ebp, dword ptr [esp+14] //参数2传入ebp =edx+edi+30
0050B597 33DB xor ebx, ebx
0050B599 8338 FF cmp dword ptr [eax], -1 // 这句表示什么啊 高手指教啊 还有就是这个EAX是寄存器传参数还是全局变量怎么辨别啊
0050B59C 57 push edi
0050B59D 8BF9 mov edi, ecx //后面看来edi表示的是buffer最大长度
//这个buffer最大长度因该是全局变量吧?不知道对不对
0050B59F C74424 0C FFFFF>mov dword ptr [esp+C], -1 //返回值初始化
0050B5A7 74 02 je short 0050B5AB
0050B5A9 8BD8 mov ebx, eax
0050B5AB 83FE FF cmp esi, -1 //因该是全局变量socket吧 -1跳出 socket为-1表示什么意思
0050B5AE 0F84 90000000 je 0050B644
0050B5B4 85ED test ebp, ebp //如果参数2 == 0 跳出 bufer为空
0050B5B6 0F84 88000000 je 0050B644
0050B5BC 85FF test edi, edi //如果edi <= 0 跳出 buffer长度,<=0跳出
0050B5BE 0F8E 80000000 jle 0050B644
0050B5C4 85FF test edi, edi //如果edi <=0 跳出 这里是循环点开头
0050B5C6 7E 74 jle short 0050B63C
0050B5C8 837C24 14 00 cmp dword ptr [esp+14], 0 //参数1 - 0
0050B5CD 8BD3 mov edx, ebx //貌似没用 也可能是给0050B520函数寄存器传参数
0050B5CF 8BCE mov ecx, esi
0050B5D1 74 25 je short 0050B5F8 //如果参数1==0 跳到recv函数前
0050B5D3 E8 48FFFFFF call 0050B520 //是一个防止阻塞的函数 就命名为 CallB520();
0050B5D8 85C0 test eax, eax
0050B5DA 74 56 je short 0050B632 //==0跳出去
0050B5DC 7D 0D jge short 0050B5EB //>=0跳到发包
0050B5DE FF15 ACA86600 call dword ptr [<&WS2_32.#111>] ; WS2_32.WSAGetLastError
0050B5E4 83F8 04 cmp eax, 4
0050B5E7 ^ 74 DB je short 0050B5C4 //==0跳到上面循环点
0050B5E9 EB 59 jmp short 0050B644 //无条件 跳出去
0050B5EB 6A 00 push 0
0050B5ED 57 push edi
0050B5EE 55 push ebp
0050B5EF 56 push esi
0050B5F0 FF15 B8A86600 call dword ptr [<&WS2_32.#19>] ; WS2_32.send
0050B5F6 EB 23 jmp short 0050B61B
0050B5F8 E8 B3FEFFFF call 0050B4B0 //是一个防止阻塞的函数 就命名为 CallB4B0();
0050B5FD 85C0 test eax, eax
0050B5FF 74 31 je short 0050B632 //==0跳出去
0050B601 7D 0D jge short 0050B610 //>=0跳到收包
0050B603 FF15 ACA86600 call dword ptr [<&WS2_32.#111>] ; WS2_32.WSAGetLastError
0050B609 83F8 04 cmp eax, 4
0050B60C ^ 74 B6 je short 0050B5C4 //==0跳到上面
0050B60E EB 34 jmp short 0050B644 //无条件 跳出去
0050B610 6A 00 push 0
0050B612 57 push edi
0050B613 55 push ebp
0050B614 56 push esi
0050B615 FF15 A8A86600 call dword ptr [<&WS2_32.#16>] ; WS2_32.recv
0050B61B 85C0 test eax, eax // 检查发包和收包是否成功
0050B61D 7F 0D jg short 0050B62C
0050B61F FF15 ACA86600 call dword ptr [<&WS2_32.#111>] ; WS2_32.WSAGetLastError
0050B625 83F8 04 cmp eax, 4
0050B628 ^ 74 9A je short 0050B5C4
0050B62A EB 18 jmp short 0050B644
0050B62C 03E8 add ebp, eax
0050B62E 2BF8 sub edi, eax
0050B630 ^ EB 92 jmp short 0050B5C4
0050B632 C74424 0C 00000>mov dword ptr [esp+C], 0 设置返回值是0还是1
0050B63A EB 08 jmp short 0050B644
0050B63C C74424 0C 01000>mov dword ptr [esp+C], 1
0050B644 8B4424 1C mov eax, dword ptr [esp+1C] //函数末尾 准备返回
0050B648 85C0 test eax, eax
0050B64A 74 02 je short 0050B64E
0050B64C 8938 mov dword ptr [eax], edi
0050B64E 8B4424 0C mov eax, dword ptr [esp+C]
0050B652 5F pop edi
0050B653 5D pop ebp
0050B654 5B pop ebx
0050B655 59 pop ecx
0050B656 C3 retn
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课