首页
社区
课程
招聘
[7.7更新] UPX ShellExt v1.0 RC6
发表于: 2004-7-7 17:05 26588

[7.7更新] UPX ShellExt v1.0 RC6

2004-7-7 17:05
26588
收藏
免费 2
支持
分享
最新回复 (105)
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
51
最初由 forgot 发布

Offset累加一下.reloc对于dll来说必须修复.参看kanxue的工具.


对我来说,只关心源码,不关心工具,源码哪里下,不过看了看雪的书,好像特别简单,估计我自己可以很快写出,但最好有源码,省得走弯路
2004-7-10 11:09
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
52
你得问看雪要了。delphi的代码用技巧估计也好不到哪里去:D
2004-7-10 11:12
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
53
最初由 forgot 发布
你得问看雪要了。delphi的代码用技巧估计也好不到哪里去:D


满脑子就是crack,恕我直言,你到底对delphi了解多少,你清楚delphi的编译体系,你知道VCL的框架吗,这些都是crack所不能带来的,我用了几年的时间在学习delphi,在用它写程序,你说它博大精深吗?
世界不只有asm,虽然我曾经是asm fans,不过那已经是过去了!
2004-7-10 12:02
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
54
不知道...
2004-7-10 14:42
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
55
已经将代码润色完了,重新写了几个函数,就差最后的fix relocation,先看书了,估计代码不是很麻烦
2004-7-10 16:24
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
56
现在卡在relocation如何还原了,我看了UPXAngela的反汇编代码,有点复杂,其实很简单,有谁能给我贴一下还原的代码(别贴UPX stub的码,我还不至于没看那个)
2004-7-11 00:23
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
57
老大终于来了,我知道如何解决,就是光凭截取的数据肯定会有出错的可能,但在debug时,巧妙设置断点,就能完全正确地截取relocation,我已经明白了uPx的方式了,正在分析,谢谢!
2004-7-11 09:50
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
58
终于有突破了,估计今天能写完全部的代码,关于看雪说的Angela 的缺陷,其实可以完美解决,就是除了获得那个数据块以外,还要知道relocation table中的第一个IMAGE_BASE_RELOCATION结构的VirtualSize,这个值就是断在UPX relocation断点处的 EBX+4 值,然后就可以根据upx relocation table的恢复规矩完美恢复原表,代码实现中...,等我的下个版本发布了,呵呵,所有这些都不需要了, UPX ShelleExt will be the best choice for UPX tools
2004-7-11 14:14
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
59
最初由 dREAMtHEATER 发布
终于有突破了,估计今天能写完全部的代码,关于看雪说的Angela 的缺陷,其实可以完美解决,就是除了获得那个数据块以外,还要知道relocation table中的第一个IMAGE_BASE_RELOCATION结构的VirtualSize,这个值就是断在UPX relocation断点处的 EBX+4 值,然后就可以根据upx relocation table的恢复规矩完美恢复原表,代码实现中...,等我的下个版本发布了,呵呵,所有这些都不需要了, UPX ShelleExt will be the best choice for UPX tools


等待
2004-7-11 14:37
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
60
谴责D*盗用头像的行为!:D
2004-7-11 23:08
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
61
呵呵,我喜欢,你在老罗的ID是什么呀
2004-7-11 23:49
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
62
fix relocation的代码终于写完了,特别复杂,稍微有一点没有考虑到,就会全盘皆输,UPXAngela有几大bug,而我的不会有任何问题,而且不会在跨内存对齐时发生错误,perfect!
2004-7-11 23:51
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
63
告诉你了还怎么混:D
写的好也不用这么……看雪的吧:o
早点放出来看看才是。
2004-7-12 00:01
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
64
由于hook了系统的 exception hander,总是无法正确退出,其他都OK了
2004-7-12 00:17
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
65
最初由 dREAMtHEATER 发布
由于hook了系统的 exception hander,总是无法正确退出,其他都OK了

厉害,系统exception handler不就是中断?:D
2004-7-12 00:22
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
66
加入脱dll的代码使代码的难度等级又上了一个等级,经过一上午的代码修正,现在脱壳的dll都可以运行了,但hook system exception handler可不是好玩的,有点问题,重新复习一下seh的概念,,整理一下自己的思绪,让大家等急了,但是还要。。。等待中。。。
2004-7-12 12:45
0
雪    币: 203
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
67
强烈支持,早点放出来玩玩
2004-7-12 13:15
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
68
我已经没有力气写下去,我被卡在hook system exception handler上了,哪位朋友手里有关于 KiUserExceptionDispatcher 这个undocument API资料呀,我需要它的运行机制
2004-7-12 21:40
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
69
最初由 dREAMtHEATER 发布
我已经没有力气写下去,我被卡在hook system exception handler上了,哪位朋友手里有关于 KiUserExceptionDispatcher 这个undocument API资料呀,我需要它的运行机制


我只能精神上支持你了  :D
但是千万别放弃!
2004-7-12 22:58
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
70
最初由 dREAMtHEATER 发布
我已经没有力气写下去,我被卡在hook system exception handler上了,哪位朋友手里有关于 KiUserExceptionDispatcher 这个undocument API资料呀,我需要它的运行机制

修正reloc有必要hook它吗
2004-7-12 23:34
0
雪    币:
能力值: (RANK: )
在线值:
发帖
回帖
粉丝
71
我也来精神支持一下,
另外, MICROSOFT 的网上可能会找到一些资料吧?
例如 Matt Pietrek 谈到了 KiUserExceptionDispatcher, 不知是否你所要的?

h**p://w*w.microsoft.com/msj/0197/exception/exception.aspx

Into the Inferno

Figure 14 shows some pseudocode I whipped up for KiUserExceptionDispatcher and some related functions. KiUserExceptionDispatcher is in NTDLL.DLL and is where execution begins after an exception occurs. To be 100 percent accurate, what I just said isn't exactly true. For instance, in the Intel architecture an exception causes control to vector to a ring 0 (kernel mode) handler. The handler is defined by the interrupt descriptor table entry that corresponds to an exception. I'm going to skip all that kernel mode code and pretend that the CPU goes straight to KiUserExceptionDispatcher upon an exception
The heart of KiUserExceptionDispatcher is its call to RtlDispatchException. This kicks off the search for any registered exception handlers. If a handler handles the exception and continues execution, the call to RtlDispatchException never returns. If RtlDispatchException returns, there are two possible paths: either NtContinue is called, which lets the process continues, or another exception is raised. This time, the exception isn't continuable, and the process must terminate.

Figure 14   KiUserExceptionDispatcher Pseudocode :

KiUserExceptionDispatcher( PEXCEPTION_RECORD pExcptRec, CONTEXT * pContext )
 {
     DWORD retValue;
 
     // Note: If the exception is handled, RtlDispatchException() never returns
     if ( RtlDispatchException( pExceptRec, pContext ) )
         retValue = NtContinue( pContext, 0 );
     else
         retValue = NtRaiseException( pExceptRec, pContext, 0 );
 
     EXCEPTION_RECORD excptRec2;
 
     excptRec2.ExceptionCode = retValue;
     excptRec2.ExceptionFlags = EXCEPTION_NONCONTINUABLE;
     excptRec2.ExceptionRecord = pExcptRec;
     excptRec2.NumberParameters = 0;
 
     RtlRaiseException( &excptRec2 );
 }
 
 int RtlDispatchException( PEXCEPTION_RECORD pExcptRec, CONTEXT * pContext )
 {
     DWORD   stackUserBase;
     DWORD   stackUserTop;
     PEXCEPTION_REGISTRATION pRegistrationFrame;
     DWORD hLog;
 
     // Get stack boundaries from FS:[4] and FS:[8]
     RtlpGetStackLimits( &stackUserBase, &stackUserTop );
 
     pRegistrationFrame = RtlpGetRegistrationHead();
 
     while ( -1 != pRegistrationFrame )
     {
         PVOID justPastRegistrationFrame = &pRegistrationFrame + 8;
         if ( stackUserBase > justPastRegistrationFrame )
         {
             pExcptRec->ExceptionFlags |= EH_STACK_INVALID;
             return DISPOSITION_DISMISS; // 0
         }
 
         if ( stackUsertop < justPastRegistrationFrame )
         {
             pExcptRec->ExceptionFlags |= EH_STACK_INVALID;
             return DISPOSITION_DISMISS; // 0
         }
 
         if ( pRegistrationFrame & 3 )   // Make sure stack is DWORD aligned
         {
             pExcptRec->ExceptionFlags |= EH_STACK_INVALID;
             return DISPOSITION_DISMISS; // 0
         }
 
         if ( someProcessFlag )
         {
             // Doesn't seem to do a whole heck of a lot.
             hLog = RtlpLogExceptionHandler( pExcptRec, pContext, 0,
                                             pRegistrationFrame, 0x10 );
         }
 
         DWORD retValue, dispatcherContext;
 
         retValue= RtlpExecuteHandlerForException(pExcptRec, pRegistrationFrame,
                                                  pContext, &dispatcherContext,
                                                  pRegistrationFrame->handler );
 
         // Doesn't seem to do a whole heck of a lot.
         if ( someProcessFlag )
             RtlpLogLastExceptionDisposition( hLog, retValue );
 
         if ( 0 == pRegistrationFrame )
         {
             pExcptRec->ExceptionFlags &= ~EH_NESTED_CALL;   // Turn off flag
         }
 
         EXCEPTION_RECORD excptRec2;
 
         DWORD yetAnotherValue = 0;
 
         if ( DISPOSITION_DISMISS == retValue )
         {
             if ( pExcptRec->ExceptionFlags & EH_NONCONTINUABLE )
             {
                 excptRec2.ExceptionRecord = pExcptRec;
                 excptRec2.ExceptionNumber = STATUS_NONCONTINUABLE_EXCEPTION;
                 excptRec2.ExceptionFlags = EH_NONCONTINUABLE;
                 excptRec2.NumberParameters = 0
                 RtlRaiseException( &excptRec2 );
             }
             else
                 return DISPOSITION_CONTINUE_SEARCH;
         }
         else if ( DISPOSITION_CONTINUE_SEARCH == retValue )
         {
         }
         else if ( DISPOSITION_NESTED_EXCEPTION == retValue )
         {
             pExcptRec->ExceptionFlags |= EH_EXIT_UNWIND;
             if ( dispatcherContext > yetAnotherValue )
                 yetAnotherValue = dispatcherContext;
         }
         else    // DISPOSITION_COLLIDED_UNWIND
         {
             excptRec2.ExceptionRecord = pExcptRec;
             excptRec2.ExceptionNumber = STATUS_INVALID_DISPOSITION;
             excptRec2.ExceptionFlags = EH_NONCONTINUABLE;
             excptRec2.NumberParameters = 0
             RtlRaiseException( &excptRec2 );
         }
 
         pRegistrationFrame = pRegistrationFrame->prev;  // Go to previous frame
     }
 
     return DISPOSITION_DISMISS;
 }
 
 
 _RtlpExecuteHandlerForException:    // Handles exception (first time through)
     MOV     EDX,XXXXXXXX
     JMP     ExecuteHandler
 
 
 RtlpExecutehandlerForUnwind:        // Handles unwind (second time through)
     MOV     EDX,XXXXXXXX
 
 
 
 int ExecuteHandler( PEXCEPTION_RECORD pExcptRec
                     PEXCEPTION_REGISTRATION pExcptReg
                     CONTEXT * pContext
                     PVOID pDispatcherContext,
                     FARPROC handler ) // Really a ptr to an _except_handler()
 
     // Set up an EXCEPTION_REGISTRATION, where EDX points to the
     // appropriate handler code shown below
     PUSH    EDX
     PUSH    FS:[0]
     MOV     FS:[0],ESP
 
     // Invoke the exception callback function
     EAX = handler( pExcptRec, pExcptReg, pContext, pDispatcherContext );
 
     // Remove the minimal EXCEPTION_REGISTRATION frame 
     MOV     ESP,DWORD PTR FS:[00000000]
     POP     DWORD PTR FS:[00000000]
 
     return EAX;
 }
 
 Exception handler used for _RtlpExecuteHandlerForException:
 {
     // If unwind flag set, return DISPOSITION_CONTINUE_SEARCH, else
     // assign pDispatcher context and return DISPOSITION_NESTED_EXCEPTION
 
     return pExcptRec->ExceptionFlags & EXCEPTION_UNWIND_CONTEXT
                 ? DISPOSITION_CONTINUE_SEARCH 
                 : *pDispatcherContext = pRegistrationFrame->scopetable,
                   DISPOSITION_NESTED_EXCEPTION;
 }
 
 Exception handler used for _RtlpExecuteHandlerForUnwind:
 {
     // If unwind flag set, return DISPOSITION_CONTINUE_SEARCH, else
     // assign pDispatcher context and return DISPOSITION_COLLIDED_UNWIND
 
     return pExcptRec->ExceptionFlags & EXCEPTION_UNWIND_CONTEXT
                 ? DISPOSITION_CONTINUE_SEARCH 
                 : *pDispatcherContext = pRegistrationFrame->scopetable,
                   DISPOSITION_COLLIDED_UNWIND;
 }
2004-7-13 00:11
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
72
楼上的朋友提供的信息特别有用,谢谢,另外,没看到我的问题的朋友,看这里
http://bbs.pediy.com/showthread.php?s=&postid=15752#post15752

继续等待有人能回答
2004-7-13 10:22
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
73
如果问题解决不了,相当于这个project就死掉了,我自己可惜,大家也会很难受的,它将会是最好的UPX tools.....
2004-7-13 10:23
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
74
当年(2001年)写到v0.98(当时叫upx shell)就停止了,因为当时也没思路了,很多自己的想法不能实现,呵呵,一直到了今年,才将这个project重新拾起,将我的部分想法继续实现,写了这么长的时间的程序,最大感受是创意+经验
2004-7-13 10:50
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
75
除了我说的上面的问题没有解决,NT下的脱dll代码已经完成,为了不让大家失望,我先放出来,运行的现象是当你脱完dll后,进程被自动中止,包括可怜的explorer,但脱壳文件已经保存在脱壳目录下,我不保证100%能脱壳,另外以前的upx 版本我也没测试过,记住,在NT测试!

注册组件,在命令行窗口通过命令 RegSvr32.exe 路径\UPXShellExt.dll

点击此处下载
2004-7-13 12:30
0
游客
登录 | 注册 方可回帖
返回
//