WPE|52wpe|我爱WPE

 找回密码
 注册会员
搜索
  • 2848查看
  • 2回复

主题

好友

4976

积分

论坛元老

发表于 2010-1-25 02:22:20 |显示全部楼层
【文章标题】: PE学习之手动添加TLS表
【文章作者】: 下面湿了
【下载地址】: 自己搜索下载
【保护方式】: MASM
【编写语言】: ASM
【使用工具】: C32ASM+OD
【操作平台】: XP SP3
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
最近学习PE,听了Nooby大牛的一席教诲,真是听君一席话,胜读十年书!PE又很难理解,我对TLS表,很有兴趣,于是研究了很久
才摸到了一点门路,于是有了此文。

   首先,我们今天的目标就是,给一个没有TLS表的程序,手动添加一个TLS表,由于程序是一个Hello World,于是,我们要
让程序在提示hello World之前,再提示一个 Helo TLS。好我们开始,
这里特别感谢楼下Nooby的教程。
  下载 (15.21 KB)

2009-2-24 18:50
首先查看PE图解,找到 TLS Table 在Offest 170h,占位8字节,前4位是TLS Table地址,后4位是大小,找一个空地,
先看一下区段数据,我想把TLS放入data段里面,把data区段的属性VOffset=3000,ROffset=A00,Size=200记下
,用C32ASM导入程序,来到A00,我就选择这一块把B00开始,那么B00-A00=100,加上Voffeset=00003100,于是我们在Roffeset170h处
填写00130000


IMAGE_TLS_DIRECTORY32的结构,如下所示:
IMAGE_TLS_DIRECTORY32 STRUCT
    StartAddressOfRawData dd    ?//0
    EndAddressOfRawData dd      ?//0
    AddressOfIndex dd           ?//指向一个空地
    AddressOfCallBacks dd       ?//回调地址
    SizeOfZeroFill dd           ?//0
    Characteristics dd          ?//0
IMAGE_TLS_DIRECTORY32 ENDS
这里解释一下
StartAddressofRawData为TLS数据起始的地址
EndAddressOfRawData为结束的地址
AddressOfIndex是TLS索引的地址
AddressOfCallBacks指向一组以NULL结尾的IMAGE_TLS_CALLBACK函数的地址数组
以上都为地址,这里使用的是VA,而不是RVA了。当修改时这是要注意的地方。
SizeOfZeroFill表明填充TLS变量区域的大小
Characteristics用作保留,可能用作TLS标志。
所以我们先用源程序用OD载入看看,

由于填充Tls Table需要虚拟地址,所以我们这儿必须填写OD载入后看到的地址,上面的表中,AddressOfIndex何
AddressOfCallBacks不可为0,其他填0就OK了。我在OD找了00403040(index),00403050(callback)这两块地方,返回C32,于是在B00处填写
00 00 00 00 00 00 00 00 40 30 40 00 50 30 40 00 00 00 00 00 00 00 00 00
好了,到这里我们距离成功还差一点了,看定义
AddressOfCallBacks是一个回调地址,在该地址出应该填写一个虚拟的回调地址
所以,我们在00403050处应该填写一个回调地址,我们再找一个空地00401050来写详细的callback function,好,我们用C32反载入修改好的程序,
我们ctrl+G来到00403050处,文件地址是00000A50,我们在此打入50104000,
00401050的相对文件地址是00000650,我们在650处修改为90c3
[local]5[/local]
就是 nop retn,
  下载 (23.3 KB)

2009-2-24 18:50
然后搜索hello world,在下面的空地上打入Hello TLS,保存。
保存后,我们用OD载入,来到00401050处,好,开始汇编。
pushad
pushfd
push 0x00
push 0x0040300C                          ; ASCII "Hi"
push 0x00403013                          ; ASCII "Hello TLS"
push 0x00
call dword ptr [0x00402008]               ; user32.MessageBoxA
popfd
popad
ret
然后保存吧。
保存后运行一下试试看,是不是启动何退出的时候都会出现Hello Tls 啊?
--------------------------------------------------------------------------------
【版权声明】: 本文原创于UnPackcN技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

主题

好友

198

积分

注册会员

发表于 2010-2-7 17:22:02 |显示全部楼层
保持沉默,我只是路过
回复

使用道具 举报

主题

好友

578

积分

高级会员

发表于 2010-3-5 22:19:44 |显示全部楼层
有时间再来研究。。
回复

使用道具 举报

快速发帖

您需要登录后才可以回帖 登录 | 注册会员

手机版|Archiver|WPE|52wpe|我爱WPE ( 闽ICP备15009081号 )

GMT+8, 2024-4-30 03:38 , Processed in 0.050598 second(s), 16 queries .

返回顶部