注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

一段win9x加密函数  

2013-06-13 10:14:01|  分类: 一些练习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

用IDA分析,从文件里考出二进制代码,

先在OD里单步模拟分析了一下,就大概知道加密原理了。

之后写了一段小程序,用它的代码做函数数据,类似shellcode那样。

该函数用于加密解密共享密码。

c:\temp>pass 1
加密前的密码是:1
加密后的密文是:04
再次加密后的密文是:31
c:\temp>pass 11
加密前的密码是:11
加密后的密文是:04 ab
再次加密后的密文是:31 31
c:\temp>pass 112
加密前的密码是:112
加密后的密文是:04 ab 7f
再次加密后的密文是:31 31 32
c:\temp>pass 1122
加密前的密码是:1122
加密后的密文是:04 ab 7f 94
再次加密后的密文是:31 31 32 32

c:\temp>pass aabb
加密前的密码是:aabb
加密后的密文是:54 fb 2f c4
再次加密后的密文是:61 61 62 62

=================
 __encry         proc near               ; CODE XREF: sub_C000DC00+210p
LCOD:C000DB90                                         ; sub_C000DC00+28Bp ...
LCOD:C000DB90
LCOD:C000DB90 var_1           = byte ptr -1
LCOD:C000DB90 arg_0           = byte ptr  8
LCOD:C000DB90 arg_4           = dword ptr  0Ch
LCOD:C000DB90 arg_8           = dword ptr  10h
LCOD:C000DB90
LCOD:C000DB90                 push    ebp
LCOD:C000DB91                 mov     ebp, esp
LCOD:C000DB93                 sub     esp, 4
LCOD:C000DB96                 push    ebx
LCOD:C000DB97                 mov     eax, [ebp+arg_4]
LCOD:C000DB9A                 cmp     byte ptr [eax], 0
LCOD:C000DB9D                 jz      short loc_C000DBBB
LCOD:C000DB9F                 mov     dl, [ebp+arg_0]
LCOD:C000DBA2                 mov     ecx, [ebp+arg_8]
LCOD:C000DBA5
LCOD:C000DBA5 loc_C000DBA5:                           ; CODE XREF: __encry+29j
LCOD:C000DBA5                 mov     [ebp+var_1], dl
LCOD:C000DBA8                 ror     [ebp+var_1], 1
LCOD:C000DBAB                 mov     dl, [ebp+var_1]
LCOD:C000DBAE                 mov     bl, [eax]
LCOD:C000DBB0                 xor     bl, dl
LCOD:C000DBB2                 mov     [ecx], bl
LCOD:C000DBB4                 inc     eax
LCOD:C000DBB5                 inc     ecx
LCOD:C000DBB6                 cmp     byte ptr [eax], 0
LCOD:C000DBB9                 jnz     short loc_C000DBA5
LCOD:C000DBBB
LCOD:C000DBBB loc_C000DBBB:                           ; CODE XREF: __encry+Dj
LCOD:C000DBBB                 pop     ebx
LCOD:C000DBBC                 leave
LCOD:C000DBBD                 retn
LCOD:C000DBBD __encry         endp
========
LCOD:C000DB90  55 8B EC 83 EC 04 53 8B  45 0C 80 38 00 74 1C 8A
LCOD:C000DBA0  55 08 8B 4D 10 88 55 FF  D0 4D FF 8A 55 FF 8A 18
LCOD:C000DBB0  32 DA 88 19 40 41 80 38  00 75 EA 5B C9 C3

========
LCOD:C000DE06                 lea     eax, [ebp+var_B8]
LCOD:C000DE0C                 push    eax
LCOD:C000DE0D                 push    edx
LCOD:C000DE0E                 push    6Ah
LCOD:C000DE10                 call    __encry
LCOD:C000DE15                 add     esp, 0Ch

============
//OD
98加密解密函数

00401010  |.  55            push    ebp
00401011  |.  8BEC          mov     ebp, esp
00401013  |.  83EC 04       sub     esp, 4
00401016  |.  53            push    ebx
00401017  |.  8B45 0C       mov     eax, dword ptr [ebp+C]
0040101A  |.  8038 00       cmp     byte ptr [eax], 0
0040101D  |.  74 1C         je      short 0040103B
0040101F  |.  8A55 08       mov     dl, byte ptr [ebp+8]
00401022  |.  8B4D 10       mov     ecx, dword ptr [ebp+10]
00401025  |>  8855 FF       /mov     byte ptr [ebp-1], dl
00401028  |.  D04D FF       |ror     byte ptr [ebp-1], 1
0040102B  |.  8A55 FF       |mov     dl, byte ptr [ebp-1]
0040102E  |.  8A18          |mov     bl, byte ptr [eax]
00401030  |.  32DA          |xor     bl, dl
00401032  |.  8819          |mov     byte ptr [ecx], bl
00401034  |.  40            |inc     eax
00401035  |.  41            |inc     ecx
00401036  |.  8038 00       |cmp     byte ptr [eax], 0
00401039  |.^ 75 EA         \jnz     short 00401025
0040103B  |>  5B            pop     ebx
0040103C  |.  C9            leave
0040103D  \.  C3            retn
0040103E      90            nop
0040103F      90            nop
00401040      50            push    eax 指向输出缓冲
00401041      52            push    edx 指向输入字符串
00401042      6A 6A         push    6A  加密值
00401044      E8 C7FFFFFF   call    00401010
00401049      83C4 0C       add     esp, 0C

======
00401040      50            push    eax
00401041      52            push    edx
00401042      6A 6A         push    6A
00401044      E8 C7FFFFFF   call    00401010
00401049      83C4 0C       add     esp, 0C

如输入edx=
00403070  31 31 32 32

则输出为eax=
00403000  04 AB 7F 94

=========
00401040      50            push    eax
00401041      52            push    edx
00401042      6A 6A         push    6A
00401044      E8 C7FFFFFF   call    00401010
00401049      83C4 0C       add     esp, 0C

如输入edx=
00403070  61 61 62 62

则输出为eax=
00403000  54 FB 2F C4

=========

#include <stdio.h>
#include <string.h>

// Win98Se共享密码加密函数
char code[]=
"\x55\x8B\xEC\x83\xEC\x04\x53\x8B\x45\x0C\x80\x38\x00\x74\x1C\x8A"
"\x55\x08\x8B\x4D\x10\x88\x55\xFF\xD0\x4D\xFF\x8A\x55\xFF\x8A\x18"
"\x32\xDA\x88\x19\x40\x41\x80\x38\x00\x75\xEA\x5B\xC9\xC3"
;

char out[100];
char out2[100];

typedef void (__cdecl *PF)(char a,char *b,char *c);

int main(int argc, char *argv[])
{
 PF encry;
 encry=(PF) &code[0];
 
 if (argc!=2 || strlen(argv[1])>90)
 {

  printf("Win98Se共享密码加密函数\n",argv[0]);
  printf("帮助: %s passsword\n",argv[0]);
  return 0;
 }
 
 encry(0x6A,argv[1],out);

 printf("加密前的密码是:%s\n",argv[1]);

 printf("加密后的密文是:");
 for (int i=0; i < strlen(argv[1]) ;++i )
 {
  printf("%02x ",(unsigned char) out[i]);
 }

 encry(0x6A,out,out2);

 printf("\n再次加密后的密文是:");
 for (int i=0; i < strlen(out) ;++i )
 {
  printf("%02x ",(unsigned char) out2[i]);
 }

 return 0;
}

  评论这张
 
阅读(217)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017