CrackMe007 | 难度适当提高 |160个CrackMe深度解析(图文+视频+注册机源码)

作者:逆向驿站微信公众号:逆向驿站知乎:逆向驿站crackme007,是006的升级版,程序开发者给出的难度是3星,可能是迷惑有点多?个人觉得条线还是比较清晰,难度也不大,依然适合新手准备【环境和工具】win7/xp虚拟机环境CrackMe007(aLoNg3x.2.exe)ollydbgDededark【学习层次】逆向分析程序验证流程逻辑解密算法,写注册机积累Delphi程序逆向特点经验实战图文最终效果展示程序验证流程逻辑图动态分析1.程序观察crackme006的升级版,最终目标是一致的,均是要求给下方的蓝色logo无遮盖的显示出来,也就是说要给这个区域的控件全部隐藏,程序界面如下图同时可见开发crackme的和学习crackme的目标和标准是一致的,path的方式是不被认可的,即不可爆破,crackme若是个美貌女子,则应征服其心,切不可霸王硬上弓。2.控件ID,事件函数信息依然老规矩,既然是delphi的程序,我们就先用dededark给控件信息和事件函数信息搜集出来3.控件ID常量搜索法,打开入手点程序开始只有一个Register按钮,对应上图,其控件ID是2CC,那么我们依然就从2CC常量出发查找→所有常量→2CC(Register按钮控件ID),结果如下跟入第一个,根据之前的对dephi程序逆向的经验,应该可以一眼看出,这里的反汇编代码,功能是:dl的值0是隐藏,1是显示,如下图可以看出,若是程序如期执行到这里,则隐藏Register按钮,并显示Again按钮,那么我们在这个代码的函数块入口处下断点,来动态分析这个函数块的逻辑流程,如下图可以看到,这个函数实际就是点击Register按钮的事件函数,首先会对code进行验证,若是纯数字则跳到下方,否则弹框报错,并给[0x445830]赋值,看似多此一举,实则是必须过程,原因后面会提到,如果输入的是纯数字,则执行以下流程,如图在这里我们看到了算法函数,算法函数需要三个参数(用户名、code、[0x445830]的值),算法函数若是合规,则隐藏Register按钮,显示Again按钮。那么我们就F7跟入算法函数去研究算法4.分析算法在分析算法前,需要对[0x445830]这个全局变量值做一个说明初始值是0经过动态分析(请自行动手)得出,对它赋值的触发条件是,需要code输入至少6个英文字母,然后点击Regsiter按钮输入AAAAAA,它会被赋值固定值0x1686既然是这种输入输出都可控的全局变量值,我们就不去纠结其算法什么的了,当然如果你想去研究分析,那也是值得提倡得然而为什么非得多此一举得对他赋值呢?因为后面得核心算法中,它的值将作为一个乘数,若是0的话,那么算法的最终结果无论如何都会是0,0是无法完成算法合规的,简单的说,若是这个值是0,则不可能完成注册,所以要对他进行这种看似多此一举的隐藏赋值。是不是类似开启隐藏奶牛关,呵呵!后面得所有分析中我们都按照,code输入AAAAAA后[0x445830]被赋值0x1686为准我们来分析算法,如图可见核心算法是首先要求用户名要大于4个字符,为了防止溢出,我写的注册机就硬性规定为5个字符根据输入的用户名,经过两次嵌套循环,和[0x445830]的值,即我们控制其值为0x1686,共同计算出一个值,暂时记为nTempnTemp = nTemp % 0xA2C2A第二次输入的注册码要求是纯数字,纯数字作为10进制的数字型值,记为nCode则公式是nCode/0x59+nCode%0x50+1 = nTemp这种不是摘要hash的,是直接可以逆推计算出注册码,根据以上分析,写出逆推注册码的源码,如下//code输入AAAAAA给[0x445830]赋的值 int nKey = 0x1686; char szRes[1024] = {0}; char szName[32] = {0}; int nCode = 0; int nTemp = 0; GetDlgItemText(IDC_EDIT1,szName,31); if (strlen(szName)!=5) { MessageBox(“请输入5字符长度的字符串”,“逆向驿站提示您”); } else { //根据name字符串计算 for (int i =1;i<=5;i++) { for (int j =5;j>=1;j–) { nTemp = nTemp + (int)szName[i-1] * (int)szName[j-1] * nKey; } } } //取模 nTemp = nTemp%0xA2C2A ; //反推code nCode = (0x50 - ((nTemp -1)*0x59 % 0x50))+(nTemp-1) * 0x59 ; sprintf(szRes,“1.把注册机的五字符长度用户名输入nome处\r\n\r\n”); sprintf(szRes+strlen(szRes),“2.请在code处输入AAAAAA,然后点击Register按钮,弹框确认关闭即可\r\n\r\n”); sprintf(szRes+strlen(szRes),“3.请在code处输入%d,然后点击Register按钮\r\n\r\n”, nCode); sprintf(szRes+strlen(szRes),“4.Register按钮消失,again按钮出现\r\n\r\n”); sprintf(szRes+strlen(szRes),“5.请再次在code处输入AAAAAA,然后点击again按钮,弹框确认关闭即可\r\n\r\n”); sprintf(szRes+strlen(szRes),“6.请再次在code处输入%d,然后点击again按钮,按钮消失,注册成功\r\n\r\n”, nCode); SetDlgItemText(IDC_EDIT2,szRes);crackme注册机的完整源码均在网盘5.分析Again按钮事件函数我们现在已经成功的隐藏了Register按钮,但是又出来了一个Again按钮,有了如上的过程作为经验,我们"依葫芦画瓢",对Again按钮进行分析,结果发现,其实验证流程完全是重复了一遍Regsiter按钮,Again按钮点击事件逆向代码如下可以看到,给[0x445830]赋值的隐藏算法和最后的合规核心算法,均自动显示出来了中文标签,这就是习惯做标签的好处,之所以会显示出来,那证明跟上方的Regsiter部分的两个算法均调用的相同的算法函数,参数相同,算法相同,那么结果一定相同了。所以Again按钮消失的方法是跟Register一模一样的,只是他消失后,不再显示其他按钮而已,至此注册成功,Crackme007的标题也温顺的变成了Crackme by “your name"了。是不是有如开头所说的征服美女的快感?去网盘中下载,试试吧文章中涉及软件、课件、源码等均在网盘,为避免网盘链接失效,公众号中回复:网盘欢迎关注微信公众号:逆向驿站相关文章● CrackMe-006精解● CrackMe-005精解(下)● CrackMe-005精解(上)● CrackMe-004精解● CrackMe-003精解● CrackMe-002精解● CrackMe-001精解标签:逆向|破解|反汇编|olldbg|渗透测试|病毒分析|网络安全|区块链本期标签:dededark|delphi反汇编|crackme|crackme7|crackme07 ...

February 14, 2019 · 1 min · jiezi

ASM汇编常用跳转指令-极速查

作者:逆向驿站微信公众号:逆向驿站知乎:逆向驿站若不是老鸟,是不是经常为各种JXX汇编跳转指令查资料?影响效率,更影响潜意识整体分析的"灵光一现"。本公众号《汇编跳转指令速查图片》已更新,公众号回复:跳转速查版公众号回复:跳转即可获得完整表格版如果你连N都不想自己拆解的话,那就在这里找吧,基本比较全了跳转指令分三类一、无条件跳转JMP ;无条件跳转二、根据CX、ECX寄存器的值跳转JCXZ ;CX 为 0 则跳转JECXZ;ECX 为 0 则跳转三、根据EFLAGS寄存器的PSW标志位跳转JE ;等于则跳转 同JZJNE ;不等于则跳转 同JNZJA ;无符号大于则跳转JNA ;无符号不大于则跳转JAE ;无符号大于等于则跳转 同JNBJNAE ;无符号不大于等于则跳转 同JBJB ;无符号小于则跳转JNB ;无符号不小于则跳转JBE ;无符号小于等于则跳转 同JNAJNBE ;无符号不小于等于则跳转 同JAJG ;有符号大于则跳转JNG ;有符号不大于则跳转JGE ;有符号大于等于则跳转 同JNLJNGE ;有符号不大于等于则跳转 同JLJL ;有符号小于则跳转JNL ;有符号不小于则跳转JLE ;有符号小于等于则跳转 同JNGJNLE ;有符号不小于等于则跳转 同JGJZ ;为零则跳转JNZ ;不为零则跳转JS ;为负则跳转JNS ;不为负则跳转JC ;进位则跳转JNC ;不进位则跳转JO ;溢出则跳转JNO ;不溢出则跳转JP ;为偶则跳转JNP ;不为偶则跳转JPE ;奇偶位置位则跳转 同JPJPO ;奇偶位复位则跳转 同JNP最后,喜欢这里的请推荐给你身边的朋友吧(渗透测试、逆向破解、病毒分析、信息安全等)欢迎关注微信公众号:逆向驿站相关文章● CrackMe-005精解(下)● CrackMe-005精解(上)● CrackMe-004精解● CrackMe-003精解● CrackMe-002精解● CrackMe-001精解

January 25, 2019 · 1 min · jiezi

CrackMe005-下篇 | 逆向破解分析 | 160个CrackMe(视频+图文)深度解析系列

作者:逆向驿站微信公众号:逆向驿站知乎:逆向驿站CrackMe005,上篇说了具体方法,下篇来发逆向分析过程,看看老夫是如何得到上篇的具体方法的!准备【环境和工具】win7/xp虚拟机环境CrackMe005(ajj2.zip)ollydbgDededarkpeidUPXEasyGUI.exe(upx专用脱壳器)【学习层次】爆破,但是这个CM作者声明了,爆破他是不认可的解密流程,写注册机积累Delphi程序逆向特点经验详解视频搞清Delphi控件ID在反汇编代码中的特点,其实逻辑就清晰多了https://v.qq.com/x/page/x0830…实战图文一.DedeDark梳理事件、控件信息二.动态分析1.根据字符串定位总判断位置字符串“注册了”,“厉害厉害真佩服”入手,定位发现是timer2事件函数,五个判断不停的判断,如图可以看到判断跟6个值有关,分别是[ebx+304]、[ebx+308]、[ebx+310]、[ebx+318]、[ebx+314]、[ebx+31C],我们下文所有就对其简称做304、308、310、318、314、31C2.逐个判断层层分析我们从简单往复杂,并结合他们之间内在的逻辑先后顺序,去逐个分析,顺序分别是31C、304、308、310、314和318,其中最难的是310,方法是常量跟踪法,即在OD中点击 查找→所有常量 ,看看都那些地方对这些值有操作31C总判断目标:31C值,不能等于0x3E7相关事件函数:Button1Click最终逆向分析结论:Buton1Click事件不能被触发,否则31C就会被赋值0x3E7,即不能点击注册按钮,这里需要注意click事件和mousedown事件,click必须是一个按下和抬起的全过程,而且鼠标位置都在按钮控件范围内,而mousedwon事件按下就是具体逆向分析过程如下所有常量查找结果,如下反汇编代码如下呵呵就一行,确实简单吧304总判断目标:304值,不能等于0xC34相关事件函数:FormCreat最终逆向分析结论:FormCreat生成表单的事件函数中,会对一个固定路径检查是否有合规内容的合规文件,有则,显示出隐藏的Edit2控件具体逆向分析过程如下所有常量查找结果,如下反汇编代码如下注意:我这里已经把,CrackMe开发者要求的X盘符改为了C盘符,为的是方便308总判断目标:308值,不能等于0x230D相关事件函数:Button1MouseDown、Panel1DblClick最终逆向分析结论:308初始值是由FormCreat函数初始化为0x28E,在Button1MouseDown事件中,右键一次则308值增加0x3,最终目标是0x29D,因为等于0x29D后,Panel1DblClick事件就可以解禁Edit2控件,则0x29D减去0x28E再除以0x3最后结果等于5,即右键点击注册按钮5次,再去双击panel1控件没有图的地方,就可以解禁Edit2控件具体逆向分析过程如下所有常量查找结果,如下反汇编代码如下310 中嵌套 30C,最复杂的地方总判断目标:310值,必须等于0xF94相关事件函数:FormMouseMove、Edit2DblClick最终逆向分析结论:310的值要想最终被赋值0xF94,必须完成三重判断,第一个是当控件ID是0xE20时,即是image3"性相近"的时候,FormMouseMove捕捉的XY坐标都足够大,即右下脚,满足则310被赋值0x10,第二个是当控件ID是0x2DC时,即image2"性本善"的时候,FormMouseMove捕捉的X坐标足够小、Y坐标足够大,第三个是,30C不能等于初始值0x9, 30C被赋值的条件是Edit2中的字符串长度是8位,且第二位是"_",第6位是"," ,我们写1_345,78是符合要求的,同时要求用户名长度是3的整数倍,然后左键双击Edit2控件,即可给30C赋值,具体赋值结果又跟你的磁盘剩余空间有关。当上面这一系列嵌套判断都合规后,则完成310赋值0xF94,同时若是用户名是"ajj",则显示隐藏控件ID是0x2FC的Label3,显示值是30C具体逆向分析过程如下310所有常量查找结果,如下310反汇编代码如下发现嵌套30C,那么继续常量查找30C,如下30C反汇编代码如下这里其实是这个crackme最难的地方了,其实逻辑并不复杂,需要耐性和记录给理清晰即可314和318总判断目标:314的值等于318的值相关事件函数:image14MouseDown最终逆向分析结论:其实314的值在上一个流程中已经赋值完毕,314的值取决于30C的值,30C分别是0、1、2、3的时候,314分别是0x41、0x3D、0x34、0xDF,而318的值,则是点击14幅图片,区分左右键,分别自增不同的数值,具体如下方图片,最终要求318的值等于314的值具体逆向分析过程如下所有常量314查找结果,如下314反汇编代码如下318所有常量查找结果,如图至此,如下图timer2所有的总判断全部过关,所以timer2每次触发,都将走注册成功的流程,是不是感觉很刺激,跃跃欲试的,去网盘中下载,去折磨自己的吧文章中涉及软件、课件、源码等均在网盘,为避免网盘链接失效,公众号中回复:网盘欢迎关注微信公众号:逆向驿站相关文章● CrackMe-005精解(上)● CrackMe-004精解● CrackMe-003精解● CrackMe-002精解● CrackMe-001精解本期标签:dededark|delphi反汇编|crackme|crackme5|crackme05

January 24, 2019 · 1 min · jiezi

干货 - 如何逆向解决QT程序汉化中的乱码问题

作者:逆向驿站原文链接https://mp.weixin.qq.com/s/aG…一款QT开发的国外软件,大概率是没有做中文支持的,所以你汉化中,不论怎么设置编码都一定是乱码。面对这个问题,你去互联网上找答案,答案却大多是复制粘贴的开发中解决乱码的文章,可是我们是要逆向中解决,于是吾爱破解、汉化新世纪等找过来,盘搜搜个遍,发现基本不是资源过期就是驴唇不对马嘴的抄袭贴,所以我来发一篇干货准备【环境和工具】win7/xp虚拟机环境pdf2any原版安装程序(qt开发的国外程序,不支持中文,无源码)ollydbgRadialix 3010editorqt-win-opensource-4.8.2-mingw.exe(相当于QT库支持,核心部件)qt-creator-opensource-windows-x86-3.3.0.exe(相当于编辑器而已)MinGW.rar(编译调试环境)最后三个是QT开发环境,搭建起来有利于学习,当然如果你不想玩QT开发那其实只用装第一个就行了,里面有QT各种库函数的源码,遇到相应程序浏览源码即可【学习层次】生搬硬套,能解决大部分QT汉化中乱码问题搞懂搞透,举一反三详解视频干货视频,放出来尽可以去传播,但是不要干那种修改我版权说是自己视频的事,那就low了!https://v.qq.com/x/page/o0825…实战图文一.某QT程序汉化中遇乱码QT开发的国外软件,若是没有特意做中文支持,不论怎么搞,都是乱码例如汉化下图中的标题registration乱码二.逆向分析寻找原因1.OD中定位标题字符串程序载入OD,定位"registration",并查看,程序中都有那些位置会调用这个字符串,如图发现有三个地方调用了这个字符串地址,全部下断点2.运行观察断点下好后,运行程序,观察调用字符串的逻辑流程,发现下的三个断点中有两个在程序启动会被调用,调用的目的分别是作为两个QT库函数的参数,如下图3.正向查阅相关函数源码这里多说一句,玩逆向不只光玩逆向,一直强调逆向是一种思维,逆向破解的逆向就是开发,活用开发资料,逆向破解中往往事半功倍。安装QT后就可以看QT各种库函数的源码和资料,如果你想更深入的了解,给吃透的话,最好的方式莫过于自己开发,自己逆向分析。开始寻找目标函数源码,everything搜两个函数类命,QCoreApplication和QMetaObject,如下图打开源码,阅读相关函数,源码如下QCoreApplication::translate函数定义,发现核心参数就是这个枚举类型,当枚举类型为0的时候中文是乱码,当是1的时候中文没问题QMetaObjcet::tr函数实现,发现这个函数的实质其实是以枚举类型参数为0去调用QCoreApplication::translate4.逆向中验证上面的正向源码从新载入OD,重新运行,根据上面正向查阅的源码资料观察相应的两个库函数在逆向中的体现,如下图可见,两个函数其实最终调用的都是第一个函数,而核心关键点就是枚举类型参数的值,那么我们在第一个库函数入口【6A2B5818】下断点动态运行一下,堆栈中观察参数的变化,如下动图5.总结所有线索标题字符串Registration被函数QCoreApplication::translate作为参数标题字符串Registration被函数QMetaObeject::tr作为参数两个函数核心都是QCoreApplication函数QCoreApplication控制中文乱码核心参数是枚举类型,值0乱码,1是utf-8支持中文QMetaObeject::tr调用的QCoreApplication::translate关键枚举类型是0,所以标题最后是不支持中文的,导致一汉化产生乱码三、修改QT库QTCore4.dll解决问题其实上面的分析如果已经完全搞懂了,其实就已经知道怎么解决了,而且解决方法有很多,但是都并不能保证所有程序的通用性,毕竟一个开发一个样,这次他用这个库函数,没准下次他用另外一个,所以吃透后,具体问题具体分析才是任何武功中的“无招胜有招”!针对于这个案例,解决的思路就至少有以下三种程序领空修改,让其调用的QMetaObeject::tr更换为QMetaObeject::trUtf8(阅读源码就会发现有这个函数,为什么此案例他没调用这个,因为是国外软件,他压根没想支持中文,所以他用的是tr而不是trutf8),这样修改的好处,可以相对保证汉化者的劳动成果,毕竟修改的地方可能会多,而且只在程序领空修改,但通用性差,换个程序百分百没用修改库函数QMetaObeject::tr,让他调用QCoreApplication::translate时,枚举参数设置成1,也就是压根用逆向的方式把QMetaObeject::tr函数改成了QMetaObeject::trUtf8,好处通用性较强。修改QCoreApplication::translate内部逻辑,让枚举类型为0时,也按为1的流程逻辑走(最常见的爆破套路),有点通用性很强,极大程度适用很多QT程序汉化乱码问题后两种方法都是修改QT库函数,所以最终体现是修改了QTcore4.dll这个文件,方法分别如下方法1方法2修改后,生成新的qtcore4.dll文件,替换原版qtcore4.dll就会发现,再去汉化此软件,乱码问题已经解决了。我们依然以汉化题目为示例,OD中修改数据(如果你是大量汉化工作就别用OD了否则累死哦),注意要是utf-8的内存编码形式,关于编码常识可以在公众号内回复“编码”阅读,也可以点此链接 编码常识 ,修改标题registration为“测试”,“测试”的utf-8内存编码模式16进制数据是E6 B5 8B E8 AF 95 ,转换方法如下,有兴趣的也可以自己写工具notepad++写入内容,转码010editor查看16进制内容OD改字符串乱码解决

January 23, 2019 · 1 min · jiezi