汇编0基础小白的超简单CM破解记录
本帖最后由 cui_boran 于 2020-8-28 13:17 编辑前言
应@Hmily 大大的要求,把这篇帖子发到了脱壳破解区。原文:https://www.52pojie.cn/thread-1253670-1-1.html。
大佬们就别看了,写超级简单。{:301_1004:}
正文
需要准备的软件,说在前面
吾爱破解专用版ollydbg,链接:https://www.52pojie.cn/thread-350397-1-1.html
CM下载帖子链接:新人第一个CMhttps://www.52pojie.cn/thread-1145568-1-1.html
最好有C/C++基础!如果没有汇编基础和破解基础更好(因为在我看来,理解汇编的最好方式不是背指令,而是能够在实践中自己悟出来)!
开始破解!
先解压下载好的ollydbg,然后点击一下修复路径的exe。打开软件,把creakme.exe拖到ollydbg里。 https://attach.52pojie.cn/forum/202008/25/115441kdrbdkzce8red51c.jpg
首先我们可以先尝试着打开一下程序(不是在ollydbg里跑),随便输入一个数字,看看他会显示出什么。
发现原来是出现了“破解失败,请继续加油!”这一句话。那么接下来我们要做的就是找到这句话。但是一个一个翻太麻烦了,这里我们点击插件——中文搜索引擎——智能搜索。
https://attach.52pojie.cn/forum/202008/25/115449ocu0oag0nuwwuwaz.jpg
看到了文本字符串里有“破解失败,请继续加油!”,双击它,发现跳转到了00AD14B9(在最左边的那一列,这叫做汇编地址)
这时我们应该想一想,怎么样能够使我无论输入什么都能显示成功呢?
我用的办法是这样子的,把原来应该输出“破解失败,请继续加油!”的地方通过改变这一句的汇编指令使它跳转到输出“破解成功!”的地方。
那么用C++翻译出来就是这样子的:
#include<iostream>
using namespace std;
int main(){
int a;
cin>>a;
if(a==3){
cout<<"你成功了!";
}
else{
cout<<"你失败了!";
}
system ("pause");
}
改成:
#include<iostream>
using namespace std;
int main(){
int a;
cin>>a;
if(a==3){
aaa:cout<<"你成功了!";
}
else{
goto aaa;
}
system ("pause");
}
这样的话无论你怎么输入都是成功的。
那C++里有goto,可是汇编里没有goto怎么办.....
我的想法是这样的:当我们点到某些行的时候,会出现红箭头(起始位置)或者白箭头(结束位置)。那箭头的起始位置那一行都会出现一个指令,不知道你注意到了吗。
jmp XXXXXXXX
这里的XXXXXXXX是跳转后的汇编地址。
所以我们就可以知道,如果要跳转的话,指令是这样的:jmp [汇编地址](需要双击某一个地址的指令才能改)
也就是把00AD14B9的内容从
mov edx,0xAD322C
改成
jmp 00AD1429
https://attach.52pojie.cn/forum/202008/25/115506orhtojyexth6eoxp.jpg
注意:不能直接跳转到写着成功提示的那一个位置,要再往前,看到
msvcp140.std::cout
【c语言std标准格式输出指令】才行
为什么呢?你可以这样理解(这是C++一个输出的部分):
cout<</*这相当于00AD1429的部分*/"破解成功!";/*这相当于00AD1430的部分*/):
这样就相当于无论成不成功都可以跳转到成功指令。
然后运行程序。
https://attach.52pojie.cn/forum/202008/25/115515i2zb4dze02ble2pa.jpg
这就成功啦!:victory:
写在后面
其实这也是我的第一个破解程序,之前没学过破解、ollydbg使用、汇编语言,共耗时1个小时左右。
总结了几条很重要的地方:
1.不要总是看着别人破解,自己试一试才是最重要的。看别人的永远不会!因为每一个CM都是不一样的,不要当“云破解带师”。
2.想到怎么样creak之后就不要因为“自己不会汇编指令”、“自己不会ollydbg使用”做借口。只要你能想到怎样破解,你就一定能想到怎样实现。这就是一个破解论坛,你不会还吾爱破解里搜索或者询问。实在不会的还可以at大神啊,比如Hmily、小生我怕怕这些大佬们,随便提点你一句都够你学习一个月的了。不要害怕问别人。
3.没有必要学习汇编之后采开始破解,像我就没学过汇编,只是根据C++编程的经验加上百度就能明白某些指令的意思。不要总是为不会creak找借口。
4.看到简单的CM一定要去尝试,而不是写“哇塞,看起来好厉害哦,围观大佬!”,这样的话你围观一万年也学不会,一定要参与进去,无论有没有破解成功。(即使没有成功可能还有大佬来提点你呢) 顺便加一下这个CM的算法分析
//写在前面:算法分析
//其实也没有用到算法吧
//就是把秘钥Tb8C4k2pMV改成assic码来防止破解了(但是我没管他因为我是爆破的hhhh)
//用了指针函数(多此亿举,可能是作者想装13)
//然后用了if判断
//然后....就没然后了,就这些
#include<iostream>
#include<conio.h>
#include<string>
using namespace std;
void success(string);
void fail(string);
int main()
{
char* a = new char{ 84,98,56,67,52,107,50,112,77,86,0 };//指针a=列表是Tb8C4k2pMV的ASCII码十进制下对应的数字和字母
string password;
void(*b)(string) = NULL;//指针B是空
cout << "璇疯緭鍏ュ瘑鐮侊細" << endl;//cui_boran加,作者用的vs,我用的dev-c++,会出现乱码。原文->请输入密码:
cin >> password;
for (unsigned int i = 0; i < password.size(); ++i)
{
if (0 <= password <= 112)//写的神马玩意,语法是错的.....就是这个导致了CM中出现了bug
{
b = fail;
}
}
if (password==a)
{
if (b != fail)
{
b = success;
}
}
b(password);
_getch();
return 0;
}
void success(string password)
{
char* a = new char{ 84,98,56,67,52,107,50,112,77,86,0 };//Tb8C4k2pMV
if (password != a)
{
fail(password);
return;
}
cout << "鐮磋В鎴愬姛锛屾劅璋㈡偍鐨勫弬涓庯紒" << endl;//cui_boran加,作者用的vs,我用的dev-c++,会出现乱码 原文->破解失败!
return;
}
void fail(string password)
{
cout << "鐮磋В澶辫触锛岃缁х画鍔犳补锛? << endl;//cui_boran加,作者用的vs,我用的dev-c++,会出现乱码 原文->破解成功,感谢您的参与!
return;
} cui_boran 发表于 2020-8-26 09:36
顺便加一下这个CM的算法分析
//写在前面:算法分析
//其实也没有用到算法吧
在 Dev-C++ 中复制代码前,先启动中文输入法,就不会乱码了。 tql,学习逆向第一天 学习学习,虽然可能看不懂唉 goto aaa的地址在哪里 学习,学习,学习 return-void solly 发表于 2020-8-26 12:29
在 Dev-C++ 中复制代码前,先启动中文输入法,就不会乱码了。
啊,谢谢提醒{:301_993:}