能力值:
( 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的地址处,也就是字符串入栈的地址处。修改后直接保存修改过的反汇编代码,我们直接运行程序。发现程序的标题处已经成为新的标题了。
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
|
能力值:
( LV4,RANK:50 )
|
-
-
4 楼
.text:4068F7这个调用创建了窗口标题(第一次中断,以后就不是了,估计这个是系统函数,用来初始化框架的)
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
用OD可以改
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
delphi的,用IDR,DeDe啊
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
改一个传上来,希望说一下思路,大家学习下。
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
3楼不是都改了一个给你了吗。。。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
|
能力值:
( LV4,RANK:50 )
|
-
-
10 楼
楼上大神怎么都不解释太简单了吗?
P.S. 楼主的皮肤好看, 这个是什么皮肤?
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
不会,,跟了一下没找到在哪!大神们支个招?
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
Restorator 、eXeScope资源编辑工具 改下
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
这是一种方法,我想知道OD调试法。
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
businessskin
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
冲着id近来的。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
是且OD改的吗?能不能给人思路?我感觉CREATEWINDOW断在第二个class为Tform1时可用Patch法,你们用什么方法?
|
能力值:
( LV4,RANK:50 )
|
-
-
17 楼
最好不要用patch法(因为光从中断次数来判断是不是你要改的标题会不可靠,万一哪天环境变了就改错了)
简单的方法是去下个资源修改器 找到TFORM1,里面有个CAPTION选项,改了就行
设置窗口的代码并不在你的程序里面,是由DELPHI的运行库函数初始化的(我估计你是在TFORM的CAPTION属性中设置窗口标题的)
如果你在程序初始化的代码中加入了自己的代码,显式的将窗口标题设置为某个字串,这样就能够改代码实现修改窗口标题
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
关键是有的程序用资源修改器没法修改,才想用OD来改的,比如这个程序你改下看能不能改了标题
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
bp CreateWindowExA 第二次段下来 第3个参数就是了 数据窗口跟随 修改保存
|
能力值:
( LV4,RANK:50 )
|
-
-
20 楼
这个得使用程序字符串修改+图片修改
这个算是特例,比较复杂,我改得有点难看(主要是我不会画图  )
不过算是改好了
截图2.rar
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
[QUOTE=acqqer;1303078]这个得使用程序字符串修改+图片修改
这个算是特例,比较复杂,我改得有点难看(主要是我不会画图  )
不过算是改好了
截图2.rar[/QUOTE]
标题是图片吗?用资源编辑器打显示:“含有非标准资源,可能被EXE压缩器压缩了”,高人!能不能指点下?
|
能力值:
( 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 你可以逐一尝试
我只能帮到这里了。。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
是的,已经脱壳和爆破,只是标题一直找不到,谢谢你的教诲,回去我再好好研究下。
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
|
能力值:
( LV4,RANK:50 )
|
-
-
25 楼
当然是不可编辑区域
你应该把这一段拷出来,然后以二进制形式 用winhex拷回去
|
|
|