首页
社区
课程
招聘
[讨论]这个标题怎么修改
发表于: 2014-7-21 11:20 14803

[讨论]这个标题怎么修改

2014-7-21 11:20
14803
这个记事本是我自己用DELPHI写的,没有加密,加壳,但我想在OD中修改下标题用以下方法
1寻找字串法
2代码法a)setwindowtext
         b)createwindow
以上两种方法根本找不到标题
3运行后alt+m能找到,但没法修改。
请问,怎么修改这个软件标题,麻烦给个思路。
下载:     记事本

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (28)
雪    币: 76
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我是菜鸟,自己用的方法总结下:
方法一:用资源管理工具,如PE Explorer、ExeScope、ResScope。
方法二:OD,C32直接搜索字串修改
方法三:代码法(这里我自制别人一个例子)
     
   设置API断点“bpSetWindowTextW”,也就是说我认为该软件的标题可能是使用SetWindowTextA或者SetWindowTextW设置上去的,而不是在编程时直接通过资源设置好的。设置好API断点后,运行程序。第一次中断在我们的SetWindowTextW函数处时,观察栈窗口,并不是我们要找的断点,让它继续运行。当第二次被中断到我们的SetWindowTextW函数处时,正是我们要找的地方,查看OD的栈窗口。从栈窗口中我们看到了我们要的标题字符串,我们显示“00E689B8”处的内存数据到OD的数据窗口中。在数据窗口中我们可以看出,字符串是以UNICODE形式保存的,只要我们直接修改程序文件中该位置的UNICODE字符串就可以达到我们修改标题的目的了。我们用LordPE查看该虚拟内存地址所对应的文件偏移地址。用LordPE打开“RosettaStoneVersion3.exe”,通过“位置计算器”进行计算“00E689B8”虚拟内存地址的文件偏移地址,但是却提示“超出范围”,这样说明在程序中没有与“00E689B8”所对应的文件偏移地址。我们回到OD中通过内存窗口查看“00E689B8”所属的位置,该虚拟内存地址应该是一块堆地址,堆是进程动态申请到的内存地址。因此,我们无法通过直接修改可以执行文件程序来修改该地址的字符串,因为文件中没有文件偏移地址与此地址对应;当然也同样无法通过直接修改该虚拟内存地址来修改该地址的字符串,因为修改后堆地址无法保存到程序文件中,下次启动时仍然无法显示我们修改后的标题。

既然上面的方法不行,我们就从只能从它的代码上做手脚了。我们按下ALT+F9返回对SetWindowTextW函数的调用,看对SetWindowTextW函数调用的反汇编代码,代码如下:

00404646    CC              INT3

00404647    CC              INT3

00404648    CC              INT3

00404649    CC              INT3

0040464A    CC              INT3

0040464B    CC              INT3

0040464C    CC              INT3

0040464D    CC              INT3

0040464E    CC              INT3

0040464F    CC              INT3

00404650    8B4424 04       MOV EAX,DWORD PTR SS:[ESP+4]

00404654    8378 18 08      CMP DWORD PTR DS:[EAX+18],8

00404658    72 11           JB SHORT 0040466B

0040465A    8B40 04         MOV EAX,DWORD PTR DS:[EAX+4]

0040465D    50              PUSH EAX

0040465E    8B41 60         MOV EAX,DWORD PTR DS:[ECX+60]

00404661    50              PUSH EAX

00404662    FF15 44F44B00   CALL DWORD PTRDS:[<&USER32.SetWindowTex>; user32.SetWindowTextW

00404668    C2 0400         RETN 4

SetWindowTextW函数有两个参数,该函数的第二个参数是用来指向字符串的指针。从反汇编代码中看,调用SetWindowTextW函数时,第二个参数入栈的地址为0040465D,也就是push eax这句代码,也就是说eax这个地址中保存的是标题的UNICODE字符串,只要我们将eax中保存的地址进行改变,并且改变后的地址中保存的是我们要更改的标题字符串就可以了。既然有了新的思路,那么我们就在程序中找一处空白的地方添加我们要修改的字符串。可是,SetWindowTextW需要的是一个UNICODE字符串,而不是普通的ASCII字符串,我们如何得到“MoNi YingYu XueXi XiTong”的UNICODE字符串编码呢?我们打开文本编辑器我们输入“MoNi YingYu XueXi XiTong”字符串,在保存文本的时候,在通用对话框的最下面选择编码方式为“UNICODE”,然后用C32ASM打开该文本,就可以获得该字符串的UNICODE编码了。

我们在哪个位置保存字符串呢,在PE文件中有很多地方供我们保存字符串,我们用LordPE来打开该程序,查看该软件的区段,我们选择在“.rdata”段中保存字符串,为了方便找到.rdata段中的空白位置我们从.data的起始位置处向上找。用C32ASM打开我们的可执行程序,来到.data段处的文件偏移处000EF000,我们看到该地址的上方就有空白位置,我们在程序的文件偏移000EEFB0处插入字符串的UNICODE编码并保存。我们用LordPE打开我们的添加过字符串后的文件,计算文件偏移地址对应的虚拟内存地址,文件偏移地址“000EEFB0”对应的虚拟内存文件地址为“004EEFB0”。

我们既然有了字符串的虚拟内存地址,那么我们就可以改变前面提到的eax中保存的地址了。用OD打开我们的添加过字符串的可执行文件,来到00404646地址处,修改反汇编代码,修改后的代码如下:

00404646    B8 B0EF4E00     MOV EAX,004EEFB0

0040464B    90              NOP

0040464C    EB 0F           JMP SHORT 0040465D

0040464E    CC              INT3

0040464F    CC              INT3

00404650    8B4424 04       MOV EAX,DWORD PTR SS:[ESP+4]

00404654    8378 18 08      CMP DWORD PTR DS:[EAX+18],8

00404658    72 11           JB SHORT 0040466B

0040465A  ^ EB EA           JMP SHORT 00404646

0040465C    90              NOP

0040465D    50              PUSH EAX

0040465E    8B41 60         MOV EAX,DWORD PTR DS:[ECX+60]

00404661    50              PUSH EAX

00404662    FF15 44F44B00   CALL DWORD PTRDS:[<&USER32.SetWindowTex>; user32.SetWindowTextW

00404668    C2 0400         RETN 4

我们将原来对eax进行赋值的位置修改为了JMP指令,然后跳转到上面的00404646地址处,这里原来都是INT3指令,这些指令在程序中并不被执行,因此我们在这里添加了我们的代码,首先是moveax,004EEFB0,执行这句会让我们的字符串的地址赋值给eax,然后在JMP到push eax的地址处,也就是字符串入栈的地址处。修改后直接保存修改过的反汇编代码,我们直接运行程序。发现程序的标题处已经成为新的标题了。
2014-7-21 11:23
0
雪    币: 123
活跃值: (159)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
Project1.rar
看看这个?
上传的附件:
2014-7-21 12:32
0
雪    币: 123
活跃值: (159)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
.text:4068F7这个调用创建了窗口标题(第一次中断,以后就不是了,估计这个是系统函数,用来初始化框架的)
2014-7-21 12:36
0
雪    币: 5
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
用OD可以改
2014-7-21 12:44
0
雪    币: 102
活跃值: (50)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
delphi的,用IDR,DeDe啊
2014-7-21 12:52
0
雪    币: 76
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
改一个传上来,希望说一下思路,大家学习下。
2014-7-21 13:16
0
雪    币: 123
活跃值: (159)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
3楼不是都改了一个给你了吗。。。。。。
2014-7-21 14:10
0
雪    币: 2980
活跃值: (2754)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
Project1.rar
很简单的东东呀
上传的附件:
2014-7-21 16:10
0
雪    币: 102
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
楼上大神怎么都不解释太简单了吗?

P.S. 楼主的皮肤好看, 这个是什么皮肤?
2014-7-21 17:44
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不会,,跟了一下没找到在哪!大神们支个招?
2014-7-21 17:48
0
雪    币: 559
活跃值: (349)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
Restorator 、eXeScope资源编辑工具 改下
2014-7-21 18:41
0
雪    币: 76
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这是一种方法,我想知道OD调试法。
2014-7-21 21:24
0
雪    币: 76
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
businessskin
2014-7-21 21:29
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
冲着id近来的。。。
2014-7-21 22:13
0
雪    币: 76
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
是且OD改的吗?能不能给人思路?我感觉CREATEWINDOW断在第二个class为Tform1时可用Patch法,你们用什么方法?
2014-7-22 16:25
0
雪    币: 123
活跃值: (159)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
最好不要用patch法(因为光从中断次数来判断是不是你要改的标题会不可靠,万一哪天环境变了就改错了)
简单的方法是去下个资源修改器 找到TFORM1,里面有个CAPTION选项,改了就行
设置窗口的代码并不在你的程序里面,是由DELPHI的运行库函数初始化的(我估计你是在TFORM的CAPTION属性中设置窗口标题的)
如果你在程序初始化的代码中加入了自己的代码,显式的将窗口标题设置为某个字串,这样就能够改代码实现修改窗口标题
2014-7-22 16:29
0
雪    币: 76
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
关键是有的程序用资源修改器没法修改,才想用OD来改的,比如这个程序你改下看能不能改了标题
上传的附件:
2014-7-22 16:54
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
bp CreateWindowExA 第二次段下来   第3个参数就是了   数据窗口跟随  修改保存
2014-7-22 21:37
0
雪    币: 123
活跃值: (159)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
这个得使用程序字符串修改+图片修改
这个算是特例,比较复杂,我改得有点难看(主要是我不会画图
不过算是改好了
截图2.rar
上传的附件:
2014-7-23 15:52
0
雪    币: 76
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
[QUOTE=acqqer;1303078]这个得使用程序字符串修改+图片修改
这个算是特例,比较复杂,我改得有点难看(主要是我不会画图
不过算是改好了
截图2.rar[/QUOTE]

标题是图片吗?用资源编辑器打显示:“含有非标准资源,可能被EXE压缩器压缩了”,高人!能不能指点下?
2014-7-23 22:22
0
雪    币: 123
活跃值: (159)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
用DEDE反编译,找到TMainPanel(没错!这货就是装TPanel的容器,TPanel是甚?TPanel就是现实FastStonexxx的那个标题栏)
这个里面有多个picture.data = {xxxxx}
把第一个找出来  里面的16进制数据全部拷出来 拷到一个文件(以Ascii Hex模式拷贝)
然后改名bmp  打开这个bmp,你应该就能看到这个是标题栏的内容,手动修改就可以了

但是替回去会比较麻烦,你得从DEDE里面找到TMainPanel的偏移地址,找到这个地址,向下翻,翻到第一个BMxxx(xxx是乱码)的位置,从这个位置开始找到为FF 00 00的数据的位置 这个是结尾,将这一段数据用你刚才修好的BMP文件替换掉(两个长度其实是一致的  不一致说明你操作有问题)
替换掉之后就ok了

还有,你是在破解这个程序对吧?你是爆破了注册部分对吧?其实有一个更简洁的手段,直接启动后就注册了,而且连输入注册码的菜单项都没了,只是关于里面会显示未注册版,但是不影响功能:

http://bbs.pediy.com/showthread.php?t=189454 15楼

mov eax,00725350
mov eax,dword ptr ds:[eax]
mov eax,dword ptr ds:[eax]
mov eax,dword ptr ds:[eax+640]
mov dword ptr ds:[eax+30],10
最后一个数值决定了注册数量(也就是个人版啊  企业版之类的)
第一个mov eax,xxxx这个数值你得自己跟一下,如果你破过了你应该看到关键点了  就在那个关键点附近 注册成功后代码会向某个变量写入一个数值,大致代码的意思跟我上面列的很相似
还有  这段代码不能在程序开始跑的时候立刻运行,否则access violation
要在某个call 之后才能跑(估计是初始化内存)
至于是哪个call   大概是oep后   弹出窗口前面的第2~3个CALL   你可以逐一尝试
我只能帮到这里了。。。。。
2014-7-24 14:00
0
雪    币: 76
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
是的,已经脱壳和爆破,只是标题一直找不到,谢谢你的教诲,回去我再好好研究下。
2014-7-24 14:20
0
雪    币: 76
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
又出现问题了,不好意思!
上传的附件:
2014-7-25 15:35
0
雪    币: 123
活跃值: (159)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
当然是不可编辑区域
你应该把这一段拷出来,然后以二进制形式 用winhex拷回去
2014-7-25 15:55
0
游客
登录 | 注册 方可回帖
返回