能力值:
( LV6,RANK:90 )
|
-
-
2 楼
其实我的要求只是可以运行一般的DELPHI程序,那些真正用到TLS CALLBACK FUNCTION的我都不支持。
|
能力值:
(RANK:350 )
|
-
-
3 楼
那你直接将DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS]所指的数据复制到外壳里,并修正DataDirectory。应可以运行的。
|
能力值:
( LV6,RANK:90 )
|
-
-
4 楼
[QUOTE=kanxue;367864]那你直接将DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS]所指的数据复制到外壳里,并修正DataDirectory。应可以运行的。[/QUOTE]
但是加过壳的程序的基址是0x3F0000,原程序的基址是0x400000,
我已经复制了
memcpy(LdrTlsDir,ExeTlsDir,sizeof(IMAGE_TLS_DIRECTORY32));
也修正了DataDirectory
LdrPEoffset->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].VirtualAddress=0x7e00;
LdrPEoffset->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].Size=0x18;
还是不行啊……
|
能力值:
( LV6,RANK:90 )
|
-
-
5 楼
我看了一下别人的代码,都是直接复制TLS那0x18个字节再修正DataDirectory的。我和他做的事情一样啊,为什么我的就不行呢? 是不是一定要在我的Loader里写一句TLSAlloc()?
;;;;;;;;;;;;;对TLS的处理
mov eax,FileBuffer
add eax,NtHeaderRav
assume edi:ptr IMAGE_NT_HEADERS
mov edi,eax
mov esi,[edi].OptionalHeader.DataDirectory[9*SIZE IMAGE_DATA_DIRECTORY].VirtualAddress
;;;;判断是否有线程局部存储
.if esi!=0
add esi,MapOfFile
mov eax,TlsTable-shellcode0
add eax,NotPackResDataSize
add eax,SizeOfImage
mov [edi].OptionalHeader.DataDirectory[9*SIZE IMAGE_DATA_DIRECTORY].VirtualAddress,eax
mov edi,TlsTable-shellcode0
add edi,shell0buf
mov ecx,18h
rep movsb
.endif
assume edi:nothing
|
能力值:
( LV15,RANK:930 )
|
-
-
6 楼
加壳的时候要注意,如果 tls callback 数组的值个数非 0,就不能简单的拷贝一份。
你需要构造一份 dummy callback, 先有自己接管处理。
如果在原 code 没有解开之前,发生调用要立即返回,不要往下传递。其他情况,call 一下 原 tls callback 就可以了.
在解原 code 的时候完成后,要修正系统自动分配的 tls (这块数据是由于没有解压,导致系统错误拷贝的数据)。
|
能力值:
( LV15,RANK:2473 )
|
-
-
7 楼
似乎主要不是tls的问题
你的基址是0x3F0000,delphi找不到资源了
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
我也在思考如何处理TLS的问题
|
|
|