首页
社区
课程
招聘
[转帖]在天草论坛上发现的一个CM
发表于: 2009-3-19 22:17 7528

[转帖]在天草论坛上发现的一个CM

2009-3-19 22:17
7528
  呵呵,这是今天在天草论坛上发现的一个CM,用VC2005编写的。大家一起来练习吧。
  算法比较复杂,用到了多线程,但是追码却很简单。哪位高手能教程一下呢?

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 295
活跃值: (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
再复杂也没用

在这里明码比较

/*40192D*/  CMP EAX,DWORD PTR DS:[EBX+78]
2009-3-20 10:38
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
3
呵呵,难道我没说追码很容易吗,但是分析算法呢?
2009-3-20 12:50
0
雪    币: 1262
活跃值: (770)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
算法是取文件的创建时间,系统时间等,呵呵。天草论坛,我想要其他兄弟也研究下,所以我没写过程。过几天我补上。
2009-3-21 20:59
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
5
  
  在文件一开始就是一个CALL,跟踪发现的确是取文件的创建时间,系统时间等,这很可能是VC2005的某个特征,亦或是作者故意这么做来迷惑大家的么,还是用于反调试的某个手段,这不得而知,如有高手知晓,还望直言。
  
     中午又仔细分析了一下,已经得到算法:在关键算法处并没有发现取文件创建时间的部分,可能是你记成另外一个CM了吧。以下是个人的分析,请大侠们批评指正,本人虚心接受。
  现公布算法一部分如下:

004018F6  |.  E8 95FEFFFF   call    00401790                         ;  x=MAC地址前8位。如,MAC地址为 00-16-EC-B4-01-A9,则 x=B4EC1600

004018FB  |.  8BF8          mov     edi, eax
004018FD  |.  E8 0EFDFFFF   call    00401610                         ;  y=CPUID(eax=1)时edx的值
00401902  |.  8BF0          mov     esi, eax
00401904  |.  E8 B7FDFFFF   call    004016C0                         ;  z=C盘序列号
00401909  |.  56            push    esi                              ;  y
0040190A  |.  57            push    edi                              ;  x
0040190B  |.  8BD0          mov     edx, eax                         ;  edx=z
0040190D  |.  E8 2EFFFFFF   call    00401840                         ;  x,y按位相加取其补码
00401912  |.  83C4 08       add     esp, 8
00401915  |.  52            push    edx                              ;  z
00401916  |.  56            push    esi                              ;  y
00401917  |.  8BF8          mov     edi, eax                         ;  将x变换结果设为m保存到edi
00401919  |.  E8 22FFFFFF   call    00401840                         ;  对z进行同样的变换设为n
0040191E  |.  83C4 08       add     esp, 8
00401921  |.  50            push    eax                              ;  n
00401922  |.  57            push    edi                              ;  m
00401923  |.  E8 58FFFFFF   call    00401880                         ; t= (0xff | m) | n,则t就是最后的结果

先来分析一下call    00401880 :

00401880  /$  0FB70D 3A2A44>movzx   ecx, word ptr [442A3A]           ;  0xFF
00401887  |.  0FB705 4C2A44>movzx   eax, word ptr [442A4C]           ;  0x65
0040188E  |.  0FB715 522A44>movzx   edx, word ptr [442A52]           ;  0xFF
00401895  |.  0BC1          or      eax, ecx                         ;  EAX |=ECX=0xFF
00401897  |.  0FB70D 382A44>movzx   ecx, word ptr [442A38]           ;  ECX=0x75
0040189E  |.  0BC2          or      eax, edx
004018A0  |.  0BC1          or      eax, ecx
004018A2  |.  0B4424 04     or      eax, dword ptr [esp+4]           ;  EAX=0xFF | 参数1
004018A6  |.  0B4424 08     or      eax, dword ptr [esp+8]           ;  EAX=EAX | 参数2
004018AA  \.  C3            retn

分析结果就是结果 EAX = (0XFF | 参数1) | 参数2;   

再来看其中最关键CALL

call    00401840   //这个CALL对上面的MAC地址,CPUID信息以及C盘序列号进行相应的计算,统计1下,被调用了2次:(设x为参数1,y为参数2)

00401840  /$  8B4424 04     mov     eax, dword ptr [esp+4]           ;  x
00401844  |.  8B4C24 08     mov     ecx, dword ptr [esp+8]           ;  y
00401848  |.  894424 04     mov     dword ptr [esp+4], eax
0040184C  |.  006C24 05     add     byte ptr [esp+5], ch             ;  [ESP+5]=x的低16位的高8位=y的低16位中的高8位+x的低16位的高8位
00401850  |.  02C1          add     al, cl                           ;  al=x低16位的低8位+y低16位低8位
00401852  |.  8A4C24 0B     mov     cl, byte ptr [esp+B]             ;  CL=y的高8位
00401856  |.  004C24 07     add     byte ptr [esp+7], cl             ;  [esp+7]=x的高8位+=CL
0040185A  |.  884424 04     mov     byte ptr [esp+4], al             ;  [ESP+4]=x的低8位=AL
0040185E  |.  8A4424 0A     mov     al, byte ptr [esp+A]             ;  al=y高16位中的低8位
00401862  |.  004424 06     add     byte ptr [esp+6], al             ;  [ESP+6]=x高16位中的低8位+=al
00401866  |.  8B4424 04     mov     eax, dword ptr [esp+4]           ;  eax=经过变换的x
0040186A  |.  F7D0          not     eax
0040186C  |.  83C0 01       add     eax, 1                           ;  eax=x的补码
0040186F  |.  A3 0C564400   mov     dword ptr [44560C], eax          ;  保存结果
00401874  \.  C3            retn

分析此CALL,发现是1个按位相加的运算,图示如下:

设参数1为X, 参数2为Y
X:aaaaaaaa bbbbbbbb cccccccc dddddddd (每个字母代表1个数位)
Y:AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD (每个字母代表1个数位)

那么,经过此CALL变换相加以后,X就为:
X: (aaaaaaaa+AAAAAAAA) (bbbbbbbb+BBBBBBBB) (cccccccc+CCCCCCCC)(dddddddd+DDDDDDDD)

说白了,“按位相加,去掉进位!最后再求补!”

从这里,我们不难得到其注册算法,并制造注册机来。
2009-3-23 13:11
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我是菜鸟,楼上的厉害
2009-5-8 11:44
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
俺是菜鸟,不会
2009-5-8 11:57
0
游客
登录 | 注册 方可回帖
返回
//