首页
社区
课程
招聘
麻烦看一下下面这个函数有可能完成什么功能?
发表于: 2010-3-17 21:49 3430

麻烦看一下下面这个函数有可能完成什么功能?

2010-3-17 21:49
3430
该函数传入的参数为一个结构或者对象(我猜的,如果不对请指正),内容为:
0146f088  ff ff ff ff 08 00 00 00-ff ff ff ff 08 00 00 00                 ................
0146f098  1b 01 05 00 61 61 61 61-61 61 61 61 00 00 00 00  ....aaaaaaaa....
0146f0a8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0146f0b8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0146f0c8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0146f0d8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0146f0e8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0146f0f8  00 00 00 00 00 00 00 00-00 00 00 00 fb 38 d5 a1  .............8..

.text:100088E0 sub_100088E0    proc near            
.text:100088E0
.text:100088E0 arg_0           = dword ptr  4
.text:100088E0
.text:100088E0                 mov     edx, [esp+arg_0]
.text:100088E4                 xor     eax, eax
.text:100088E6                 mov     al, byte_10064C89 // al = 0
.text:100088EB                 sub     edx, eax
.text:100088ED                 mov     eax, dword_10064A84
.text:100088F2                 sub     edx, 4
.text:100088F5                 cmp     edx, eax
.text:100088F7                 jb      short loc_1000891A
.text:100088F9                 cmp     edx, dword_10064A8C
.text:100088FF                 ja      short loc_1000891A
.text:10008901                 sub     edx, eax
.text:10008903                 xor     ecx, ecx
.text:10008905                 mov     cx, word_10064C8C
.text:1000890C                 mov     eax, edx
.text:1000890E                 shr     eax, cl
.text:10008910                 push    esi
.text:10008911                 mov     esi, eax
.text:10008913                 shl     esi, cl
.text:10008915                 cmp     esi, edx
.text:10008917                 pop     esi
.text:10008918                 jz      short locret_1000891E
.text:1000891A
.text:1000891A loc_1000891A:                          
.text:1000891A                 or      ax, 0FFFFh
.text:1000891E
.text:1000891E locret_1000891E:                     
.text:1000891E                 retn
.text:1000891E sub_100088E0    endp

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
万能的f5~~
2010-3-17 21:53
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
怎么没人帮着解答呢,是信息不够吗?
2010-3-18 08:10
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我汗,我以为是C之类的,原来全汇编的哇!杯具的路过!
2010-3-18 08:35
0
雪    币: 417
活跃值: (66)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
支持一下吧. ....
2010-3-18 08:52
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
.text:100088E0 sub_100088E0 proc near
.text:100088E0
.text:100088E0 arg_0 = dword ptr 4 ;就一个参数,先猜测是指向某个结构体的指针
.text:100088E0
.text:100088E0 mov edx, [esp+arg_0]
.text:100088E4 xor eax, eax
.text:100088E6 mov al, byte_10064C89 // al = 0 ;是赋值为0?
.text:100088EB sub edx, eax ;那这句就没干啥正事嘛
.text:100088ED mov eax, dword_10064A84 ;继续赋值
.text:100088F2 sub edx, 4 ;减4,更加确定是指针,指向前一个值?
.text:100088F5 cmp edx, eax ;跟上面的那个常量比较
.text:100088F7 jb short loc_1000891A ;小于就返回-1
.text:100088F9 cmp edx, dword_10064A8C ;再跟另一个常量比较
.text:100088FF ja short loc_1000891A ;大于就返回-1
.text:10008901 sub edx, eax ;减去那个常量
.text:10008903 xor ecx, ecx
.text:10008905 mov cx, word_10064C8C ;又赋值了……
.text:1000890C mov eax, edx __
.text:1000890E shr eax, cl \
.text:10008910 push esi \
.text:10008911 mov esi, eax ;这几句好诡异
.text:10008913 shl esi, cl /
.text:10008915 cmp esi, edx ;应该相等吧,不相等的情况……貌似只能说明cl太大了,这到底是干什么的?请大牛指教,哪个语句会被优化成这样?
.text:10008917 pop esi
.text:10008918 jz short locret_1000891E ;相等就返回shr eax,cl,否则返回-1
.text:1000891A
.text:1000891A loc_1000891A:
.text:1000891A or ax, 0FFFFh
.text:1000891E
.text:1000891E locret_1000891E:
.text:1000891E retn ;很显然,不是stdcall,ecx被初始化,也不是thiscall,不是fastcall
.text:1000891E sub_100088E0 endp

重写一下,
unknow * __cdecl func(unknow *ptr)
{
         ptr -= byte_10064C89;
         if(((ptr-4) >= dword_10064A84) && ((ptr-4) =< dword_10064A8C))
         {
                ptr -= dword_10064A84;
                //下面这一句到底是那条语句优化来的,恳请大牛指点
                //我就直译了……
                if(((ptr >> word_10064C8C)<<word_10064C8C) == ptr)
                {
                         return (((ptr >> word_10064C8C)<<word_10064C8C));
                }
          }
           return -1;
}
2010-3-18 09:01
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
text:100088E0 sub_100088E0    proc near            
.text:100088E0
.text:100088E0 arg_0           = dword ptr  4
.text:100088E0
.text:100088E0                 mov     edx, [esp+arg_0]
.text:100088E4                 xor     eax, eax
.text:100088E6                 mov     al, byte_10064C89 // al = 0
.text:100088EB                 sub     edx, eax
.text:100088ED                 mov     eax, dword_10064A84
.text:100088F2                 sub     edx, 4                        ;到此为止,edx = arg_0 - byte_10064C89 - 4
.text:100088F5                 cmp     edx, eax
.text:100088F7                 jb      short loc_1000891A            ;如果 arg_0 - byte_10064C89 - 4 大于 dword_10064A84 (无符号比较) 则跳
.text:100088F9                 cmp     edx, dword_10064A8C
.text:100088FF                 ja      short loc_1000891A            ;如果 arg_0 - byte_10064C89 - 4 小于 dword_10064A8C (无符号比较) 则跳
                                                                     ;这里请注意,两个比较的地址是只间隔一个DWORD的地址
.text:10008901                 sub     edx, eax                      ;edx = arg_0 - byte_10064C89 - 4 - dword_10064A84
.text:10008903                 xor     ecx, ecx
.text:10008905                 mov     cx, word_10064C8C
.text:1000890C                 mov     eax, edx                      ;eax = edx = arg_0 - byte_10064C89 - 4 - dword_10064A84
.text:1000890E                 shr     eax, cl                       ;eax = eax >> word_10064C8C
.text:10008910                 push    esi
.text:10008911                 mov     esi, eax
.text:10008913                 shl     esi, cl                       ;esi = arg_0 - byte_10064C89 - 4 - dword_10064A84 >> word_10064C8C << word_10064C8C
.text:10008915                 cmp     esi, edx
.text:10008917                 pop     esi
.text:10008918                 jz      short locret_1000891E         ;判断esi 是否 等于 edx 也就是arg_0 - byte_10064C89 - 4 - dword_10064A84
                                                                     ;实际上就是判断最低的几位(cl中的值)是否为0
.text:1000891A
.text:1000891A loc_1000891A:                          
.text:1000891A                 or      ax, 0FFFFh
.text:1000891E
.text:1000891E locret_1000891E:                     
.text:1000891E                 retn
.text:1000891E sub_100088E0    endp
2010-3-18 09:03
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
请问ls,“实际上就是判断最低的几位(cl中的值)是否为0”,此句何解?先多谢指教。
2010-3-18 09:14
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
多谢楼上们的帮助。

场景是这样的:在尝试破解一个软件,跟踪到输入的用户名和注册码被保存到一个结构中,接着指向这个结构的指针被传入上面的函数(感觉是做了某种校验),返回值不是-1。继续跟着,后面的函数调用还有很多,目前还没有找到验证注册码的地方。好多函数的功能都看不懂了。
2010-3-18 09:17
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
实际上就是判断最低的几位是否为0,具体是几位,就是cl中的值
2010-3-18 09:18
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
对于楼主,我只能告诉你,只有通过写插件来分析数据才可以轻松解决这一问题,不然就一句一句看,然后做笔记
2010-3-18 09:19
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
To liuyq:
    写插件分析数据,是指分析程序执行过程中遇到的数据是怎么变化的吗?还是其他的?大概如何分析数据?还请不吝指教。
2010-3-18 09:26
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
遇到的数据是怎么变化
2010-3-18 09:32
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
多谢liuyq,我明白了。先右移丢掉几位,然后左移回来(右边补0),如果相等那就说明补上的那几位原本就是0。
哈哈,good game。
那这个判断应该是这样写的:
if(!((ptr-4)&0x0007))      //判断后三位是否为0

ps.刚才宿舍停电了,囧
2010-3-18 11:02
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
多谢各位的热情帮助。
2010-3-18 12:22
0
游客
登录 | 注册 方可回帖
返回
//