吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 20903|回复: 105
收起左侧

[原创] 关于新手入门逆向工程的建议与指引

    [复制链接]
Lifetimer 发表于 2020-1-24 18:10
本帖最后由 Lifetimer 于 2020-1-24 18:18 编辑

关于新手入门逆向工程的建议与指引


1.前言

1.1 备注

这是我第一次发帖,如果有不对的地方管理看到了可以帮忙修改或删帖,谢谢。

1.2 背景

入坑逆向工程已经有一段时间了,起初学习这个技术就是从吾爱破解开始的,但是我记得看到了许多的论坛上的帖子,破解无壳的软件时都是几个步骤:
1.pe查壳
2.od载入
3.搜索字符串
4.找到关键字符串上最近的几个跳转,修改
5.保存文件

然而,对于许多的软件,甚至是无壳软件,这都是没用的,总是百思不得其解,为什么搜不到字符串等,经过了长期的探索,看了许多书和视频教程,终于总结出了新手容易有的一些疑惑,在此一一阐述,开始吧!

2.在正式学习逆向工程之前的建议

2.1至少掌握一种编程语言

编程语言和人们日常交流时使用的语言最大的不同是:编程语言记录的是思维,而日常交流用的语言是要让别人知道自己的意思,所以,掌握编程语言的那种处理问题的思维是很重要的,而且,无论什么语言,其本身是不会变的,就像我最熟练的语言是C++(我现在还只是个学生),但是因为一些需求阅读到了一些C#的代码,发现要看懂其实不难,同样的变量声明方式,用 . 来取对象,这些一看就懂,所以只要你有编程思维,再来看这些东西会发现其实不难。

这里的观点你可能不赞同,但是没关系,这不是重点,这段话的重点是:在开始学习逆向时要先掌握一定的编程思维

2.2有耐心

软件破解绝对不仅仅是查找几个字符串就搞定了的,这是一种思维上的比拼,你要通过调试工具,分析的是作者在设计这个程序是是怎么想的,了解他的思路,才在破解的过程中游刃有余。
【例1】查找字符串的方式是很基本的破解方式,请简述其原理
【解析】od搜索到了字符串,是因为这个地方引用了这个字符串,软件分析得到你的序列号是错的,所以弹一个消息框“无效的序列号”,在初始化消息框时就会将这个字符串压入栈中,但是,如果是正确的就不会弹这个窗口,所以肯定有一个地方决定是否弹这个框,也就是,你只要修改这个跳转,让它不弹这个窗口,就可以了。

2.3有扎实的汇编语言和操作系统底层处理功底

如果有人告诉你软件破解就是查找几个字符串修改几个跳转的话,他不是误人子弟就是自己不会。
在破解的过程中,不管是爆破还是追码,你都需要懂得作者的意思。

3.学习时需要注意的地方

3.1要有系统的学习内容(不管你是看书还是看视频)

逆向工程不会很简单,不是那种看几个帖子就能学会的,最好书和视频一起看,系统学习,才能发挥最好的效果。

3.2善于反思

为什么要这样做?作者这样设计有什么好处?多问自己几个问题,这是进步的一个好方法。也更有利于总结出破解的一般方法。

3.3循序渐进

冰冻三尺,非一日之寒。不要一开始就尝试高难度的软件破解,那些软件一般有高超的反调试技术和防破解技术,对于新手比较困难,不妨先从论坛中的无壳CrackMe开始,慢慢来,总有一天你可以达到较高的水准。

3.4给自己积极的鼓励

虽然有时候会失败,但是也不要放弃,多给自己积极的暗示,相信自己能成功。

4.对新手常见问题的总结:

4.1为什么程序没加壳还搜不到关键字符串

搜不到关键字符串的原因有许多,排除加壳的原因,主要有两种:

1.语言方面:如果软件在编写的过程中使用的是英文字符串,为了支持国际化用了中文的language文件(ini或dll或db等),可以尝试查原语言字符串。
2.简单加密:这里我举一个例子:我有一个字符串“注册成功”,那么,它在OD中是搜索的到的。如有一个程序代码如下:

#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

然后我们写一个辅助程序:
#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
修改程序如下:
#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
但是OD已经搜不到字符串:
无标题.png
此时可以用更高级的方法,用调用栈(alt+k)破解,我就不多说了。

4.2无法保存至可执行文件

这个是加壳造成的,壳会改变内存使得内存中的映像不能直接对应可执行文件,所以无法保存,请先脱壳。

4.3破解之后软件无法运行

这个有很多可能,有可能是自校验,也有可能是栈平衡被打破,原因很多,我就不一一列举了,解决方法视情况而定。

4.4汇编代码太乱以至于难以把握整体

结合IDA一起分析,初学者这样有利于学习,如我刚刚写的那个程序,用ida载入后显示的图很好分析:


无标题.png
两个消息框关系非常明朗:
无标题.png

5.结语

这篇文章讲了初学者学习逆向技术时应注意的地方,并点出来一些常见错误,希望能对初学者有所帮助。



最后,
在此祝福初学者们在逆向破解这条道路上越走越好,
也祝福吾爱破解论坛的坛友们春节快乐,鼠年大吉!

免费评分

参与人数 58威望 +1 吾爱币 +57 热心值 +54 收起 理由
JonSn0w + 1 + 1 用心讨论,共获提升!
ringwraith + 1 我很赞同!
鼓捣猫呢 + 1 + 1 谢谢@Thanks!
Throne + 1 + 1 我很赞同!
jasoncooper + 1 + 1 用心讨论,共获提升!
上将无双 + 1 + 1 我很赞同!
raloe + 1 + 1 我很赞同!
畅畅畅畅 + 1 我很赞同!
白马九 + 1 + 1 我很赞同!
Happyday + 1 + 1 用心讨论,共获提升!
ysl222 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lg_fly + 1 + 1 谢谢@Thanks!
jinyan + 1 + 1 今天开始,关注你了。
yysswa + 1 + 1 我很赞同!
Li520pj + 1 谢谢@Thanks!
fanmow + 1 + 1 谢谢@Thanks!
wlxiaozhzh + 1 + 1 我很赞同!
厉行者508 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
忘了世界的人 + 1 + 1 谢谢@Thanks!
NameQuin + 1 + 1 我很赞同!
学至终焉5210 + 1 + 1 谢谢@Thanks!
WSLFY + 1 + 1 谢谢@Thanks!
hellozhanghe + 1 + 1 热心回复!
无名i + 1 + 1 我很赞同!
quleilei889 + 1 + 1 热心回复!
jingxx521 + 1 + 1 我很赞同!
学无止境no1 + 1 + 1 用心讨论,共获提升!
THOLE + 1 + 1 感谢分享
Smi + 1 用心讨论,共获提升!
tlf + 1 热心回复!
StoneEpigraph + 1 + 1 谢谢@Thanks!
Mr_Linear + 1 + 1 热心回复!
keyyan + 1 + 1 用心讨论,共获提升!
T0k3n + 1 谢谢@Thanks!
sxhytds + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
大桥为九 + 1 + 1 我很赞同!
qinyuanchi + 1 + 1 谢谢@Thanks!
sunofdawn + 1 谢谢@Thanks!
庞晓晓 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
rjsyt + 1 + 1 我很赞同!
乄落日乀 + 1 + 1 谢谢@Thanks!
17376777302 + 1 热心回复!
Hmily + 1 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
reol_233 + 1 + 1 谢谢@Thanks!
name=123456789 + 1 + 1 谢谢@Thanks!
阿隆 + 1 + 1 我很赞同!
巧言乱德 + 1 用心讨论,共获提升!
陈世界 + 1 + 1 我很赞同!
FleTime + 1 用心讨论,共获提升!
涛之雨 + 1 + 1 热心回复!
CrazyNut + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
dogz + 1 + 1 用心讨论,共获提升!
宿命今生 + 1 谢谢楼主分享经验
生有涯知无涯 + 1 我很赞同!
yuanyanping + 1 + 1 谢谢@Thanks!
Eaysuild.xean + 2 + 1 建议:C语言+汇编(王爽第三版)+window核心编程(小甲鱼视频)
女萝岩 + 1 + 1 我很赞同!
sapeu + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| Lifetimer 发表于 2020-1-28 12:15
天星轮回 发表于 2020-1-27 18:53
推荐新手学C不太好吧。。。
C、C++、C#这些我都会,个人感觉,C#或者Java入门是比较容易的。

你说的对,但是学C或者C++其实是较好的,C#或JAVA都好入门,Python和VB也是,但是C,C++的思维方式最接近汇编,而汇编语言才是逆向工程最应掌握的语言,学会C后,要学懂汇编很简单,而C#和Java学好后,要突破汇编这道门槛就有难度了,我就是从C开始学的,C++学完后入门的汇编。其实只要用心,困难是容易突破的,个人认为新手学C不是不可能。不过我也支持你的观点,感谢你的建议,谢谢!
涛之雨 发表于 2020-1-25 08:17
还是咱大吾爱的朋友好,不想某些平台。。。
搜索isvip搞的一切。。。
学士天下 发表于 2020-1-24 21:39
会成功的人 发表于 2020-1-26 11:39
谢谢楼主分享
cptw 发表于 2020-1-24 19:12
春节快乐,鼠年大吉!
YiFaniu 发表于 2020-1-24 20:09
感谢分享,正需要
kone153 发表于 2020-1-24 21:29
厉害,看来要好好学习学习了
Devil太初 发表于 2020-1-24 21:51
感谢分享!新年快乐!
海细123 发表于 2020-1-24 23:06
感谢分享。
colinhd8 发表于 2020-1-25 00:06
入门帖,值得支持。
沉默挺好的 发表于 2020-1-25 00:15
学习一下
qqvcd010 发表于 2020-1-25 03:23
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 19:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表