首页
社区
课程
招聘
[原创] 也许是您迄今为止见过得最好用的 UPX 外壳程序
发表于: 2004-5-9 17:01 15379

[原创] 也许是您迄今为止见过得最好用的 UPX 外壳程序

2004-5-9 17:01
15379
点击此处下载

再次重拳出击,这回的作品也许会给大家带来些新鲜的感觉,今天我将内核代码进行了彻底的优化,但目前还存在一个线程无法同步的bug,表现为某些情况下消息可能无法输出,请大家帮我测试!



软件名称:UPX ShellExt
软件版本:1.0 测试版
运行平台:Win98/ME/2000/XP/2003
软件大小:438KB
授权方式:免费软件
软件作者:dREAMtHEATER
作者主页:http://dREAMtHEATER.yeah.net
作者电邮:NoteXPad@163.com

软件简介:
    UPX ShellExt 是著名的可执行文件压缩软件 UPX 的 Win32 控制台版的外壳程序。

    本程序作为 UPX 的外壳扩展,提供了更为友好的用户界面,充分发挥 UPX 的强大威
    力。同时提供如下功能:批处理操作;修饰加壳文件,防止用命令脱壳;通用 UPX
    脱壳机。有了这些功能的整合,或许您以前曾经使用过的 HACK-UPX, UPXFix,
    Generic Unpacker For UPX 这些工具都可以抛弃了。

    UPX ShellExt 最大的一个特色就是与 Windows 外壳的无缝链接,使得所有的操作简
    单到极点,它也许是您迄今为止见过得最好用的 UPX 外壳程序。

更新提示:

v1.0 测试版[2004.05.08]:
    1.代码基本上重写了,全部功能集中在一个 DLL 里,与 Windows 外壳紧密整合;
    2.增加加密功能;
    3.增加自动 UPX 脱壳机;
    4.更多改进...
------------------------------------------------------------------------------
版权所有 ? 2001-2004 dREAMtHEATER Studio,保留所有权利

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 6
支持
分享
最新回复 (33)
雪    币: 173
活跃值: (2336)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cwx
2
一个EXE文件用UPX ShellExt加完壳后,再用鼠标右键点击该EXE文件,就会弹出EXPLORER.EXE出错的对话框。

用UPX 1.24.exe在命令行下对EXE文件加壳,再用鼠标右键点击该EXE文件,并无问题。

OS:WIN2000SP4 CN
2004-5-9 17:38
0
雪    币: 279
活跃值: (375)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
3
好用,谢谢
2004-5-9 17:53
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
支持原创!下载试试!
2004-5-9 18:09
0
雪    币: 279
活跃值: (435)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
5
压缩了几个自己做的软件,还没有发现问题。
2004-5-9 19:06
0
雪    币: 295
活跃值: (506)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
好用,支持
2004-5-9 19:26
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
7
谢谢 dREAMtHEATER 老大
2004-5-9 21:09
0
雪    币: 272
活跃值: (340)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
不知是不是bug.
2004-5-9 21:27
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
最初由 无名和尚 发布
不知是不是bug.


1.9没有改变跳转入口点的代码,按理论应该可以脱壳
2004-5-9 22:24
0
雪    币: 291
活跃值: (400)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
10
我试过用ReadConsoleOutputCharacter可以可以实现UPX图形界面的进度条,好爽的说
2004-5-9 23:12
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
最初由 草原猎豹 发布
我试过用ReadConsoleOutputCharacter可以可以实现UPX图形界面的进度条,好爽的说


草原猎豹小弟:
还记得我吧,我们打过交道,对你的提示我非常兴奋,为这个不能实时显示进度的问题困绕了我很久,得知有此API兴奋不已,能否将此API的用法简单陈述一下或者有个demo最好,谢谢!
2004-5-9 23:53
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
12
如果有几次加壳和脱壳失败后,再次使用时就会如图所示
只能Alt+F4关闭了
卸载、重启后再次安装又可以正常使用了。
麻烦老大看看
2004-5-10 00:19
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
最初由 fly 发布
如果有几次加壳和脱壳失败后,再次使用时就会如图所示
只能Alt+F4关闭了
卸载、重启后再次安装又可以正常使用了。
麻烦老大看看


如果你看到我最前面的测试版说明,你就明白了!

本质原因是工作线程无限等待界面线程的继续工作的消息,但始终无法收到这个消息,我现在为此一筹莫展,线程同步是一个非常复杂的操作过程,目前还没有解决,请等待我的最新更新,

重启或注销前,不用卸载。
2004-5-10 00:32
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
14
哦,谢谢
2004-5-10 00:36
0
雪    币: 291
活跃值: (400)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
15
最初由 dREAMtHEATER 发布


草原猎豹小弟:
还记得我吧,我们打过交道,对你的提示我非常兴奋,为这个不能实时显示进度的问题困绕了我很久,得知有此API兴奋不已,能否将此API的用法简单陈述一下或者有个demo最好,谢谢!


那是我调试别人的UPX图形界面时发现的,大概是这样的:
先allocconsole()分配个控制台,再用FindWindow找到那个控制台,再ShowWindow把他藏起来,再SetConsoleCursorPosition设置控制台光标位置,再CreateProcess创建UPX.exe进程,再循环用ReadConsoleOutputCharacter读取控制台输出字符,再数星号的数量,就可以实现进度条了。或者懒一点,把整个控制台输出字符全部照搬到图界里也行。
我还有不少想法,比如借鉴网络蚂蚁之类的任务队列的概念,不过多线程+多进程,协调起来有点太恐怖了
2004-5-10 01:51
0
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
最初由 草原猎豹 发布


那是我调试别人的UPX图形界面时发现的,大概是这样的:
先allocconsole()分配个控制台,再用FindWindow找到那个控制台,再ShowWindow把他藏起来,再SetConsoleCursorPosition设置控制台光标位置,再CreateProcess创建UPX.exe进程,再循环用ReadConsoleOutputCharacter读取控制台输出字符,再数星号的数量,就可以实现进度条了。或者懒一点,把整个控制台输出字符全部照搬到图界里也行。
我还有不少想法,比如借鉴网络蚂蚁之类的任务队列的概念,不过多线程+多进程,协调起来有点太恐怖了


能写个demo 出来吗?另外把那个UPX外壳程序的名称告诉我好吗?
2004-5-10 17:31
0
雪    币: 329
活跃值: (343)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
17
Sample Multithread C Program
Home |  Overview |  How Do I |  Sample

BOUNCE.C is a sample multithread program that creates a new thread each time the letter a or A is typed. Each thread bounces a “happy face” of a different color around the screen. Up to 32 threads can be created. The program’s normal termination occurs when q or Q is typed. See Compiling and Linking Multithread Programs for details on compiling and linking BOUNCE.C.
/*  Bounce - Creates a new thread each time the letter 'a' is typed.
 *  Each thread bounces a happy face of a different color around the screen.
 *  All threads are terminated when the letter 'Q' is entered.
 *
 *  This program requires the multithread library. For example, compile
 *  with the following command line:
 *      CL /MT BOUNCE.C
 */

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <process.h>

#define MAX_THREADS  32

/* getrandom returns a random number between min and max, which must be in
 * integer range.
 */
#define getrandom( min, max ) ((rand() % (int)(((max) + 1) - (min))) + (min))

void main( void );                     /* Thread 1: main */
void KbdFunc( void  );                 /* Keyboard input, thread dispatch */
void BounceProc( char * MyID );        /* Threads 2 to n: display */
void ClearScreen( void );              /* Screen clear */
void ShutDown( void );                 /* Program shutdown */
void WriteTitle( int ThreadNum );      /* Display title bar information */

HANDLE  hConsoleOut;                   /* Handle to the console */
HANDLE  hRunMutex;                     /* "Keep Running" mutex */
HANDLE  hScreenMutex;                  /* "Screen update" mutex  */
int     ThreadNr;                      /* Number of threads started */
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;   /* Console information */


void main()                            /* Thread One */
{
    /* Get display screen information & clear the screen.*/
    hConsoleOut = GetStdHandle( STD_OUTPUT_HANDLE );
    GetConsoleScreenBufferInfo( hConsoleOut, &csbiInfo );
    ClearScreen();
    WriteTitle( 0 );
    /* Create the mutexes and reset thread count. */
    hScreenMutex = CreateMutex( NULL, FALSE, NULL );   /* Cleared */
    hRunMutex = CreateMutex( NULL, TRUE, NULL );       /* Set */
    ThreadNr = 0;

    /* Start waiting for keyboard input to dispatch threads or exit. */
    KbdFunc();

    /* All threads done. Clean up handles. */
    CloseHandle( hScreenMutex );
    CloseHandle( hRunMutex );
    CloseHandle( hConsoleOut );
}

void ShutDown( void )                  /* Shut down threads */
{
    while ( ThreadNr > 0 )
    {
            /* Tell thread to die and record its death. */
            ReleaseMutex( hRunMutex );
            ThreadNr--;   
    }
    /* Clean up display when done */
    WaitForSingleObject( hScreenMutex, INFINITE );
    ClearScreen();
}

void KbdFunc( void )                   /* Dispatch and count threads. */
{
    int         KeyInfo;

    do
    {
        KeyInfo = _getch();
        if( tolower( KeyInfo ) == 'a' && ThreadNr < MAX_THREADS )
        {
            ThreadNr++;
            _beginthread( BounceProc, 0, &ThreadNr );
            WriteTitle( ThreadNr );
        }
    } while( tolower( KeyInfo ) != 'q' );

    ShutDown();
}

void BounceProc( char *MyID )
{
    char      MyCell, OldCell;
    WORD      MyAttrib, OldAttrib;
    char      BlankCell = 0x20;
    COORD     Coords, Delta;
    COORD     Old = {0,0};
    DWORD     Dummy;

/* Generate update increments and initial display coordinates. */
    srand( (unsigned) *MyID * 3 );
    Coords.X = getrandom( 0, csbiInfo.dwSize.X - 1 );
    Coords.Y = getrandom( 0, csbiInfo.dwSize.Y - 1 );
    Delta.X = getrandom( -3, 3 );
    Delta.Y = getrandom( -3, 3 );

    /* Set up "happy face" & generate color attribute from thread number.*/
    if( *MyID > 16)
        MyCell = 0x01;                 /* outline face */
    else
        MyCell = 0x02;                 /* solid face */
    MyAttrib =  *MyID & 0x0F;          /* force black background */

    do
    {
        /* Wait for display to be available, then lock it. */
        WaitForSingleObject( hScreenMutex, INFINITE );

        /* If we still occupy the old screen position, blank it out. */
        ReadConsoleOutputCharacter( hConsoleOut, &OldCell, 1, Old, &Dummy );
        ReadConsoleOutputAttribute( hConsoleOut, &OldAttrib, 1, Old, &Dummy );
        if (( OldCell == MyCell ) && (OldAttrib == MyAttrib))
            WriteConsoleOutputCharacter( hConsoleOut, &BlankCell, 1, Old, &Dummy );

        /* Draw new face, then clear screen lock */
        WriteConsoleOutputCharacter( hConsoleOut, &MyCell, 1, Coords, &Dummy );
        WriteConsoleOutputAttribute( hConsoleOut, &MyAttrib, 1, Coords, &Dummy );
        ReleaseMutex( hScreenMutex );

        /* Increment the coordinates for next placement of the block. */
        Old.X = Coords.X;
        Old.Y = Coords.Y;
        Coords.X += Delta.X;
        Coords.Y += Delta.Y;

        /* If we are about to go off the screen, reverse direction */
        if( Coords.X < 0 || Coords.X >= csbiInfo.dwSize.X )
        {
            Delta.X = -Delta.X;
            Beep( 400, 50 );
        }
        if( Coords.Y < 0 || Coords.Y > csbiInfo.dwSize.Y )
        {
            Delta.Y = -Delta.Y;
            Beep( 600, 50 );
        }
    }
    /* Repeat while RunMutex is still taken. */
    while ( WaitForSingleObject( hRunMutex, 75L ) == WAIT_TIMEOUT );

}

void WriteTitle( int ThreadNum )
{
    char    NThreadMsg[80];

    sprintf( NThreadMsg, "Threads running: %02d.  Press 'A' to start a thread,'Q' to quit.", ThreadNum );
    SetConsoleTitle( NThreadMsg );
}

void ClearScreen( void )
{
    DWORD    dummy;
    COORD    Home = { 0, 0 };
    FillConsoleOutputCharacter( hConsoleOut, ' ', csbiInfo.dwSize.X * csbiInfo.dwSize.Y, Home, &dummy );
}


MSDN中的例子,说得很清楚。;)
2004-5-10 18:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
好用。可是不能自己定义UPX的版本了,有些可惜。:(
2004-5-10 19:56
0
雪    币: 291
活跃值: (400)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
19
最初由 dREAMtHEATER 发布


能写个demo 出来吗?另外把那个UPX外壳程序的名称告诉我好吗?


给你那个UPX外挂的网址吧:
http://sourceforge.net/projects/upxshell/
但愿不用代理也能上

我的原代码在格盘的时候丢掉了,我经常在格盘的时候丢掉东西。。。。。。。
2004-5-10 21:39
0
雪    币: 291
活跃值: (400)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
20
靠,不上他网站还不知道他有原代码可以下载。。。。。。
2004-5-10 21:42
0
雪    币: 291
活跃值: (400)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
21
不会吧,从学校坐车回家,我的Delphi6就坏了,光盘也挂了。。。
有没有人告诉我Delphi7是不是比6好用?装7算了。。。。。
2004-5-10 21:56
0
雪    币: 6051
活跃值: (1441)
能力值: ( LV15,RANK:1473 )
在线值:
发帖
回帖
粉丝
22
唉~~~~
看高手老大们的发言真的让我感到很惭愧.....
我不懂的东西实在太多了....
不知哪一天能学成这个样子??
2004-5-10 23:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
最初由 fly 发布
如果有几次加壳和脱壳失败后,再次使用时就会如图所示
只能Alt+F4关闭了
卸载、重启后再次安装又可以正常使用了。
麻烦老大看看


我用的时候有时候也这样。我用TaskInfo将Explorer.exe进程终止,然后再重新启动一个Explorer.exe就可以了再用了,也不用重起系统或注销。:)
2004-5-10 23:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
最初由 草原猎豹 发布


给你那个UPX外挂的网址吧:
http://sourceforge.net/projects/upxshell/
但愿不用代理也能上

我的原代码在格盘的时候丢掉了,我经常在格盘的时候丢掉东西。。。。。。。


使用这个 UPX Shell 压缩的壳如果选择了用干扰器则不能自行解压,用 dREAMtHEATER 的 UPX ShellExt 也不能脱(用其 UPX 自动脱壳机也不可以)。不过可以用 UPX Ripper 脱。
2004-5-11 00:00
0
雪    币: 214
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
dREAMtHEATER:你要想实时显示进度,或许你应该采用这样的方法:
1、创建两个Pipe。
2、设置进程的开始信息。
3、用2里面的开始信息CreateProcess。
4、循环从Pipe当中读出数据。
5、读完了WaitForSingalObject。
ZiDing#126.com,希望对你有帮助
2004-5-11 02:40
0
游客
登录 | 注册 方可回帖
返回
//