前言
目的
记录踩坑经验,帮助他人避免同样问题。
提示
使用浏览器左侧目录快速导航。
注意
如有错误,请指正。
免责声明
本文档中的信息仅供参考,作者仅免费分享技术,不对因使用本文档中的信息而导致的任何损失或损害承担责任。读者在使用本文档中的信息时,应自行判断其适用性,并承担相应的风险。本文档中的内容可能会随时更改,恕不另行通知。
环境:
虚拟机Windows 10 企业版 LTSC
可能用到的软件:
工欲善其事必先利其器
软件名称 |
类别 |
作用 |
VMware |
虚拟化软件 |
创建和管理虚拟机,运行多个操作系统实例 |
Detect It Easy(DIE) |
文件分析工具 |
识别可执行文件的编译器、打包器和加壳工具 |
Exeinfo PE |
文件分析工具 |
分析可执行文件的编译器、打包器和加壳工具 |
PEiD (Portable Executable Identifier) |
文件分析工具 |
检测可执行文件的编译器、打包器和加壳工具 |
x32/64dbg (Debugger) |
调试工具 |
调试 32 位和 64 位可执行文件 |
aslr_disabler |
安全工具 |
禁用地址空间布局随机化(ASLR),便于调试和逆向工程 |
Restorator |
资源编辑器 |
编辑 Windows 可执行文件(EXE、DLL 等)中的资源,如图标、字符串、对话框等 |
C32Asm |
汇编工具 |
用于编写和调试汇编代码,支持 32 位和 64 位架构 |
Injector |
注入工具 |
将动态链接库(DLL)注入到目标进程中,常用于调试和逆向工程 |
StudyPE |
PE 文件分析工具 |
分析和编辑 PE 文件结构,查看文件头、节表、导入表等信息 |
Stud_PE |
PE 文件分析和编辑工具 |
分析和修改 PE 文件。 |
可能用到的链接
爱盘下载: http://down.52pojie.cn/吾爱破解视频教程/吾爱破解论坛官方入门教学培训第一期/
百度网盘下载: 链接: https://pan.baidu.com/s/1z9WQeYgUGxcurVD2lKfNeg=e2su ;提取码: e2su
零基础新手破解学习导航帖
吾爱破解论坛官方入门教学培训第三课:改头换面之修改版权和资源 讲师:Kido哔哩哔哩bilibili
1、使用资源编辑器工具Restorator修改软件
以Scylla为例,其开源协议为GNU 3.0 http://www.gnu.org/licenses/gpl-3.0.html
1.1、编辑模式初来乍到
用Restorator打开Scylla_x86.exe -> 菜单 ->104 -> 点上面从右往左第6个 ab图标(F6)编辑模式
(注:在“资源查看器”里面改完代码,ctrl+s保存后按F5可以预览修改的结果)
1.2、修改界面小试牛刀
1.2.1、修改菜单
1.2.1.1、修改顶部菜单栏
将资源查看器中的104 MENU部分代码更改为这样
104 MENU
{
POPUP "文件"
{
MENUITEM "转储(&D)", -25507
MENUITEM "转储内存", -25460
MENUITEM "转储节", -25459
MENUITEM "PE 重建(&R)", -25506
MENUITEM SEPARATOR
MENUITEM "修复转储(&F)", -25505
MENUITEM SEPARATOR
MENUITEM "退出", -25535
}
POPUP "导入"
{
MENUITEM "显示无效项", -25490
MENUITEM "显示可疑项", -25487
MENUITEM SEPARATOR
MENUITEM "使所选项无效", -25488
MENUITEM SEPARATOR
MENUITEM "剪切所选项", -25495
MENUITEM "清除导入", -25486
MENUITEM SEPARATOR
MENUITEM "保存树(&S)", -25485
MENUITEM "加载树(&L)", -25484
}
POPUP "跟踪"
{
MENUITEM "自动跟踪(&T)", -25483
}
POPUP "杂项"
{
MENUITEM "DLL 注入", -25533
MENUITEM "反汇编器", -25455
MENUITEM SEPARATOR
MENUITEM "选项", -25481
}
POPUP "帮助"
{
MENUITEM "捐赠", -25452
MENUITEM "关于", -25534
}
}
更改完成后按F8提交更改,然后F5刷新预览
发现菜单栏已经发生变化
退出预览,按F12另存为
直接覆盖即可,因为会自动创建一个备份
打开"Scylla_x86.exe",发现修改成功
注:之前代码里
MENUITEM "转储(&D)", -25507
MENUITEM "PE 重建(&R)", -25506
MENUITEM "修复转储(&F)", -25505
像这种带有英文括号里&加一个字符的"(&+字符) ",意思是快捷键,比如在下图所示情况,点击 文件,这时按 R 可以快速使用PE重建功能,但要注意的是这种快捷键与ctrl+字符的快捷键不同
又例,选择一个活动的进程之后,点 文件 -> 按D ->跳出转储界面
1.2.1.2、修改右键导入表项界面
菜单 105界面
105 MENU
{
POPUP ""
{
MENUITEM "使无效", -25461
MENUITEM "反汇编", -25524
MENUITEM SEPARATOR
MENUITEM "剪切 thunk", -25526
MENUITEM "删除树节点", -25525
MENUITEM SEPARATOR
MENUITEM "展开所有节点", -25528
MENUITEM "折叠所有节点", -25527
}
}
F8提交修改,F5预览
1.2.1.3、修改反汇编器界面
107 MENU
{
POPUP ""
{
MENUITEM "跟随", -25456
MENUITEM "在此反汇编", -25453
MENUITEM SEPARATOR
MENUITEM "复制地址", -25516
MENUITEM "复制大小", -25512
MENUITEM "复制操作码", -25511
MENUITEM "复制指令", -25510
}
}
1.2.1.4、修改日志
110 MENU { POPUP "" { MENUITEM "保存", -25482 MENUITEM "清除", -25503 } }
1.2.2、修改对话框
1.2.2.1、修改主对话框界面
先按ctrl+F6切换到RC显示模式,这个怎么改就因人而异了,发挥创造力!!!
101 DIALOGEX 0, 0, 600, 335, 0
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUPWINDOW | WS_CAPTION
MENU 104
CAPTION "Scylla edited by Mozhongzhou"
FONT 8, "MS Shell Dlg", 400, FALSE
{
GROUPBOX "附加到活动进程", 1040, 7, 7, 586, 34, BS_CENTER, WS_EX_TRANSPARENT
COMBOBOX 1001, 13, 19, 526, 90, CBS_DROPDOWNLIST | WS_VSCROLL
PUSHBUTTON "选择DLL", 1002, 550, 18, 38, 15
GROUPBOX "导入表", 1041, 7, 44, 340, 140, BS_CENTER, WS_EX_TRANSPARENT
CONTROL "", 1023, "SysTreeView32", WS_BORDER | WS_HSCROLL | WS_TABSTOP | 0x00000227, 9, 52, 326, 100
PUSHBUTTON "显示无效项", 1009, 14, 155, 58, 14
PUSHBUTTON "显示可疑项", 1010, 141, 155, 58, 14
PUSHBUTTON "清除", 1011, 268, 155, 58, 14
GROUPBOX "日志", 1044, 7, 190, 340, 135, BS_CENTER, WS_EX_TRANSPARENT
LISTBOX 1024, 14, 205, 326, 110, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
GROUPBOX "IAT 信息", 1042, 353, 44, 240, 140, BS_CENTER, WS_EX_TRANSPARENT
LTEXT "OEP", 1046, 362, 63, 19, 12, SS_CENTERIMAGE
EDITTEXT 1004, 388, 62, 85, 12, ES_AUTOHSCROLL
LTEXT "VA", 1047, 362, 80, 13, 12, SS_CENTERIMAGE
EDITTEXT 1005, 388, 80, 85, 12, ES_AUTOHSCROLL
LTEXT "大小", 1048, 361, 97, 15, 12, SS_CENTERIMAGE
EDITTEXT 1006, 388, 98, 85, 12, ES_AUTOHSCROLL
PUSHBUTTON "IAT 自动搜索", 1007, 482, 61, 80, 16
PUSHBUTTON "获取导入表", 1008, 482, 81, 80, 16
GROUPBOX "转储", 1051, 353, 190, 240, 69, BS_CENTER, WS_EX_TRANSPARENT
PUSHBUTTON "转储", 1013, 363, 205, 59, 15
PUSHBUTTON "修复转储", 1019, 426, 205, 80, 15
PUSHBUTTON "PE 重建", 1015, 509, 205, 59, 15
GROUPBOX "操作", 1050, 353, 265, 240, 62, BS_CENTER, WS_EX_TRANSPARENT
PUSHBUTTON "自动跟踪", 1012, 363, 280, 57, 14
}
1.2.2.2、修改对话框102
1.2.2.3、修改对话框106
1.2.2.5、修改对话框108
这个改名字是没用的,后面还得细改
把关于和鸣谢改了就好
1.2.2.6、修改对话框109
1.2.2.7、修改对话框110
汉化后 filter->过滤器 字有点遮盖,需要调整一下大小
1.2.2.8、修改对话框115
1.2.2.9、修改对话框116
1.2.2.10、修改对话框117
1.2.3、修改快捷键
这个根据个人喜好来吧,我个人觉得没啥好改的
1.2.4、修改图标
1.2.4.1、导出现有图标
这是为了安全,备份,例如这个主要图标
左上角 快捷键alt+R打开资源,然后按V导出
1.2.4.2、导入新图标
传一个.ico上去(.jpg是不行的)
将.ico拖入103即可
效果图
1.2.5、修改界面
这个部分不适合随意编辑,代码跟应用权限有关,如果修改错误会导致程序无法运行
2、利用x32dbg反汇编修改软件
挺有意思的,要有点耐心!
2.1、改程序名
2.1.1、小改
之前用Restorator修改了主页面左上角的程序名,发现并没有更改成功,这可能是因为后面软件又用其他文字覆盖了一次,所以我决定用x32dbg来改
x32dbg搜索字符串,找到第一行,这个就是没修改成功,被覆盖掉的软件名,双击过去
看到 push scylla_x.C732B4了吗,这是把软件名给push进去,右键在内存窗口中转到对象地址,注意是push的对象的地址(这个对象才是存名字的地方),不是那句push本身
然后看左下角,切换为Unicode显示,是不是找到了?
先简单测试,把版本号更新一下
2.1.2、大改
2.1.2.1、开辟区段
接下来我想要把程序名改为 "Scylla x86 v0.9.8 Edited by Mozhongzhou"发现留下的空间不够大。
准备开辟一个新区段用于存放程序名,等会修改push过去
虽然x32dbg可以用alloc分配内存,但感觉不如开辟新区段(用到软件StudyPE)
区段大小留大点没关系,后面可以用来做别的事情
2.1.2.2、禁用ASLR
把软件ASLR禁用一下,避免出现重定向的问题的可能性
2.1.2.3、创建新的软件名
右键->在内存窗口中转到
地址多框选点没关系,右键->二进制编辑->编辑
把UNICODE给改了,记住现在数据的位置,00484000
找到之前的软件名,alt+r查找引用,看看哪些地方push过这个软件名的,都改了
双击过去,空格,把他push的地址改为我们自己加的名字所在的地方
同理第二个也是这样
Ctrl+p导出,注意不应有重定向等错误提示,否则查一下是不是哪一步没做?
效果展示:左上角的软件名、帮助、关于里的软件名都已更改
2.2、改下捐赠信息?
不太道德,我就不改了
另外:一定要遵守法律法规,尊重知识产权保护!
3、加弹窗(进阶)
先看效果: 双击软件,先弹出52pojie,点击确认或关闭后再弹出软件
思路:先确认有没有弹窗API,有则调用,没则自加;再开辟区段存放弹窗信息、弹窗入口点以及返回跳转;最后将程序入口点改为弹窗入口点即可!
3.1、用Stud_PE查找弹窗API
3.1.1、在user32.dll中能够找到现成的API
这里用到Stud_PE,打开软件,函数->user32.dll->查找有没有MessageBoxA或者MessageBoxW
找到MessageBoxW,没找到MessageBoxA,这里记住MessageBoxW的rav2iat:0004D36C
解释:RVA(Relative Virtual Address, 相对虚拟地址)是指相对于模块基地址的偏移量。
-
模块基地址
:
- 模块基地址是指模块(如DLL或EXE文件)在内存中加载时的起始地址。
- 每个模块在加载到内存时都会有一个基地址,这个地址是操作系统分配的。
-
RVA(相对虚拟地址)
:
- RVA 是相对于模块基地址的偏移量。
- 例如,如果模块基地址是
0x10000000
,而某个函数的 RVA 是 0x00002000
,那么该函数的实际内存地址就是 0x10000000 + 0x00002000 = 0x10002000
。
3.1.2、假如没找到现成的API,也可以自己加
程序一样肯定是找得到的,但假如我们在user32.dll中既没找到MessageBoxA也没找到MessageBoxW,还有办法解决,自己搞一个API即可。
这里还是用到Stud_PE,右键 输入函数 框内->添加新的输入表
DLL选择->C盘,Windows,System32,user32.dll
选择函数->找到之前没找到的MessageBoxA(快速定位它的办法:随便点击一下函数,然后在键盘上按顺序敲这个API的字母,例如敲MESSAGE 它会自动搜索定位,这种方法同样适用于文件系统搜寻文件的情况)
加入到清单->加入 可以看到最下面有一个user32.dll,而里面只有MessageBoxA,同样记住它的rva2iat:00094123
3.2、开辟区段存放弹窗信息
3.2.1、开辟区段
参考2.1.2.1用Stud_PE或者StudyPE来开辟一个新区段
3.2.2、为MessageBoxW准备弹窗
x32dbg启动软件后从内存布局双击.52POJIE来到区段,上面为反汇编区域,下面为内存区域
先把“52pojie”弹窗标题存放好,UNICODE输入52pojie
再存放弹窗内容“吾爱破解”,unicode输入吾爱破解
左下角不显示中文?
这下看懂了
以上准备好了MessageBoxW的弹窗标题和内容
记住标题地址0x00484050 ;内容地址0x00484060
3.2.3、为MessageBoxA准备弹窗
弹窗标题,ASCII 52pojie
弹窗内容
3.3、区段存放弹窗入口点
MessageBoxA和MessageBoxW都需要四个参数
注:MessageBoxW和MessageBoxA的相同点和区别?
相同点:MessageBoxW
和 MessageBoxA
的相同点包括:
- 功能相同:两者都用于显示一个包含消息和按钮的对话框。
- 参数相同:两者的参数类型和数量相同,只是字符类型不同。
- 返回值相同:两者都返回一个整数值,表示用户点击的按钮。
- 使用场景相同:两者都可以用于提示用户信息、显示错误消息或询问用户确认操作。
最主要的区别是:
- MessageBoxW 使用 Unicode 字符集,可以更好地适配多语言环境,包括中文、日文、韩文等需要多字节表示的字符。
- MessageBoxA 使用 ANSI 字符集,主要适用于单字节字符编码的语言,如英语和其他基于拉丁字母的语言。
因此,MessageBoxW
更适合处理需要支持多语言和国际化的应用程序,而 MessageBoxA
主要适用于只需要处理单字节字符集的应用程序。
3.3.1、准备MessageBoxW
堆栈是后进先出,大致要干这几件事
push 00
push title
push content
push 00
call MessageBoxW
jmp oep
右键00484090在反汇编中转到-(空格)汇编于00484090,依次几行输入
第一个00用于uType
这是标题所在位置
这是内容所在位置
这个00用于hWnd
记得之前查到的rva吗
MessageBoxA: 00094123
MessageBoxW:0004D36C
我们的程序基址00400000,基址+rva偏移得到位置
那么我们MessageBox:0044D36C
MessageBoxA: 00494123
很合理吧,MessageBoxW存放在rdata区段;MessageBoxA是我们自己加的,所以地址在newimp区段
call [0x0044D36C] 间接调用MessageBoxW,
或者call MessageBoxW 也可以
最后弹窗完了跳回OEP
Ctrl+P备份一下,存到另外一个名字的备份去,否则等会测试完内存的修改就没了
测试 从第一个push的参数开始,右键->在此设置EIP
跑完call是不是就有弹窗了啊?
然后又回到OEP了,这就是我们希望的,弹窗结束就跳回OEP
3.3.2、准备MessageBoxA
再到下面空白的段找一块,来push MessageBoxA所需参数
标题和内容,注意一定要push用ASCII写的那个,如果你push UNICODE编码的那个一定会乱码
同样的 call MessageBoxA 或者call [0x00494123]
最后jmp回到oep即可
3.4、更改程序入口点
以MessageBoxW为例
从第一个push00开始00484090
用Stud_PE打开程序->Rva<=>Raw -> 虚拟地址,输入MessageBoxW从push00开始的地址->得到相对虚拟地址84090->将入口点(虚拟地址)改为00084090->转存到文件(注意要关闭任何打开该应用的程序)
测试成功
第三课全流程结束
写在最后
感谢所有无私奉献的坛友:
- 感谢所有在论坛中无私奉献的朋友们,你们的贡献使得知识得以传播和共享。
本文只是对吾爱破解教程的流程记录:
- 本文仅是对吾爱破解教程的流程记录,算是一个比较老的教程了,希望对大家有所帮助。
所有虚拟机、测试工具、测试软件均可在52pojie官网论坛和"可能用到的链接"中下载!