想问一下,PP大神,这算法你自己写的?

社区服务
高级搜索
猴岛论坛跑跑卡丁车想问一下,PP大神,这算法你自己写的?
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
35个回复

[寻求解答]想问一下,PP大神,这算法你自己写的?

楼层直达
sprees

ZxID:35237591

等级: 上士
举报 只看楼主 使用道具 楼主   发表于: 2013-12-02 0
非常精妙,如果是你自己写的话,真的该称你一声大神,我自己都自愧不如了。今晚仔细看了一下,这个算法内部很牛逼。真怀疑我是不是应该继续再搞挂了。
  1. int __cdecl Find(int Begin, int Limit, int pdata, int length)
  2. Begin:节区的起始地址,Limit节区去除一个length后的大小
  3. pdata:需要搜索的内容(应该只可以为字符串),length:字符串的长度。
  4. {
  5.   unsigned int offset;
  6.   int readchar;
  7.   int rest;
  8.   signed int nowStart;
  9.   int restspacesize;
  10.   int DataRVA;
  11.   int Buffoffset;
  12.   int result;
  13.   if ( !Begin || !pdata )                       // 如果基址和缓冲区为空
  14.     goto Exit;
  15.   memset32(buffer, length, 256);                // #define memset32(dst,val,count)  \
  16.                                                 // __asm mov edi,dword ptr[dst]     \
  17.                                                 // __asm mov eax,dword ptr[val]    \
  18.                                                 // __asm mov ecx,dword ptr[count]   \
  19.                                                 // __asm rep stosd
  20.                                               //由于每个字节码的最大数为0xFF,所以下方的index绝不会越界
  21.   offset = 0;
  22.   if ( length )
  23.   {
  24.     do
  25.     {
  26.       readchar = *(offset + pdata);             // 获取offset所指向的缓冲区的字符
  27.       rest = length - offset++ - 1;             // 取完字符后每次递增偏移量,并且求出缓冲区剩余长度
  28.       buffer[readchar] = rest;                  // 将剩余长度放入字符下表的缓冲区
  29.     }                                           // 此时缓冲区内只剩下以字符为下标的剩余长度列表
  30.     while ( offset < length );                  // 其实也就是求个取反排序
  31.   }
  32.   nowStart = 1;                                 // 本次搜索的起始RVA
  33.   restspacesize = Limit - length;               // firstrest等于这次搜索后的剩余搜索空间大小
  34.   if ( (Limit - length) >= 1 )                  // 如果所选区段的长度大于搜索内容的长度,则搜索。
  35.   {
  36.     while ( 1 )                                 // 开始搜索
  37.     {
  38.       DataRVA = nowStart - 1;                  
  39.       Buffoffset = nowStart - 1 - nowStart;     // Buffoffset = -1
  40.       if ( Buffoffset + 1 < length )
  41.       {
  42.         do
  43.         {
  44.           if ( *(DataRVA + Begin) != *(Buffoffset + pdata + 1) )
  45.             break;
  46.           ++DataRVA;                            // 如果不对称,则搜索的指针下移一个字节
  47.           Buffoffset = DataRVA - nowStart;      // 下一个RVA减去起始RVA,得到对应的数组元素下表
  48.         }
  49.         while ( DataRVA - nowStart + 1 < length );// 如果本次的RVA未达length末尾,则继续搜索
  50.         restspacesize = Limit - length;         // 到这里已搜索完毕一次字符串空间,再次缩短剩余搜索空间大小
  51.       }
  52.       if ( DataRVA - nowStart + 1 == length )   // 如果RVA已经到达length长度则返回结果
  53.         break;
  54.       nowStart += buffer[*(nowStart + Begin + length - 1)] + 1;// 这里根据上面的剩余字节数取长度为模的补数为下一次上搜索的起始地址,哈哈,此处不好说,不可说。
  55.       if ( nowStart > restspacesize )           // 如果下一次搜索位置大于剩余可搜索空间的话,返回了。结果为-1
  56.         goto Exit;
  57.     }
  58.     result = nowStart - 1;
  59.   }
  60.   else
  61.   {
  62. Exit:  result = -2;
  63.   }
  64.   return result;
  65. }
[ 此帖被sprees在2013-12-02 01:18重新编辑 ]
本帖de评分: 3 条评分 DB +3
DB+1 2013-12-02

C++++看不懂

DB+1 2013-12-02

sunday算法,百度下,算法是别人发明的,代码实现很简单

DB+1 2013-12-02

看不懂,都是大神

sandx

ZxID:28047671

等级: 上将

举报 只看该作者 沙发   发表于: 2013-12-02 0
膜拜大神
sprees

ZxID:35237591

等级: 上士
举报 只看该作者 板凳   发表于: 2013-12-02 0
很棒的算法。
sprees

ZxID:35237591

等级: 上士
举报 只看该作者 地板   发表于: 2013-12-02 0
这些是原代码汇编,修改了一些名字:
.text:10001000 ; int __cdecl Find(int Begin, int Limit, int pdata, int length)
.text:10001000 Find            proc near               ; CODE XREF: sub_100011E0+5Cp
.text:10001000                                         ; sub_100011E0+88p ...
.text:10001000
.text:10001000 Begin           = dword ptr  4
.text:10001000 Limit           = dword ptr  8
.text:10001000 pdata           = dword ptr  0Ch
.text:10001000 length          = dword ptr  10h
.text:10001000
.text:10001000                 push    ebx
.text:10001001                 mov     ebx, [esp+4+Begin]
.text:10001005                 push    ebp
.text:10001006                 push    esi
.text:10001007                 test    ebx, ebx
.text:10001009                 push    edi
.text:1000100A                 jz      loc_100010A7
.text:10001010                 mov     esi, [esp+10h+pdata]
.text:10001014                 test    esi, esi
.text:10001016                 jz      loc_100010A7
.text:1000101C                 mov     ebp, [esp+10h+length]
.text:10001020                 mov     ecx, 100h
.text:10001025                 mov     eax, ebp
.text:10001027                 mov     edi, offset buffer
.text:1000102C                 rep stosd
.text:1000102E                 xor     eax, eax
.text:10001030                 test    ebp, ebp
.text:10001032                 jbe     short loc_1000104A
.text:10001034
.text:10001034 loc_10001034:                           ; CODE XREF: Find+48j
.text:10001034                 mov     ecx, ebp
.text:10001036                 xor     edx, edx
.text:10001038                 mov     dl, [eax+esi]
.text:1000103B                 sub     ecx, eax
.text:1000103D                 dec     ecx
.text:1000103E                 inc     eax
.text:1000103F                 cmp     eax, ebp
.text:10001041                 mov     buffer[edx*4], ecx
.text:10001048                 jb      short loc_10001034
.text:1000104A
.text:1000104A loc_1000104A:                           ; CODE XREF: Find+32j
.text:1000104A                 mov     eax, [esp+10h+Limit]
.text:1000104E                 mov     esi, 1
.text:10001053                 sub     eax, ebp
.text:10001055                 cmp     eax, esi
.text:10001057                 mov     [esp+10h+Begin], eax
.text:1000105B                 jb      short loc_100010A7
.text:1000105D
.text:1000105D loc_1000105D:                           ; CODE XREF: Find+A5j
.text:1000105D                 lea     ecx, [esi-1]
.text:10001060                 mov     edx, ecx
.text:10001062                 sub     edx, esi
.text:10001064                 lea     edi, [edx+1]
.text:10001067                 cmp     edi, ebp
.text:10001069                 jnb     short loc_10001088
.text:1000106B
.text:1000106B loc_1000106B:                           ; CODE XREF: Find+82j
.text:1000106B                 mov     edi, [esp+10h+pdata]
.text:1000106F                 mov     al, [ecx+ebx]
.text:10001072                 cmp     al, [edx+edi+1]
.text:10001076                 jnz     short loc_10001084
.text:10001078                 inc     ecx
.text:10001079                 mov     edx, ecx
.text:1000107B                 sub     edx, esi
.text:1000107D                 lea     eax, [edx+1]
.text:10001080                 cmp     eax, ebp
.text:10001082                 jb      short loc_1000106B
.text:10001084
.text:10001084 loc_10001084:                           ; CODE XREF: Find+76j
.text:10001084                 mov     eax, [esp+10h+Begin]
.text:10001088
.text:10001088 loc_10001088:                           ; CODE XREF: Find+69j
.text:10001088                 sub     ecx, esi
.text:1000108A                 inc     ecx
.text:1000108B                 cmp     ecx, ebp
.text:1000108D                 jz      short loc_100010B1
.text:1000108F                 lea     ecx, [esi+ebx]
.text:10001092                 xor     edx, edx
.text:10001094                 mov     dl, [ecx+ebp-1]
.text:10001098                 mov     ecx, buffer[edx*4]
.text:1000109F                 lea     esi, [esi+ecx+1]
.text:100010A3                 cmp     esi, eax
.text:100010A5                 jbe     short loc_1000105D
.text:100010A7
.text:100010A7 loc_100010A7:                           ; CODE XREF: Find+Aj
.text:100010A7                                         ; Find+16j ...
.text:100010A7                 pop     edi
.text:100010A8                 pop     esi
.text:100010A9                 pop     ebp
.text:100010AA                 mov     eax, 0FFFFFFFEh
.text:100010AF                 pop     ebx
.text:100010B0                 retn
.text:100010B1 ; ---------------------------------------------------------------------------
.text:100010B1
.text:100010B1 loc_100010B1:                           ; CODE XREF: Find+8Dj
.text:100010B1                 lea     eax, [esi-1]
.text:100010B4                 pop     edi
.text:100010B5                 pop     esi
.text:100010B6                 pop     ebp
.text:100010B7                 pop     ebx
.text:100010B8                 retn
.text:100010B8 Find            endp
.text:100010B8
.text:100010B8 ; ---------------------------------------------------------------------------
.text:100010B9                 align 10h
短小而且精悍。
[ 此帖被sprees在2013-12-02 01:19重新编辑 ]
本帖de评分: 1 条评分 DB +1
DB+1 2013-12-02

请不要用外星语交流,这里是跑版555555555555

寒烟如墨丶

ZxID:24183180

等级: 大将
举报 只看该作者 4楼  发表于: 2013-12-02 0
大神…
伸手党滚粗猴岛

ZxID:24104798

等级: 上将
举报 只看该作者 5楼  发表于: 2013-12-02 0
看不懂,都是大神
sprees

ZxID:35237591

等级: 上士
举报 只看该作者 6楼  发表于: 2013-12-02 0
收藏了。
潜水鹦鹉

ZxID:18697553

等级: 元帅
  ☺。热会四队☺。     ☺。大爱跑版☺。

举报 只看该作者 7楼  发表于: 2013-12-02 0
PP大神现在应该睡觉了吧
帮你呼叫
本帖提到的人: @清静梵音
                                             麻麻快救我粗去,我都快吐了
wuli12tou

ZxID:20491181

等级: 中校
举报 只看该作者 8楼  发表于: 2013-12-02 0
回 2楼(sprees) 的帖子
老A的0秒秒杀的有吗?那个看过没?
羽落清商

ZxID:22344404

等级: 大将

举报 只看该作者 9楼  发表于: 2013-12-02 0
大神
nihongnan

ZxID:31904563

等级: 大校
举报 只看该作者 10楼  发表于: 2013-12-02 0
不觉明历
清静梵音

ZxID:19432393

等级: 元帅
分享你我他

举报 只看该作者 11楼  发表于: 2013-12-02 0
sunday算法,百度下,算法是别人发明的,代码实现很简单
泽兮g、

ZxID:24915280

等级: 上将

举报 只看该作者 12楼  发表于: 2013-12-02 0
C++++看不懂
ㄣゞ尐鍢糇︶ㄣ

ZxID:26911001

等级: 大元帅
相爱只是一场意外中的遇见,想念只是一场无言中的承诺!

举报 只看该作者 13楼  发表于: 2013-12-02 0
膜拜大神
qq_1342622947

ZxID:19028973

等级: 中将
不能不能不
举报 只看该作者 14楼  发表于: 2013-12-02 0
本帖de评分: 1 条评分 DB -5
DB-5 2013-12-02

请不要恶意灌水,恶意灌水包括:纯表情、纯数字、纯字母等毫无意义的内容,以及同一内容重复连续发帖。请规范发帖,你会喜欢上猴岛的。

赚小客 

ZxID:28605045

等级: 贵宾

举报 只看该作者 15楼  发表于: 2013-12-02 0
你们这帮大婶
AOT09

ZxID:6443158

等级: 大元帅
                                                           

举报 只看该作者 16楼  发表于: 2013-12-02 0
不明觉厉
老图都去哪儿了

风→_→静

ZxID:25574656

等级: 上将
爱我何在

举报 只看该作者 17楼  发表于: 2013-12-02 0
我要是懂呢么点就好了
へ望っ

ZxID:28368943

等级: 中尉
举报 只看该作者 18楼  发表于: 2013-12-02 0
膜拜大神
zhangzailk

ZxID:27995035

等级: 准尉
举报 只看该作者 19楼  发表于: 2013-12-02 0
高手 云集 啊   !
« 返回列表
发帖 回复