看雪加密解密第一个traceme程序破解
工具:ollydbg(吾爱破解2.10版)
工具设置:因为traceme是一个win32图形用户程序,所以其程序入口点在WinMain()函数处,设置ollydbg的调试设置的事件选项,选中在WinMain函数处中断。(选项->调试设置->事件)
正式开始,打开traceme程序后程序会停在winmain函数的入口处:
00DD1450即为WinMain函数的入口地址
运行一下程序发现弹出一个模态对话框,
随便输入用户名和序列号点击check后发现弹出,
说明用户名要大于四个字符,点击ok后再次进行输入发现显示输入的序列号不对,大致了解了程序的流程,首先用户名要大于四个字符,然后当序列号不与用户名匹配时则弹出序列号错误,再来一次的消息框。
因为用户名在模态对话框输入后程序要获取它进行处理,对应的API函数为GetWindowTextW(unicode版本)或GetDlgItemTextA(ANSI)或GetDlgltemTextW()
具体使用哪个函数不知道,只能多试几次,这就需要在ollydbg中设置断点是程序停在对应函数处,快捷键Ctry+G打开跟随表达式窗口输入相应函数并设置断点(也可以直接在设置API断点菜单项中直接设置断点),设置完断点后再运行,程序停在00DD18E1处,发现其先调用函数,参考GetDlgItemTextW函数的API档案
四个参数从右到左压入栈中(stdcall调用约定),按F7单步执行,记住用户名所存的缓冲区的地址为00CFF188,
按F8单步步过call GetDlgItemTextW,运行完之后函数返回值在eax中为所读字符的个数,在F7继续运行
发现traceme.00DD1172只是判断一下esi与esp的大小,一样大就什么都做。在继续f7,
其将eax也就是所读字符的个数保存到指定单元
然后下面又是一个GetDlgItemTextW函数的调用其是获得序列号的字符,
ollydbg其在call函数的时候其会把API函数参数信息在栈中注释出来很容易知道其序列号字符存在地址为00CFF0B8处,
之后在继续F7发现其会用 movzx eax,word ptr ss:[ebp-0xA8]
test eax,eax;
当eax为0时其会跳到指定位置,如果把ip设置并跟进
其会显示输入字符大于4,说明eax不能为0
eax== ss:[ebp-0xA8]
也就是用户名字符缓冲区的第一个字符,不为零说明不能不能不填用户名,其字符得大于4,。
cmp dword ptr ss:[ebp-0x184],0x5
此单元存放的为用户名字符数,当其字符大于等于5时跳转(否则就显示字符数不能小于5),
继续F7进入一个函数参数为用户名,序列,和用户名字符数F7进入函数会发现其会进行大量运算,其为关键函数
解析后的出其会把原来的用户名给经过运算转变
,调用wsprintf函数把转换后的字符覆盖原来的缓冲区(参数%d,说明是已是以十进制形式覆盖的)
接着调用lstrcmp字符串比较函数,比较覆盖后的用户名和序列,如果相等则返回0,不相等则返回其他值,
因为本次输入的值不正确所以其返回0,之后再F7返回到关键参数的出口其会测试test返回值,一直f7之后其执行了Je跳转到
弹出了失败的对话框,可以联想到其如果不跳转则执行下面的语句,尝试强制改变ip后再一直F7果然弹出了成功的对话框,说明只有当不执行je跳转时才会弹出成功对话框,又因为不执行je则关键函数返回值eax应不为0,所以一切的秘密还在关键函数中(只有关键函数的返回值为eax!=0才行),
回到关键函数中,发现当执行完lstrcmp函数后如果返回值不为0则最后关键函数返回值为0,如果返回值为零则关键函数返回值eax也为0,
所以只要lstrcmp函数返回值为0就行,而lstrcmp返回值为0说明两个比较字符串相等,两个比较的字符串为 序列号和关键函数处理后的用户名
,所以只要关键函数处理后的用户名就是序列号
进一步分析关键函数的算法!
走一下发现其大致流程但不知道table所指的内存中的数据,因为不知道table的值(这时就要注意机器码中,带下划线的机器码都是指地址,)
可以右键选中数据跟踪-》地址常量跟踪,也可以用Ctrl+G搜索地址,注意机器码中的地址为内存中存放的形式,所以是低位在前高位在后。搜索后得到
table地址的数据,编写算法为`#include
using namespace std;
int main()
{
int a = 3;
int b;
int c = 0;
int str[] = {0x0c, 0x0a, 0x13, 0x09, 0x0c, 0x0b, 0x0a, 0x08};
int w;
int d = 0;
cout<<“请输入用户名:”;
char name[0x51];
cin>>name;
b = strlen(name);
while(1)
{
if(a>=b)
break;
else
{
if(c<=7)
{
w = name[a];
w = w * str[c];
w = w + d;
d = w;
}
else
c = 0;
}
a++;
c++;
}
cout<<"序列号为:"<<d;
}`
总结:破解注意通过不断设置新的断点来反复分析程序,可以采用试错的方法和(由错究因,由因再进一步分析),注意对关键函数的分析与寻找。调试时F8与F7在合适时机配合使用。
看雪加密解密第一个traceme程序破解的更多相关文章
- 分析一个delphi程序
系统 : Windows xp 程序 : k4n6 程序下载地址 :https://pan.baidu.com/s/1pLANxyj 要求 : 注册机编写 使用工具 : OD & DeDe 可 ...
- labview从入门到出家1--第一个加法程序
概述: Labview在众多编程语言中排名靠后,显然在当今互联网,物联网时代并非主流语言.但是俗话说行行 出状元,即便不是立身于某个主流的领域,用好了依旧可以独领风骚,而且Labview对于硬件出身的 ...
- OD学习笔记10:一个VB程序的加密和解密思路
前边,我们的例子中既有VC++开发的程序,也有Delphi开发的程序,今天我们给大家分析一个VB程序的加密和解密思路. Virtual BASIC是由早期DOS时代的BASIC语言发展而来的可视化编程 ...
- 将 Shiro 作为一个许可为基础的应用程序 五:password加密/解密Spring应用
考虑系统password的安全,眼下大多数系统都不会把password以明文的形式存放到数据库中. 一把会採取下面几种方式对password进行处理 password的存储 "编码" ...
- 一个经典的PHP加密解密算法
项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理.最常见的应用在用户登录以及一些API ...
- 一个经典的PHP加密解密算法authcode
项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理.最常见的应用在用户登录以及一些API ...
- C#做的一个加密/解密的类
转自:http://www.16aspx.com/Article/3904 using System; using System.Security.Cryptography; using System ...
- 一个java的DES加密解密类转换成C#
一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //import java.util.regex.P ...
- 与众不同 windows phone (28) - Feature(特性)之手机方向, 本地化, 应用程序的试用体验, 系统主题资源, 本地数据的加密解密
原文:与众不同 windows phone (28) - Feature(特性)之手机方向, 本地化, 应用程序的试用体验, 系统主题资源, 本地数据的加密解密 [索引页][源码下载] 与众不同 wi ...
随机推荐
- Elasticsearch 单字符串多字段查询
前言 有些时候,我们搜索的时候,只会提供一个输入框,但是会查询相关的多个字段,典型的如Google搜索,我们该如何用 Elasticsearch 如何实现呢? 实例 从单字符串查询的实例说起 创建测试 ...
- Go语言中使用K8s API及一些常用API整理
Go Client 在进入代码之前,理解k8s的go client项目是对我们又帮助的.它是k8s client中最古老的一个,因此具有很多特性. Client-go 没有使用Swagger生成器,就 ...
- 微信小程序实现搜索关键词高亮
目录 1,前言 2,思路 3,代码逻辑 1,前言 项目中碰到一个需求,搜索数据并且关键词要高亮显示,接到需求,马上开干.先上效果图.源码已经做成了小程序代码片段,放入了GitHub了,文章底部有源码链 ...
- 图像Resize方式对深度学习模型效果的影响
在基于卷积神经网络的应用过程中,图像Resize是必不可少的一个步骤.通常原始图像尺寸比较大,比如常见监控摄像机出来的是1080P高清或者720P准高清画面,而网络模型输入一般没有这么大,像Yolo系 ...
- vmstat-观察进程上线文切换
vmstat 是一款指定采样周期和次数的功能性监测工具,我们可以看到,它不仅可以统计内存的使用情况,还可以观测到 CPU 的使用率.swap 的使用情况.但 vmstat 一般很少用来查看内存的使用情 ...
- Kafka 消息存储机制
Kafka 消息以 Partition 作为存储单元,那么在 Partition 内消息是以什么样的格式存储的呢,如何处理 Partition 中的消息,又有哪些安全策略来保证消息不会丢失呢,这一篇我 ...
- 关于MySQL日志,我与阿里P9都聊了些啥?
写在前面 周末,我与阿里P9资深技术专家(这里就不说名字了),聊起了MySQL这个话题,为啥会聊这个呢?因为他看到我出版了一部<MySQL技术大全:开发.优化与运维实战>,对书籍的评价也是 ...
- 《RT-Thread Studio开发STM32》第一章~第一节《配置STM32H743XIH6点亮LED灯》
安装RT-Thread Studio后添加相关芯片库文件,打开软件 打开SDK管理界面,安装相关的库文件,本次采用STM32H743XIH6芯片,野火开发板. 新建工程并设置相关的参数 先编译下下载到 ...
- 2021浙江省程序省赛(ACFGJLM题解)
A 签到,加起来就行了,记得等于属于先手赢(2A) C 题意 给八个点三维坐标,问是否在三维是立方体 思路 八个点的连成56条线,如果是立方体的话有8条,24条,24条相同的线,且都不相同 用map存 ...
- 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之创建实例-12
自动化kolla-ansible部署ubuntu20.04+openstack-victoria之创建实例-12 欢迎加QQ群:1026880196 进行交流学习 实例创建 1. 创建 2. 查 ...