|
关于新手入门逆向工程的建议与指引 1.前言 1.1 备注 这是我第一次发帖,天津市麦克企业如果有不对的地方管理看到了可以帮忙修改或删帖,谢谢。 1.2 背景入坑逆向工程已经有一段时间了,起初学习这个技术就是从吾爱破解开始的,但是我记得看到了许多的论坛上的帖子,破解无壳的软件时都是几个步骤: 然而,对于许多的软件,甚至是无壳软件,这都是没用的,总是百思不得其解,为什么搜不到字符串等,经过了长期的探索,看了许多书和视频教程,终于总结出了新手容易有的一些疑惑,在此一一阐述,开始吧! 2.在正式学习逆向工程之前的建议 2.1至少掌握一种编程语言编程语言和人们日常交流时使用的语言最大的不同是:编程语言记录的是思维,而日常交流用的语言是要让别人知道自己的意思,所以,掌握编程语言的那种处理问题的思维是很重要的,而且,无论什么语言,其本身是不会变的,就像我最熟练的语言是C++(我现在还只是个学生),但是因为一些需求阅读到了一些C#的代码,发现要看懂其实不难,同样的变量声明方式,用 . 来取对象,这些一看就懂,所以只要你有编程思维,再来看这些东西会发现其实不难。 这里的观点你可能不赞同,但是没关系,这不是重点,这段话的重点是:在开始学习逆向时要先掌握一定的编程思维 2.2有耐心软件破解绝对不仅仅是查找几个字符串就搞定了的,这是一种思维上的比拼,你要通过调试工具,分析的是作者在设计这个程序是是怎么想的,了解他的思路,才在破解的过程中游刃有余。 如果有人告诉你软件破解就是查找几个字符串修改几个跳转的话,他不是误人子弟就是自己不会。 逆向工程不会很简单,不是那种看几个帖子就能学会的,最好书和视频一起看,系统学习,才能发挥最好的效果。 3.2善于反思为什么要这样做?作者这样设计有什么好处?多问自己几个问题,这是进步的一个好方法。也更有利于总结出破解的一般方法。 3.3循序渐进冰冻三尺,非一日之寒。不要一开始就尝试高难度的软件破解,那些软件一般有高超的反调试技术和防破解技术,对于新手比较困难,不妨先从论坛中的无壳CrackMe开始,慢慢来,总有一天你可以达到较高的水准。 3.4给自己积极的鼓励虽然有时候会失败,但是也不要放弃,多给自己积极的暗示,相信自己能成功。 4.对新手常见问题的总结: 4.1为什么程序没加壳还搜不到关键字符串搜不到关键字符串的原因有许多,排除加壳的原因,主要有两种: 1.语言方面:如果软件在编写的过程中使用的是英文字符串,为了支持国际化用了中文的language文件(ini或dll或db等),可以尝试查原语言字符串。 #include<iostream> #include<cstdio> #include<string> #include<windows.h> using namespace std; int check(string user,string sn);//这是个象征性的示范函数 int main(){ string username,sn; cout<<"请输入用户名:"<<endl; cin>>username; cout<<"请输入序列号:"<<endl; cin>>sn; check(username,sn); system("pause"); return 0; } int check(string user,string sn){ for(int i=0;i<user.length();i++){ for(int j=0;i<sn.length();j++){ if(user[i]-1!=sn[i]){ MessageBox(NULL,"序列号错误","失败",MB_OK); return 0; } } } MessageBox(NULL,"序列号正确","成功",MB_OK); return 1; } OD也能识别出:
QQ截图20200124171225.png (28.78 KB, 下载次数: 5) 下载附件 2020-1-24 17:12 上传 然后我们写一个辅助程序: #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<windows.h> using namespace std; int main(){ char text[]="序列号正确"; char text2[]="序列号正确"; cout<<"序列号正确"; for(int i=0;i<strlen(text);i++){ char a=text[i]; a=a^2; text2[i]=a; } cout<<text2; return 0; } 得到与2异或后的字符串:D2 F0 C3 D2 B8 C7 D7 FF CA B5 00
无标题.png (83.79 KB, 下载次数: 4) 下载附件 2020-1-24 17:15 上传 修改程序如下: #include<iostream> #include<cstdio> #include<string> #include<windows.h> using namespace std; int check(string user,string sn);//这是个象征性的示范函数 char a[]={0xD2,0xF0,0xC3,0xD2,0xB8,0xC7,0xD7,0xFF,0xCA,0xB5,0x00}; char b[]={0xD2,0xF0,0xC3,0xD2,0xB8,0xC7,0xB6,0xEF,0xCC,0xF1,0x00}; int main(){ string username,sn; cout<<"请输入用户名:"<<endl; cin>>username; cout<<"请输入序列号:"<<endl; cin>>sn; for(int i=0;i<strlen(a);i++){ char t=a[i]; t=t^2; a[i]=t; } for(int i=0;i<strlen(b);i++){ char t=b[i]; t=t^2; b[i]=t; } check(username,sn); system("pause"); return 0; } int check(string user,string sn){ for(int i=0;i<user.length();i++){ for(int j=0;i<sn.length();j++){ if(user[i]-1!=sn[i]){ MessageBox(NULL,b,"",MB_OK); return 0; } } } MessageBox(NULL,a,"",MB_OK); return 1; } 能正常运行,
无标题.png (22.11 KB, 下载次数: 4) 下载附件 2020-1-24 17:32 上传 但是OD已经搜不到字符串:
无标题.png (16.14 KB, 下载次数: 4) 下载附件 2020-1-24 17:35 上传 此时可以用更高级的方法,用调用栈(alt+k)破解,我就不多说了。 4.2无法保存至可执行文件 这个是加壳造成的,壳会改变内存使得内存中的映像不能直接对应可执行文件,所以无法保存,请先脱壳。 4.3破解之后软件无法运行这个有很多可能,有可能是自校验,也有可能是栈平衡被打破,原因很多,我就不一一列举了,解决方法视情况而定。 4.4汇编代码太乱以至于难以把握整体结合IDA一起分析,初学者这样有利于学习,如我刚刚写的那个程序,用ida载入后显示的图很好分析:
无标题.png (139.63 KB, 下载次数: 3) 下载附件 2020-1-24 17:59 上传 两个消息框关系非常明朗:
无标题.png (212.93 KB, 下载次数: 4) 下载附件 2020-1-24 18:01 上传 5.结语 这篇文章讲了初学者学习逆向技术时应注意的地方,并点出来一些常见错误,希望能对初学者有所帮助。 最后, 在此祝福初学者们在逆向破解这条道路上越走越好, 也祝福吾爱破解论坛的坛友们春节快乐,鼠年大吉! 免费评分 参与人数 58威望 +1 吾爱币 +57 热心值 +54 理由
查看全部评分 (责任编辑:) |



























































