首页
社区
课程
招聘
[旧帖] 动态修改DLL重定位表某处的值 0.00雪花
发表于: 2008-9-27 19:28 8636

[旧帖] 动态修改DLL重定位表某处的值 0.00雪花

2008-9-27 19:28
8636
Dll已经被加载,导出表的虚拟地址是10003456,若想用OD在空白处添加代码,然后用lordPE修改入口的方式动态修改导出表某处的值,可以这样用吗:

Mov edi,10003456h
mov al,0f3h
stosb
jmp 原入口

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不好意思,标题错了,是导出表,不是重定位。

但我试了一下,单步运行到stosb时OD就报错,然后OD自动终止调试。
不知道是重定位的问题还是加载过后就不能再修改导出表了?
还是没有权限?
2008-9-27 19:46
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
理论上可以,指令用法没错,看你用的时机!
2008-9-28 01:03
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
那个传入edi的地址是固定的啊,需要重定位吧?
2008-9-28 01:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
To 3楼 peeler:
你说的时机是什么意思?莫非是基址必须为10000000的时机?还是其他?

TO 4楼 icersg:
我只是先试验一下,因为基址就是100000000,可先不重定位.若修改导出表数据成功再去重定位,不知道我的想法有没有错误?
2008-9-28 09:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
请高手指教,谢谢
2008-9-29 11:31
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
今天自己学着改了一下dll,也许对楼主有帮助,我不是编程改的函数地址,直接用LordPE修改的。修改user32.dll的MessageBoxA,让HelloWorld12345变成HelloKitty12345。

图-------0


程序中其中LoadLibrary主要是为了载入D盘下的user32.dll而不是系统目录下的user32.dll,因为是自己写的程序,知道HelloWorld12345可以修改,不然如果内存不可写的话会出错。

.386
.model flat, stdcall
option casemap:none

include WINDOWS.INC
;include user32.inc
include kernel32.inc
;includelib user32.lib
includelib kernel32.lib

	.data
szMsg		db	"HelloWorld12345",0
szUser32	db	"D:/user32.dll",0
szMsgBoxA	db	"MessageBoxA",0

	.data?
hUser32		dd	?
hMsgBoxA	dd	?

	.code
start:
	
	invoke	LoadLibrary,offset szUser32
	mov		hUser32,eax
	invoke	GetProcAddress,hUser32,offset szMsgBoxA
	mov		hMsgBoxA,eax
	;invoke	MessageBox, NULL, offset szMsg, 0, MB_OK
	
	push	MB_OK
	push	offset szMsg
	push	offset szMsg
	push	NULL
	call	hMsgBoxA

	invoke	ExitProcess, NULL

end	start



把user32.dll从系统目录下面复制一份到D盘,下面所有的操作都在这个D盘上的user32.dll上面改。

用PEiD打开user32.dll,看到入口点RVA是0000B217。

图-------1


来看看都有哪些Section (点EP Section右边的> ),在.text段上面点右键,选Cave Finder

图-------2


图-------3


.text 段在0006028A地方有空间,还有000000176字节,够用了。用OD载入user32.dll,停在入口点0087B217。
基地址=0087B217-0B217=00870000

图-------4


在命令行里打入 d 00870000+6028A 来到我们刚才找到的空位。

图-------5


找个好地方,干脆就从008D0290开始写我们的代码吧。在反汇编窗口写比较方便,用 d MessageBoxA 可以看到原来 MessageBoxA函数的地址

图-------6


写好了之后就收工吧,选Copy to executable > All Modifications > Copy All > Save File,换个名字 myuser32.dll。

图-------7


图-------8


myuser32.dll现在还不能用,代码虽然写到里面了,但是还要改映射到内存的大小和MessageBoxA的RVA。用LordPE改吧。载入myuser32.dll,选Section,把VSize从0005F283改成0005F2C0,因为我们的代码从OD上看在008D0290到008D02B6。稍微让它多映射一点比如到008D02BF,这样换算成VSize=8d02BF-871000+1=5F2C0。

图-------9


图-------10


改MessageBoxA的RVA,选Directories > Export Table ... > MessageBoxA > Edit...,把RVA从000407EA改成60290,因为8d0290-870000=60290

图-------11


图-------12


最后修复一下Checksum,保存。把myuser32.dll改名成user32.dll测试一下。果然能用了。

图-------13


上传的附件:
2008-9-29 16:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
明白楼上的意思,直接修改参数区,把Hello*****12345改为HelloKitty12345,
这样的话MessageBoxA的入口点在输出表的地址数组中会改变。但是地址数组的位置是不会改变的,有点象C的指针的指针。拿旅馆住客举例,虽然房客变了,但房子的位置(或门牌号)在管理员的数据表里是不会变的。而杀毒软件认定的特征码就定位在“房子数据表”里面,因此这种修改方法还是会被杀软Kill.
2008-9-29 17:34
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
具体情况是这样的:
因为DLL的导出表被杀毒软件查杀,查杀的特征码就是那处的0f3h,如果我把文件中的0f3h用C32改为00后就不杀了,但是DLL文件也失去了作用,所以我想在DLL刚被加载的时候就自己去修改那处的00变为0f3,但不知道怎样写代码才合适
2008-9-29 17:50
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
你说的方法我也试了,还拿刚才的例子说吧,我把MessageBoxA的RVA改回原始的000407EA。

用OD载入user32.dll,停在入口点

0087B217 > $  8BFF          mov     edi, edi
0087B219   .  55            push    ebp
0087B21A   .  8BEC          mov     ebp, esp
0087B21C   .  837D 0C 01    cmp     dword ptr [ebp+C], 1
0087B220   .  75 05         jnz     short 0087B227
0087B222   .  E8 5D070000   call    0087B984
0087B227   >  5D            pop     ebp

前3条指令正好5个字节,改成jmp到空白地方,如下

0087B217 > $ /E9 A4500500                jmp     008D02C0
0087B21C   . |837D 0C 01                 cmp     dword ptr [ebp+C], 1
0087B220   . |75 05                      jnz     short 0087B227
0087B222   > |E8 5D070000                call    0087B984
0087B227   > |5D                         pop     ebp

来到空白地方

008D02C0   > \8BFF                       mov     edi, edi                  ;  恢复原始入口的3条指令
008D02C2   .  55                         push    ebp                       ;  
008D02C3   .  8BEC                       mov     ebp, esp                  ;  
008D02C5   .  60                         pushad
008D02C6   .  E8 00000000                call    008D02CB                  ;  将下一条指令地址压入堆栈
008D02CB   $  58                         pop     eax                       ;  让eax等于此指令地址
008D02CC   .  2D 33C20500                sub     eax, 5C233                ;  让eax指向原MessageBoxA RVA 000407EA
008D02D1   .  C700 90020600              mov     dword ptr [eax], 60290    ;  修改成新的RVA 00060290
008D02D7   .  61                         popad
008D02D8   .^ E9 45AFFAFF                jmp     0087B222                  ;  返回原dll入口第4条指令

其中
008D02CC   .  2D 33C20500                sub     eax, 5C233
这句是因为当前 eax=008D02CB,而存放MessageBoxA RVA的地址在00874098,所以减去偏移量0005C233。修改好了保存dll。从OD的内存列表可以看出,这里00874098是属于.text段,所以要用LordPE把.text段属性改成可写,不然dll载入会出错。最后修正Checksum就能用了,效果和前面改MessageBoxA地址是一样的。
2008-9-29 21:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
望了谢谢楼上了。
Thank You very much.
2008-9-30 13:53
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不客气,我也学到了不少东西。
2008-9-30 14:15
0
游客
登录 | 注册 方可回帖
返回
//