吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12132|回复: 96
收起左侧

[原创] 简明、现代而优雅的破解技术笔记(二)

    [复制链接]
qzhsjz 发表于 2021-1-31 09:40
本帖最后由 qzhsjz 于 2021-2-5 21:51 编辑

简明、现代而优雅的破解技术笔记 第一课

(论坛的自动超链接机制会让我的标题出bug,这个问题修复之前我的 Markdown 标题中不能出现“破解技术”四个字)

需要提前准备安装的工具环境

正向开发:开始设计密码判断程序

即使你是一个连C++也没有接触过的新手,也不要害怕,下面我会演示如何用 Visual Studio 默认创建的 Hello World 代码修改出一个判断密码的小程序。

在 Visual Studio 中创建工程

  • 打开 Visual Studio
    VS2019启动界面.png
  • 选择 创建新项目
    创建新项目.png
  • 语言选择 C++ ,平台选择 Windows
  • 在列表中找到 控制台应用 ,并点击下一步。
    配置新项目.png
  • 把项目位置改成你希望用来盛放你的作业的位置,并且给项目起个名字,比如 我的第一个密码判断程序
  • 勾选 将解决方案和项目放在同一目录中 ,本例我们不需要复杂的解决方案与项目管理功能,勾选这一项可以减少文件夹层级,看起来顺眼一些。
  • 点击 创建
    VS工程主界面.png

我们可以看到,Visual Studio 自动为我们配置好了工程,并生成了一个源代码文件,文件的内容是一个 Hello World 程序。

修改 Visual Studio 生成的初始程序代码

在上方的 Debug x86中把 x86 换成 x64 ,并点击右侧带有绿色小三角的 本地Windows调试器 ,就可以看到 Hello World 程序的运行结果。
HelloWorld运行结果.png

这就是这个程序代码的作用。将这个调试窗口关掉,我们继续查看程序代码本身。

如果你接触过一些基础的C++课程,或者至少知道如何编写Hello World,你会觉得很熟悉,这里面除去大括号之外的三行代码,第一行是引入 iostream 这个C++模块,第二行是定义了一个 main 函数,而第三行则是调用 iostream 模块中在 std 命名空间中定义的流对象 cout ,并通过 << 运算符来向 cout 中输出一个字符串 "Hello World!\n"

如果你没有接触过C++,完全不知道这三行代码是什么意思,也不要着急,上期所述的C++标准委员会的官方文档中对这些东西有详细解释,搜索关键字即可。

在C++标准委员会的文档中,我们可以搜索到 coutcin 两个流的具体用法和示例代码,请点击链接:cin cout

根据以上查到的用法和示例代码,我们可以发现,如果我们想把用户输入读入一个变量,那么就可以 cin >> 这个变量; ,如果想要输出一个东西,我们就可以 cout << 这个东西;

在C++中,想使用的变量需要预先定义,而且需要声明该变量的数据类型。变量声明的语法是 变量类型 变量名;

于是,我们现在可以读入用户输入了,并且把它输出出来试一下。代码如下:

#include <iostream>
int main()
{
    std::string 用户输入的内容;
    std::cin >> 用户输入的内容;
    std::cout << 用户输入的内容;
}

再次点击运行,你会发现你制作了一款复读机。
复读机.png

知道了如何输入和输出,我们现在只需判断一下用户的输入与真码是不是一致就可以了。另外,为了让程序独立运行时最后能够停住看结果,需要在最后加一个等待用户输入的命令。所以最后的代码变成了这样:

#include <iostream>
int main()
{
    std::string 用户输入的内容;
    std::string 真码 = "52Pojie-AngeloTheCat";
    std::cin >> 用户输入的内容;
    if (用户输入的内容 == 真码)
        std::cout << "密码正确!\n";
    else
        std::cout << "密码错误!\n";
    system("pause");
}

再次点击运行,至此,一个小小的密码验证程序就完成了。

这个密码验证程序似乎对中文的控制台用户输入有bug,也可能是我的系统开了强制Unicode内码的缘故,暂时没有解决。可能使用区分宽窄字符的C++标准库,并且系统窄字符默认编码是UTF-8时就会出现这个问题,如果想要bug少一些,处理输入的时候请尽量使用 conio.h 或Windows API。

逆向分析:使用IDA查看编译好的密码判断程序

IDA的安装与配置

站长发的 IDA 7.5 是绿色版的,只需要绿化即可。

为了能够让IDA搜索中文字符串,需要在绿化后桌面上出现的 IDA 快捷方式中添加参数 -dCULTURE=all ,如图:
IDA_culture.png

开始我们的第一次逆向分析

将我们编译好的程序拖入64位 IDA 的快捷方式,将会打开 IDA ,初次打开 IDA 时,会让你同意一个用户协议,同意即可。一般来讲,将程序拖入 IDA 后,将会弹出选择架构与 ABI 的界面,默认为 AMD64 架构和 Windows ABI ,这是正确的,所以这里点击OK。
IDA_arch.png

之后 IDA 会弹窗告诉你,你要分析的这个exe文件存在一个调试符号表(PDB)文件,并询问你是否需要加载这个文件。这里我们选择“是”,看看得出来的结果是什么。
IDA_PDB.png

由于我们的程序非常小,IDA 很快就会加载完成。IDA 加载完成后会自动跳转到 main 函数的位置,这时显示的是 IDA 的流程框图,可以看到,好像已经出现了什么不得了的东西……
IDA_loaded.png

我们按下 F5 ,这是 IDA 的反编译快捷键,将会反编译当前选择的函数。
IDA_decompiled.png

简直是不讲武德!我们刚才在main函数中所编写的逻辑,几乎一点不差地还原了出来。可以大致看到,if语句成立的条件是 v7==v8 ,而 v7 是调用了 cin 获取的用户输入,v8 则是密码的明文。

对于有C++基础的人,可以看到,从反编译后的第16行代码开始,和我们刚刚写的代码完全一致。先构造两个 string 对象 v7v8 ,并且将v8初始化为真码的内容。再调用 cin>> 运算符并且右操作数是 v7 这个 string 。然后调用 string 类的 == 运算符判断两个string,v7和v8是否相等,如果相等就调用 cout 对象的 << 运算符,输出密码正确的提示,否则就还是调用 cout 对象的 << 运算符,输出密码错误的提示。

而反编译的9-15行代码,则是 VC 的 Debug 版生成出来的程序自带的 Debug 环境初始化代码。

至此,由于我们写了一个实在太简单的程序,并且给IDA提供了符号表,所以我们轻而易举地就看到了这个程序的全部代码。我们现在来尝试修改这个程序的代码,将if的条件反向,密码正确时输出密码错误,密码错误时输出密码正确。

对第一个程序的修改(Hacking)

返回 IDA View 视图(框图),可以看到主函数的执行逻辑,左边是密码正确的逻辑,右边是密码错误的逻辑。区分走哪边是靠上面框中最后一条指令 jz 来实现的。
IDA_jz.png

我们将光标定位在 jz 处,点击 Edit -> Patch program -> Assemble。
IDA_patchasm.png

在弹出来的框中将 jz 改为 jnz
IDA_jnz.png
点击 OK 后 IDA 会自动给你下一个地址处的汇编让你改,此处我们不需要继续再改了,应该停止修改,按 Cancel。

jz 是一条汇编指令,它一般和 test 一同出现。在上一条 test 中,如果用于比较的两个寄存器与起来的值是0(也就是说两个寄存器都是0),那么 jz 就会跳转。jz 的意思是 jump zero,为零时跳转,jnz 也是一条汇编指令,意思是不为零时就跳转。jzjnz 也并不是一定要和 test 一同出现,他们判断为不为0的其实是CPU的状态寄存器。test 是一种会修改状态寄存器的指令。

再次按下 F5 ,看看生成的反编译代码 B 和之前的反编译代码 A 有什么区别。

点击 Edit -> Patch program -> Apply patches to input file。勾选 Create Backup 是个好习惯。
IDA_backup.png

点击OK。运行一下你刚保存的程序,看看和你编写出来的原程序有什么区别。

恭喜你完成了人生中第一次破解自己写的程序!

在下一期内容里,我将带领大家对这个小程序做一些改进,至少不会让IDA一载入就在第一屏看见所有逻辑。


第一课代码.7z (2.59 KB, 下载次数: 99)

免费评分

参与人数 40吾爱币 +38 热心值 +35 收起 理由
机械诅咒 + 1 + 1 谢谢@Thanks!
dugong26 + 1 + 1 谢谢@Thanks!
Fei666 + 1 谢谢@Thanks!
大冰山` + 1 + 1 谢谢@Thanks!
wanglalaen + 1 + 1 谢谢@Thanks!
侑燈 + 1 谢谢@Thanks!
erh + 1 + 1 懂了
trr320 + 1 我很赞同!
努力加载中 + 1 + 1 谢谢@Thanks!
Vcat + 1 + 1 多谢大佬的分享!好好学习!
Joker10101 + 1 + 1 感谢
Pammer + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
/│\云。 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yuwen998 + 1 + 1 用心讨论,共获提升!
Jaro + 1 + 1 我很赞同!
混元灵通 + 1 + 1 最近破解大佬纷纷优雅现身
天涯明 + 1 + 1 谢谢
独孤唐 + 1 谢谢@Thanks!
plasd + 1 + 1 谢谢@Thanks!
刘生生世世 + 1 + 1 我很赞同!
wzzjnb2006 + 1 + 1 我很赞同!
tvrcfdfe + 1 + 1 感谢!!!
nullable + 1 热心回复!
笙若 + 1 + 1 谢谢@Thanks!
amo今天学习了吗 + 1 + 1 谢谢@Thanks!
panwhao + 1 + 1 用心讨论,共获提升!
w52110 + 1 + 1 期待楼主的教程使我们共同进步
cbcu + 1 + 1 谢谢@Thanks!
Juch + 1 + 1 我很赞同!
朱朱你堕落了 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
caleb110 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
WAlitudealiy + 1 + 1 谢谢@Thanks!
waltzofjack + 1 谢谢@Thanks!
RE: + 1 + 1 谢谢@Thanks!
rickgrimes + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wanglprc + 1 + 1 谢谢@Thanks!
exluku + 1 + 1 热心回复!
yuxuechao + 1 谢谢@Thanks!
ICEY + 2 + 1 开始了开始了!
Bluezzz + 1 + 1 期待的教程来了!

查看全部评分

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

 楼主| qzhsjz 发表于 2021-2-24 11:15
沉睡的琥珀 发表于 2021-2-24 11:06
我的疑问:
楼主大大,源代码是否只要任何的修改,都会让已有的Hacking操作失效?

是这样的,IDA中修改的是编译好的程序,补丁也是补丁那一个程序文件。
如果你重新编译了程序,那么自然编译出来的新程序会覆盖掉原来编译出来的程序。
编译之后需要重新分析的,所以这就是逆向工程中的一个麻烦点,就是每个分析只能对一个具体的二进制文件负责。不过掌握了方法之后分析二进制文件是很快的。
聪明王子 发表于 2021-3-1 18:27
对于Unicode编码下的C++,请尝试使用wstring、wcin、wcout来输入中文
 楼主| qzhsjz 发表于 2021-1-31 11:22
cj13888 发表于 2021-1-31 11:20
学习了,希望能跟着楼主找饭吃

哈哈,我现在都快没饭吃了
话说我这个帖子人气还是不行啊,是我不会起标题还是讲的太难了?
sg_sixin 发表于 2021-1-31 09:54
谢谢楼主!
pwzx 发表于 2021-1-31 09:56
膜拜楼主,高产啊,感谢
霏映 发表于 2021-1-31 09:56
谢谢楼主
VicenFan 发表于 2021-1-31 09:59
楼主牛的,感谢分享
Bluezzz 发表于 2021-1-31 10:00
希望楼主以后能多出些IDA的有关教程和sao操作,IDA Pro book全英文又涉及大量专业词汇实在太难了。。IDA F5应该算是最无脑的操作了吧,期待下一次的教程,按楼主的意思应该是带有基础加密算法的pj吧,期待!
jwdstef 发表于 2021-1-31 10:05
感谢楼主 学习了
 楼主| qzhsjz 发表于 2021-1-31 10:06
Bluezzz 发表于 2021-1-31 10:00
希望楼主以后能多出些IDA的有关教程和sao操作,IDA Pro book全英文又涉及大量专业词汇实在太难了。。IDA F5 ...

我记得有一本已经翻译出来的书,叫 IDA Pro 权威指南(第二版),有兴趣可以参考一下。
我之前买过,但是现在想用了找不到了……

免费评分

参与人数 1热心值 +1 收起 理由
Bluezzz + 1 搜了一下,确实有,不过貌似都是下载站。。我也去找找看,谢谢啦

查看全部评分

wuboxun 发表于 2021-1-31 10:16
谢谢楼主的教程,学习了
yuxuechao 发表于 2021-1-31 10:19
很棒的教程 小白受教了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-15 10:09

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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