首页
社区
课程
招聘
[求助] 大家看看我反编译是否正确请 指教啊 肯定有错的
发表于: 2009-6-7 02:46 4024

[求助] 大家看看我反编译是否正确请 指教啊 肯定有错的

2009-6-7 02:46
4024
//---这个是我反编译的程序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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
mov     esi, dword ptr [edi+8]     
0050BA1D    8D4C24 10       lea     ecx, dword ptr [esp+10]   
0050BA21    51              push    ecx                        
0050BA22    B9 02000000     mov     ecx, 2                     
0050BA27    2BCA            sub     ecx, edx                  
0050BA29    8D543A 30       lea     edx, dword ptr [edx+edi+30]
0050BA2D    52              push    edx                        
0050BA2E    8D47 0C         lea     eax, dword ptr [edi+C]     
0050BA31    55              push    ebp                        
0050BA32    896C24 1C       mov     dword ptr [esp+1C], ebp   
0050BA36    E8 55FBFFFF     call    0050B590      这里在调用拉            
0050BA3B    83C4 0C         add     esp, 0C
2009-6-7 02:49
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
3
LZ想说什么?
2009-6-7 03:04
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
哦,这个是我调试别人的程序。现在分析的代码是这个程序的收包发包函数
我自己写的那个NetDeal()函数是根据汇编代码写的。是第一个反编译代码 肯定有很多
不正确的地方 我也有几个地方不知道怎么分析 汇编代码中都有注释  看看是不是有不正确的地方啊
比如:0050B59D    8BF9            mov     edi, ecx          //后面recv函数调用第2个参数是 edi证明是buffer最大长度
因为这里不是参数传进buffer 最大长度 在这里可以推理出ecx因该表示为一个全局变量吧?(函数外部的变量,)其值是buffer最大长度 不知道对不对  ,
2009-6-7 07:22
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
5
-1 = INVALID_SOCKET
WSAGetLastError()==4 , 看一下对应头文件
cmp     dword ptr [eax], -1 , 这应该 *psocket == INVALID_SOCKET 判断 .

其他的, 都不是什么问题.
2009-6-7 08:27
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
O  这个原来是这样啊 谢谢啊
我查询了  #define SOCK_RDM        4               /* reliably-delivered message */
表示 可靠消息传送的
2009-6-7 09:37
0
游客
登录 | 注册 方可回帖
返回
//