首页
社区
课程
招聘
[求助]代码分析
发表于: 2014-6-12 14:17 4635

[求助]代码分析

2014-6-12 14:17
4635
各位帮忙看看这段代码什么意思,没搞明白

001217a7 55              push    ebp
001217a8 8bec            mov     ebp,esp
001217aa 52              push    edx
001217ab 53              push    ebx
001217ac 8b5508          mov     edx,dword ptr [ebp+8]
001217af 33c0            xor     eax,eax
001217b1 f7d0            not     eax
001217b3 3202            xor     al,byte ptr [edx]
001217b5 b308            mov     bl,8
001217b7 d1e8            shr     eax,1
001217b9 7305            jae     001217c0
001217bb 352083b8ed      xor     eax,0EDB88320h
001217c0 fecb            dec     bl
001217c2 75f3            jne     001217b7
001217c4 803a00          cmp     byte ptr [edx],0
001217c7 7403            je      001217cc
001217c9 42              inc     edx
001217ca ebe7            jmp     001217b3
001217cc f7d0            not     eax
001217ce 5b              pop     ebx
001217cf 5a              pop     edx
001217d0 c9              leave
001217d1 c20400          ret     4

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 89
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
连个悬赏都不发吗?
2014-6-12 14:20
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
0EDB88320h  这个number 来看。 估计是CRC32
2014-6-12 14:25
0
雪    币: 35
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看你回复的水平怎么样了
2014-6-12 15:28
0
雪    币: 35
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看你回复的水平怎么样了
2014-6-12 15:40
0
雪    币: 39
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
牛掰。。。
2014-6-12 15:56
0
雪    币: 39
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
楼主这态度 想帮的也会到此停止
2014-6-12 15:58
0
雪    币: 35
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
对不起啊,大牛。
帮一下忙吗
2014-6-12 17:18
0
雪    币: 230
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
应该是计算参数指向字符串的 CRC32 吧
2014-6-13 09:48
0
雪    币: 35
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
crc32的源文件
===========================分割线===========================
#include <stdio.h>
#include "crc32.h"

static uint   CRC32[256];
static char   init = 0;

//初始化表
static void init_table()
{
    int   i,j;
    uint   crc;
    for(i = 0;i < 256;i++)
    {
         crc = i;
        for(j = 0;j < 8;j++)
        {
            if(crc & 1)
            {
                 crc = (crc >> 1) ^ 0xEDB88320;
            }
            else
            {
                 crc = crc >> 1;
            }
        }
         CRC32[i] = crc;
    }
}

//crc32实现函数
uint crc32( uchar *buf, int len)
{
    uint ret = 0xFFFFFFFF;
    int   i;
    if( !init )
    {
         init_table();
         init = 1;
    }
    for(i = 0; i < len;i++)
    {
         ret = CRC32[((ret & 0xFF) ^ buf[i])] ^ (ret >> 8);
    }
     ret = ~ret;
    return ret;
}
2014-6-13 09:54
0
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
帮你把汇编逆向了 :)
这是一个字符串校验的函数,编码思路大体和楼上代码相同,不过很显然,作者融入了一些编码技巧

//代码中有取最后一位的操作
//感觉用联合体写看起来比较直观
union U1{
        UINT buf;
        char a[4];
};

UINT validFunc(char *p1)
{

        char *ptmp1 = p1;
        U1 tmp2;
        tmp2.buf = 0;//eax
        tmp2.buf = -1;
         
        //for(int i1 = 0;p1[i1] != 0 ; i1++) //这样逆比较好看,不过漏了最后一个0没处理 - -,所以用do-while了
        int i1 = -1;
        do
        {
                i1++;
                tmp2.a[0] = tmp2.a[0] ^ p1[i1];//这里
                for (int i2 = 0; i2 < 8; i2++)
                {
                        //最后一位bit
                        UCHAR t1 = tmp2.a[0] & 1;
                        if (t1 > 0)
                        {
                                tmp2.buf = tmp2.buf >> 1;
                                tmp2.buf = tmp2.buf ^ 0x0EDB88320;
                        } else {

                                tmp2.buf = tmp2.buf >> 1;
                        }

                }

        } while (p1[i1] != 0) ;

        //tmp2 = !tmp2;
        tmp2.buf = ~tmp2.buf;// = tmp2.buf;
        return tmp2.buf;
}

int _tmain(int argc, _TCHAR* argv[])
{

        char *a = "hello!";
        UINT a1 = validFunc(a);
}
2014-6-15 15:22
0
游客
登录 | 注册 方可回帖
返回
//