小萌新的第一个crackMe
2020-02-02 22:25:52 Author: bbs.pediy.com(查看原文) 阅读量:332 收藏

[原创]小萌新的第一个crackMe

2小时前 112

First crackMe

Lixu

2020年2月1日 20:57:22

这是来自《看雪》的一个crack,小弟也是一个菜鸟,第一次做Crack的详细分析,还望大佬批评指点,

工具:OD,peid

1. 使用peid进行查壳

 

很显然是vc6编写的一个crackme,没壳直接进OD

2. 拖进OD

前面都是一些预处理,向下滑很快找到主函数的入口403C2E,

 

进入之后可以看到几个常见的API函数,很容易找到获取文本框句柄的函数GetDlgItem和对话框MessageBox,很显然,在获取文本框内句柄后进行了一些处理,所以推测401081处所执行的call就是我们所找的主要call

 

下面分析这个call,分析结果如注释;

 


获取第一个文本框文本后进行算法加密后,在第二次获取第二个文本框的内容和第一次的计算结果进行比较,最后决定提示框的内容。

算法一:进行右移,左移,或运算

 

算法二;进行左移,右移,或运算

 

但值得注意的是因为windows是小端存储模式,所以在写注册机的时候需要进行大小端转逆,在程序中比较的时候因为都是小端模式,所以不用管。

请输入Name(大于等于3,小于等于35):yanmeng

Serial:ae388d0ea3e7df5fe0e0b80c548c4b07

Press any key to continue

 

注册机代码:仅供参考,希望大佬指点

#include "stdafx.h"

#include "string.h"

#include <stdlib.h>

void main()

{  unsigned long a,b,c,d;

  unsigned long sn1,sn2,sn3,sn4;

  char serial1[9],serial2[9],serial3[9],serial4[9];

  int len,num=0;

  char str[50];

  printf("请输入Name(大于等于3,小于等于35):");

  scanf("%s",str);

  len=strlen(str);

  for (int i=0;i<len;i++)

    num+=str[i];

  a=(num*0x10325476)^(num*0x67452301);

  b=num*0x10325476;

  c=(num-0x10325477)^(num*0x67452301);

  d=num*0x67452301;

  a=(a>>0x1B)|(a<<0x5);

  b=b<<0x1;

  c=(c<<0x13)|(c>>0xD);

  d=(d>>0xf)|(d<<0x11);

  sn1=(a<<0x18)|(a<<0x8&0xff0000)|(a>>0x8&0xff00)|(a>>0x18&0xff);

  sn2=(d<<0x18)|(d<<0x8&0xff0000)|(d>>0x8&0xff00)|(d>>0x18&0xff);

  sn3=(c<<0x18)|(c<<0x8&0xff0000)|(c>>0x8&0xff00)|(c>>0x18&0xff);

  sn4=(b<<0x18)|(b<<0x8&0xff0000)|(b>>0x8&0xff00)|(b>>0x18&0xff);

  ltoa(sn1,serial1,16);

  ltoa(sn2,serial2,16);

  ltoa(sn3,serial3,16);

  ltoa(sn4,serial4,16);

  printf("Serial:%s%s%s%s",serial1,serial2,serial3,serial4);

  printf("\n");

  getchar();

}

2020安全开发者峰会(2020 SDC)议题征集 中国.北京 7月!


文章来源: https://bbs.pediy.com/thread-257449.htm
如有侵权请联系:admin#unsafe.sh