能力值:
(RANK:260 )
|
-
-
2 楼
初步知道了点。
跟踪一下Dll的入口函数,发现它先是一段虚拟机的引擎,虚拟执行三段“虚拟机”指令后,我跟到一个地方:
0098366F ->JMP My2.0092131A
00983674 >INT 2E
00983676 >PUSH 10037704
0098367B ->JMP My2.0092131A
00983680 >INT 2E
00983682 >PUSH 1003789E
00983687 ->JMP My2.0092131A
0098368C >PUSH 9BA7337F
00983691 ->JMP My2.0092131A
到int 0x2e指令时,寄存器的值为:
EAX 000000E5
ECX 0006F630
EDX 0006F630
EBX 00920000 My2.00920000
ESP 0006F630
EBP 0006F770
ESI 00000001
EDI 00000000
EIP 00983680 My2.00983680
C 0 ES 0023 32位 0(FFFFFFFF)
P 1 CS 001B 32位 0(FFFFFFFF)
A 0 SS 0023 32位 0(FFFFFFFF)
Z 1 DS 0023 32位 0(FFFFFFFF)
S 0 FS 003B 32位 7FFDE000(FFF)
T 0 GS 0000 NULL
D 0
O 0 LastErr ERROR_INVALID_HANDLE (00000006)
EFL 00000246 (NO,NB,E,BE,NS,PE,GE,LE)
查了一下,在WinXP上,0xe5号系统调用是NtSetInformationThread
edx指向参数块:
0006F630 FE FF FF FF 11 00 00 00 00 00 00 00 00 00 00 00 ?...........
0006F640 9A 3D 98 00 01 00 00 00 60 61 62 63 64 65 66 67 ??...`abcdefg
0006F650 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 hijklmnopqrstuvw
0006F660 78 79 7A 7B 7C 7D 7E 7F AE 2C 93 7C E4 2C 93 7C xyz{|}~?搢?搢
0006F670 51 2D 93 7C 58 2D 93 7C 3C 00 00 00 E0 1E 18 00 Q-搢X-搢<...?.
0006F680 08 02 00 00 20 20 20 20 78 F6 06 00 20 20 20 20 .. x?.
0006F690 E8 F6 06 00 00 00 00 00 00 00 00 00 FF FF FF FF 桷.........
由于手头资料不全,不知道这个参数块的大小,更不知道具体结构。
但确定的是,从这里进入内核后便不再返回,因此进程陷入了内核不返回了。
不知道你是从哪里弄到的这个DLL文件,也不知道它是干什么用的。
刚开始分析,看到它的虚拟机引擎,对一堆虚拟机指令解码,还以为这个DLL是个虚拟机呢。
结果只要一放开跑,OD马上失去了对它的控制。
于是慢慢跟了一下,发现它直接进行了系统调用,进内核了。
我所不理解的是,这个系统调用不返回,不知道是什么原因,因为目前得不到参数的详细解释。
哪位手里有WDK的相关资料,帮忙解释一下NtSetInformationThread这个系统调用的参数。
如果需要更多信息,可以补发。
帮帮忙,我喜欢追根问底。
|
能力值:
(RANK:1060 )
|
-
-
3 楼
看情况很像sddyn啊
|
能力值:
(RANK:260 )
|
-
-
4 楼
请问forgot版本,sddyn是嘛壳??
本人对壳不甚了解。
我分析时,确实看到导出函数是名sddyn的。
|
能力值:
(RANK:1060 )
|
-
-
5 楼
11=ThreadHideFromDebugger
|
能力值:
(RANK:260 )
|
-
-
6 楼
明了。
那sddyn这个东西除了反调试,还有别的作用吗?
我看到它导出不止一个函数。
还有,sddyn这个东西是什么人弄的。
我百度和谷歌上找,结果全是什么网络游戏的。
原来盛大的游戏用这个反调试了。
还有个问题,它先前执行那几段虚拟机是有用的代码还是可以直接去掉呢?
呵呵,问题太多了,麻烦了。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
果然是sddyn,我朋友让我弄这个,说只要LOAD成功请我吃饭,我问了他下,是盛大某个游戏的。
谢谢两位的关注。
请问forgot ,您的意思是它用了ThreadHideFromDebugger 这种反调试技术吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
刚在本论坛查了下应该是这个
ZwSetInformationThread(GetCurrentThread( ), ThreadHideFromDebugger, NULL, 0)
但我不明白的是,它影藏线程,和我Load它有什么关系哪?
|
能力值:
(RANK:260 )
|
-
-
9 楼
这是隐藏线程,而是让线程脱离调试器的控制。
既然已经找到它反调试的方法,patch一下就可以了。
你朋友的这客是请定了。呵呵
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
书呆彭 谢谢您了! 你能不能说下你过那几处虚拟机指令的方法,我用的SOFTICE跟踪,在那几处指令里面出不来,到不了你说的这个位置。
我按照你图的位置把 mov edx,dr3 patch成了nop,后OD可以调试了,但我LoadLibrary还是退出?
主要是我太菜了,呵呵。能不能说详细点,或者把你patch过dll文件发给我邮箱,liurenf@163.com
|
能力值:
(RANK:260 )
|
-
-
11 楼
这个不好描述,它的anti的代码是动态的,在载入后看并不是那个样子,而是在执行那几段解码的过程中,将指令修改成为调用NtSetInformationThread反调试的。
所以patch只能在它将代码修改完之后打内存补丁。
静态patch程序没有意义,因为它修改执行代码使用的是虚拟执行,而且数据加密,无法确定应该如何patch(或者如果可能,至少静态patch很难)。
我可以告诉你最后结果,就是用OD载入后,直接在00983680下内存断点,使用命令
he 00983680
然后执行,当被断下来时,可以看到00983680处的指令已经变成了int 2e
将这个系统调用nop掉,或直接修改eip,则DllMain()函数可以顺利执行,dll被成功加载。
至于如何走过前面那几段解码的虚拟指令,很难说清楚,不是我有所保留。
我觉得这很多程度是靠运气,凭感觉的。
当然必不可少的,是耐心。
如果你用OD跟过VB的P-CODE程序,那么可能会有所心得的。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
学习了!
耐心的走了一遍,确实是动态解出的指令.
说来惭愧啊,早就知道这个论坛,可惜没有系统的好好学习这上面的东西,都是有问题了上来问。
结果几年过去了,还是没有进步,希望后来的同志不要学我,不要浮在表面,要深入系统的学啊。
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
好方法!!!学习!!!书呆彭 .................
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
膜拜书呆彭版主。 说的详细明了。
|
能力值:
( LV9,RANK:180 )
|
-
-
15 楼
一起膜拜书呆
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
98366F 地址是动态的?
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
学习了,看来必须对原理要深入的学习
|
能力值:
( LV5,RANK:60 )
|
-
-
18 楼
各位版主功力深厚,学习了。
|
能力值:
(RANK:10 )
|
-
-
19 楼
themida
hs
永恒之塔
不都这样做的?返回8000000就可以
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
学习,学习...........
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
学习,学习...........
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
看了版主的解答,真是豁然开朗啊,连我这个菜鸟都明白很多。谢谢。
|
|
|