Initial commit (v1.30)
This commit is contained in:
commit
a551a6e6c8
17
ANSI-LLA.c
Normal file
17
ANSI-LLA.c
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
ANSI-LLA.c - Output the 32-bit address of LoadLibraryA.
|
||||||
|
|
||||||
|
Jason Hood, 5 September, 2010.
|
||||||
|
|
||||||
|
I don't know of a method to retrieve the 32-bit address of a function in
|
||||||
|
64-bit code, so this is a simple workaround.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
int main( void )
|
||||||
|
{
|
||||||
|
return (DWORD)GetProcAddress( GetModuleHandleA( "kernel32.dll" ),
|
||||||
|
"LoadLibraryA" );
|
||||||
|
}
|
169
COPYING.MinGW-w64-runtime.txt
Normal file
169
COPYING.MinGW-w64-runtime.txt
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
MinGW-w64 runtime licensing
|
||||||
|
***************************
|
||||||
|
|
||||||
|
This program or library was built using MinGW-w64 and statically
|
||||||
|
linked against the MinGW-w64 runtime. Some parts of the runtime
|
||||||
|
are under licenses which require that the copyright and license
|
||||||
|
notices are included when distributing the code in binary form.
|
||||||
|
These notices are listed below.
|
||||||
|
|
||||||
|
|
||||||
|
========================
|
||||||
|
Overall copyright notice
|
||||||
|
========================
|
||||||
|
|
||||||
|
Copyright (c) 2009, 2010 by the mingw-w64 project
|
||||||
|
|
||||||
|
This license has been certified as open source. It has also been designated
|
||||||
|
as GPL compatible by the Free Software Foundation (FSF).
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions in source code must retain the accompanying copyright
|
||||||
|
notice, this list of conditions, and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the accompanying
|
||||||
|
copyright notice, this list of conditions, and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
3. Names of the copyright holders must not be used to endorse or promote
|
||||||
|
products derived from this software without prior written permission
|
||||||
|
from the copyright holders.
|
||||||
|
4. The right to distribute this software or to use it for any purpose does
|
||||||
|
not give you the right to use Servicemarks (sm) or Trademarks (tm) of
|
||||||
|
the copyright holders. Use of them is covered by separate agreement
|
||||||
|
with the copyright holders.
|
||||||
|
5. If any files are modified, you must cause the modified files to carry
|
||||||
|
prominent notices stating that you changed the files and the date of
|
||||||
|
any change.
|
||||||
|
|
||||||
|
Disclaimer
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
|
||||||
|
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||||
|
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||||
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================
|
||||||
|
gdtoa: Converting between IEEE floating point numbers and ASCII
|
||||||
|
===============================================================
|
||||||
|
|
||||||
|
The author of this software is David M. Gay.
|
||||||
|
|
||||||
|
Copyright (C) 1997, 1998, 1999, 2000, 2001 by Lucent Technologies
|
||||||
|
All Rights Reserved
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software and
|
||||||
|
its documentation for any purpose and without fee is hereby
|
||||||
|
granted, provided that the above copyright notice appear in all
|
||||||
|
copies and that both that the copyright notice and this
|
||||||
|
permission notice and warranty disclaimer appear in supporting
|
||||||
|
documentation, and that the name of Lucent or any of its entities
|
||||||
|
not be used in advertising or publicity pertaining to
|
||||||
|
distribution of the software without specific, written prior
|
||||||
|
permission.
|
||||||
|
|
||||||
|
LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
|
||||||
|
IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
|
||||||
|
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||||
|
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
||||||
|
THIS SOFTWARE.
|
||||||
|
|
||||||
|
* * * * * * *
|
||||||
|
|
||||||
|
The author of this software is David M. Gay.
|
||||||
|
|
||||||
|
Copyright (C) 2005 by David M. Gay
|
||||||
|
All Rights Reserved
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software and its
|
||||||
|
documentation for any purpose and without fee is hereby granted,
|
||||||
|
provided that the above copyright notice appear in all copies and that
|
||||||
|
both that the copyright notice and this permission notice and warranty
|
||||||
|
disclaimer appear in supporting documentation, and that the name of
|
||||||
|
the author or any of his current or former employers not be used in
|
||||||
|
advertising or publicity pertaining to distribution of the software
|
||||||
|
without specific, written prior permission.
|
||||||
|
|
||||||
|
THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
|
||||||
|
NO EVENT SHALL THE AUTHOR OR ANY OF HIS CURRENT OR FORMER EMPLOYERS BE
|
||||||
|
LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
|
||||||
|
DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||||
|
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
* * * * * * *
|
||||||
|
|
||||||
|
The author of this software is David M. Gay.
|
||||||
|
|
||||||
|
Copyright (C) 2004 by David M. Gay.
|
||||||
|
All Rights Reserved
|
||||||
|
Based on material in the rest of /netlib/fp/gdota.tar.gz,
|
||||||
|
which is copyright (C) 1998, 2000 by Lucent Technologies.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software and
|
||||||
|
its documentation for any purpose and without fee is hereby
|
||||||
|
granted, provided that the above copyright notice appear in all
|
||||||
|
copies and that both that the copyright notice and this
|
||||||
|
permission notice and warranty disclaimer appear in supporting
|
||||||
|
documentation, and that the name of Lucent or any of its entities
|
||||||
|
not be used in advertising or publicity pertaining to
|
||||||
|
distribution of the software without specific, written prior
|
||||||
|
permission.
|
||||||
|
|
||||||
|
LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
|
||||||
|
IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
|
||||||
|
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||||
|
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
||||||
|
THIS SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
=========================
|
||||||
|
Parts of the math library
|
||||||
|
=========================
|
||||||
|
|
||||||
|
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||||
|
|
||||||
|
Developed at SunSoft, a Sun Microsystems, Inc. business.
|
||||||
|
Permission to use, copy, modify, and distribute this
|
||||||
|
software is freely granted, provided that this notice
|
||||||
|
is preserved.
|
||||||
|
|
||||||
|
* * * * * * *
|
||||||
|
|
||||||
|
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||||
|
|
||||||
|
Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||||
|
Permission to use, copy, modify, and distribute this
|
||||||
|
software is freely granted, provided that this notice
|
||||||
|
is preserved.
|
||||||
|
|
||||||
|
* * * * * * *
|
||||||
|
|
||||||
|
FIXME: Cephes math lib
|
||||||
|
Copyright (C) 1984-1998 Stephen L. Moshier
|
||||||
|
|
||||||
|
It sounds vague, but as to be found at
|
||||||
|
<http://lists.debian.org/debian-legal/2004/12/msg00295.html>, it gives an
|
||||||
|
impression that the author could be willing to give an explicit
|
||||||
|
permission to distribute those files e.g. under a BSD style license. So
|
||||||
|
probably there is no problem here, although it could be good to get a
|
||||||
|
permission from the author and then add a license into the Cephes files
|
||||||
|
in MinGW runtime. At least on follow-up it is marked that debian sees the
|
||||||
|
version a-like BSD one. As MinGW.org (where those cephes parts are coming
|
||||||
|
from) distributes them now over 6 years, it should be fine.
|
41
ansi.rc
Normal file
41
ansi.rc
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
ansi.rc - Version resource for ANSI{32,64}.dll.
|
||||||
|
|
||||||
|
Jason Hood, 11 November, 2009.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <winver.h>
|
||||||
|
|
||||||
|
#ifdef _WIN64
|
||||||
|
# define BITS "64"
|
||||||
|
#else
|
||||||
|
# define BITS "32"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
1 VERSIONINFO
|
||||||
|
FILEVERSION 1,3,0,0
|
||||||
|
PRODUCTVERSION 1,3,0,0
|
||||||
|
FILEOS VOS_NT
|
||||||
|
FILETYPE VFT_DLL
|
||||||
|
{
|
||||||
|
BLOCK "StringFileInfo"
|
||||||
|
{
|
||||||
|
BLOCK "040904B0"
|
||||||
|
{
|
||||||
|
VALUE "Comments", "http://ansicon.adoxa.cjb.net/"
|
||||||
|
VALUE "CompanyName", "Jason Hood"
|
||||||
|
VALUE "FileDescription", "ANSI Console"
|
||||||
|
VALUE "FileVersion", "1.30"
|
||||||
|
VALUE "InternalName", "ANSI" BITS
|
||||||
|
VALUE "LegalCopyright", "Freeware"
|
||||||
|
VALUE "OriginalFilename", "ANSI" BITS ".dll"
|
||||||
|
VALUE "ProductName", "ANSICON"
|
||||||
|
VALUE "ProductVersion", "1.30"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BLOCK "VarFileInfo"
|
||||||
|
{
|
||||||
|
VALUE "Translation", 0x0409, 0x04B0
|
||||||
|
}
|
||||||
|
}
|
541
ansicon.c
Normal file
541
ansicon.c
Normal file
@ -0,0 +1,541 @@
|
|||||||
|
/*
|
||||||
|
ANSICON.c - ANSI escape sequence console driver.
|
||||||
|
|
||||||
|
Jason Hood, 21 to 23 October, 2005.
|
||||||
|
|
||||||
|
Original injection code was derived from Console Manager by Sergey Oblomov
|
||||||
|
(hoopoepg). Use of FlushInstructionCache came from www.catch22.net.
|
||||||
|
Additional information came from "Process-wide API spying - an ultimate hack",
|
||||||
|
Anton Bassov's article in "The Code Project" (use of OpenThread).
|
||||||
|
|
||||||
|
v1.01, 11 & 12 March, 2006:
|
||||||
|
-m option to set "monochrome" (grey on black);
|
||||||
|
restore original color on exit.
|
||||||
|
|
||||||
|
v1.10, 22 February, 2009:
|
||||||
|
ignore Ctrl+C/Ctrl+Break.
|
||||||
|
|
||||||
|
v1.13, 21 & 27 March, 2009:
|
||||||
|
alternate injection method, to work with DEP;
|
||||||
|
use Unicode.
|
||||||
|
|
||||||
|
v1.20, 17 to 21 June, 2009:
|
||||||
|
use a combination of the two injection methods;
|
||||||
|
test if ANSICON is already installed;
|
||||||
|
added -e (and -E) option to echo the command line (without newline);
|
||||||
|
added -t (and -T) option to type (display) files (with file name).
|
||||||
|
|
||||||
|
v1.21, 23 September, 2009:
|
||||||
|
added -i (and -u) to add (remove) ANSICON to AutoRun.
|
||||||
|
|
||||||
|
v1.24, 6 & 7 January, 2010:
|
||||||
|
no arguments to -t, or using "-" for the name, will read from stdin;
|
||||||
|
fix -t and -e when ANSICON was already loaded.
|
||||||
|
|
||||||
|
v1.25, 22 July, 2010:
|
||||||
|
added -IU for HKLM.
|
||||||
|
|
||||||
|
v1.30, 3 August to 7 September, 2010:
|
||||||
|
x64 support.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PVERS "1.30"
|
||||||
|
#define PDATE "7 September, 2010"
|
||||||
|
|
||||||
|
#define UNICODE
|
||||||
|
#define _UNICODE
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#define _WIN32_WINNT 0x0500 // MinGW wants this defined for OpenThread
|
||||||
|
#include <windows.h>
|
||||||
|
#include <tchar.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <shellapi.h>
|
||||||
|
#include <tlhelp32.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <io.h>
|
||||||
|
#include "injdll.h"
|
||||||
|
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
int _CRT_glob = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _WIN64
|
||||||
|
# define InjectDLL InjectDLL64
|
||||||
|
# define BITS "64"
|
||||||
|
#else
|
||||||
|
# define InjectDLL InjectDLL32
|
||||||
|
# define BITS "32"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define CMDKEY TEXT("Software\\Microsoft\\Command Processor")
|
||||||
|
#define AUTORUN TEXT("AutoRun")
|
||||||
|
|
||||||
|
|
||||||
|
void help( void );
|
||||||
|
|
||||||
|
void display( LPCTSTR, BOOL );
|
||||||
|
LPTSTR skip_spaces( LPTSTR );
|
||||||
|
LPTSTR skip_arg( LPTSTR );
|
||||||
|
|
||||||
|
void process_autorun( TCHAR );
|
||||||
|
|
||||||
|
BOOL find_proc_id( HANDLE snap, DWORD id, LPPROCESSENTRY32 ppe );
|
||||||
|
BOOL GetParentProcessInfo( LPPROCESS_INFORMATION ppi );
|
||||||
|
|
||||||
|
|
||||||
|
// Find the name of the DLL and inject it.
|
||||||
|
void Inject( LPPROCESS_INFORMATION ppi )
|
||||||
|
{
|
||||||
|
DWORD len;
|
||||||
|
CHAR dll[MAX_PATH];
|
||||||
|
|
||||||
|
len = GetModuleFileNameA( NULL, dll, sizeof(dll) );
|
||||||
|
while (dll[len-1] != '\\')
|
||||||
|
--len;
|
||||||
|
lstrcpyA( dll + len, "ANSI" BITS ".dll" );
|
||||||
|
|
||||||
|
InjectDLL( ppi, dll );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static HANDLE hConOut;
|
||||||
|
static CONSOLE_SCREEN_BUFFER_INFO csbi;
|
||||||
|
|
||||||
|
void get_original_attr( void )
|
||||||
|
{
|
||||||
|
hConOut = CreateFile( TEXT("CONOUT$"), GENERIC_READ | GENERIC_WRITE,
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||||
|
NULL, OPEN_EXISTING, 0, 0 );
|
||||||
|
GetConsoleScreenBufferInfo( hConOut, &csbi );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void set_original_attr( void )
|
||||||
|
{
|
||||||
|
SetConsoleTextAttribute( hConOut, csbi.wAttributes );
|
||||||
|
CloseHandle( hConOut );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DWORD CtrlHandler( DWORD event )
|
||||||
|
{
|
||||||
|
return (event == CTRL_C_EVENT || event == CTRL_BREAK_EVENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//int _tmain( int argc, TCHAR* argv[] )
|
||||||
|
int main( void )
|
||||||
|
{
|
||||||
|
STARTUPINFO si;
|
||||||
|
PROCESS_INFORMATION pi;
|
||||||
|
TCHAR* cmd;
|
||||||
|
BOOL option;
|
||||||
|
BOOL opt_m;
|
||||||
|
BOOL installed;
|
||||||
|
HMODULE ansi;
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
int argc;
|
||||||
|
LPWSTR* argv = CommandLineToArgvW( GetCommandLineW(), &argc );
|
||||||
|
|
||||||
|
if (argc > 1)
|
||||||
|
{
|
||||||
|
if (lstrcmp( argv[1], TEXT("--help") ) == 0 ||
|
||||||
|
(argv[1][0] == '-' && (argv[1][1] == '?' || argv[1][1] == 'h')) ||
|
||||||
|
(argv[1][0] == '/' && argv[1][1] == '?'))
|
||||||
|
{
|
||||||
|
help();
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
if (lstrcmp( argv[1], TEXT("--version") ) == 0)
|
||||||
|
{
|
||||||
|
_putts( TEXT("ANSICON (" BITS "-bit) version " PVERS " (" PDATE ").") );
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
option = (argc > 1 && argv[1][0] == '-');
|
||||||
|
if (option && (_totlower( argv[1][1] ) == 'i' ||
|
||||||
|
_totlower( argv[1][1] ) == 'u'))
|
||||||
|
{
|
||||||
|
process_autorun( argv[1][1] );
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
get_original_attr();
|
||||||
|
|
||||||
|
opt_m = FALSE;
|
||||||
|
if (option && argv[1][1] == 'm')
|
||||||
|
{
|
||||||
|
WORD attr = 7;
|
||||||
|
if (_istxdigit( argv[1][2] ))
|
||||||
|
{
|
||||||
|
attr = _istdigit( argv[1][2] ) ? argv[1][2] - '0'
|
||||||
|
: (argv[1][2] | 0x20) - 'a' + 10;
|
||||||
|
if (_istxdigit( argv[1][3]))
|
||||||
|
{
|
||||||
|
attr <<= 4;
|
||||||
|
attr |= _istdigit( argv[1][3] ) ? argv[1][3] - '0'
|
||||||
|
: (argv[1][3] | 0x20) - 'a' + 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SetConsoleTextAttribute( hConOut, attr );
|
||||||
|
|
||||||
|
opt_m = TRUE;
|
||||||
|
++argv;
|
||||||
|
--argc;
|
||||||
|
option = (argc > 1 && argv[1][0] == '-');
|
||||||
|
}
|
||||||
|
|
||||||
|
installed = (GetEnvironmentVariable( TEXT("ANSICON"), NULL, 0 ) != 0);
|
||||||
|
|
||||||
|
if (option && argv[1][1] == 'p')
|
||||||
|
{
|
||||||
|
// If it's already installed, there's no need to do anything.
|
||||||
|
if (installed)
|
||||||
|
;
|
||||||
|
else if (GetParentProcessInfo( &pi ))
|
||||||
|
{
|
||||||
|
pi.hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pi.dwProcessId );
|
||||||
|
pi.hThread = OpenThread( THREAD_ALL_ACCESS, FALSE, pi.dwThreadId );
|
||||||
|
SuspendThread( pi.hThread );
|
||||||
|
Inject( &pi );
|
||||||
|
ResumeThread( pi.hThread );
|
||||||
|
CloseHandle( pi.hThread );
|
||||||
|
CloseHandle( pi.hProcess );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_putts( TEXT("ANSICON: could not obtain the parent process.") );
|
||||||
|
rc = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ansi = 0;
|
||||||
|
if (!installed)
|
||||||
|
ansi = LoadLibrary( TEXT("ANSI" BITS ".dll") );
|
||||||
|
|
||||||
|
if (option && (argv[1][1] == 't' || argv[1][1] == 'T'))
|
||||||
|
{
|
||||||
|
BOOL title = (argv[1][1] == 'T');
|
||||||
|
if (argc == 2)
|
||||||
|
{
|
||||||
|
argv[2] = L"-";
|
||||||
|
++argc;
|
||||||
|
}
|
||||||
|
for (; argc > 2; ++argv, --argc)
|
||||||
|
{
|
||||||
|
if (title)
|
||||||
|
_tprintf( TEXT("==> %s <==\n"), argv[2] );
|
||||||
|
display( argv[2], title );
|
||||||
|
if (title)
|
||||||
|
_puttchar( '\n' );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Retrieve the original command line, skipping our name and the option.
|
||||||
|
cmd = skip_spaces( skip_arg( skip_spaces( GetCommandLine() ) ) );
|
||||||
|
if (opt_m)
|
||||||
|
cmd = skip_spaces( skip_arg( cmd ) );
|
||||||
|
|
||||||
|
if (cmd[0] == '-' && (cmd[1] == 'e' || cmd[1] == 'E'))
|
||||||
|
{
|
||||||
|
_fputts( cmd + 3, stdout );
|
||||||
|
if (cmd[1] == 'e')
|
||||||
|
_puttchar( '\n' );
|
||||||
|
}
|
||||||
|
else if (!isatty( 0 ) && *cmd == '\0')
|
||||||
|
{
|
||||||
|
display( TEXT("-"), FALSE );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (*cmd == '\0')
|
||||||
|
{
|
||||||
|
cmd = _tgetenv( TEXT("ComSpec") );
|
||||||
|
if (cmd == NULL)
|
||||||
|
cmd = TEXT("cmd");
|
||||||
|
}
|
||||||
|
|
||||||
|
ZeroMemory( &si, sizeof(si) );
|
||||||
|
si.cb = sizeof(si);
|
||||||
|
if (CreateProcess( NULL, cmd, NULL,NULL, TRUE, 0, NULL,NULL, &si, &pi ))
|
||||||
|
{
|
||||||
|
SetConsoleCtrlHandler( (PHANDLER_ROUTINE)CtrlHandler, TRUE );
|
||||||
|
WaitForSingleObject( pi.hProcess, INFINITE );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*skip_arg( cmd ) = '\0';
|
||||||
|
_tprintf( TEXT("ANSICON: '%s' could not be executed.\n"), cmd );
|
||||||
|
rc = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ansi)
|
||||||
|
FreeLibrary( ansi );
|
||||||
|
}
|
||||||
|
|
||||||
|
set_original_attr();
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void print_error( LPCTSTR name, BOOL title )
|
||||||
|
{
|
||||||
|
LPTSTR errmsg;
|
||||||
|
|
||||||
|
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
|
||||||
|
NULL, GetLastError(), 0, (LPTSTR)(LPVOID)&errmsg, 0, NULL );
|
||||||
|
if (!title)
|
||||||
|
_tprintf( TEXT("ANSICON: %s: "), name );
|
||||||
|
_fputts( errmsg, stdout );
|
||||||
|
LocalFree( errmsg );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Display a file.
|
||||||
|
void display( LPCTSTR name, BOOL title )
|
||||||
|
{
|
||||||
|
// Handle the pipe differently.
|
||||||
|
if (*name == '-' && name[1] == '\0')
|
||||||
|
{
|
||||||
|
if (title)
|
||||||
|
_puttchar( '\n' );
|
||||||
|
int c;
|
||||||
|
while ((c = getchar()) != EOF)
|
||||||
|
putchar( c );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
HANDLE file = CreateFile( name, GENERIC_READ, FILE_SHARE_READ, NULL,
|
||||||
|
OPEN_EXISTING, 0, NULL );
|
||||||
|
if (file == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
print_error( name, title );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LARGE_INTEGER size;
|
||||||
|
GetFileSizeEx( file, &size );
|
||||||
|
if (size.QuadPart != 0)
|
||||||
|
{
|
||||||
|
HANDLE map = CreateFileMapping( file, NULL, PAGE_READONLY, 0, 0, NULL );
|
||||||
|
if (map)
|
||||||
|
{
|
||||||
|
if (title)
|
||||||
|
_puttchar( '\n' );
|
||||||
|
LARGE_INTEGER offset;
|
||||||
|
offset.QuadPart = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
DWORD len = (size.QuadPart > 65536) ? 65536 : size.LowPart;
|
||||||
|
LPVOID mem = MapViewOfFile( map, FILE_MAP_READ, offset.HighPart,
|
||||||
|
offset.LowPart, len );
|
||||||
|
if (mem)
|
||||||
|
{
|
||||||
|
fwrite( mem, 1, len, stdout );
|
||||||
|
UnmapViewOfFile( mem );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print_error( name, title );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
offset.QuadPart += len;
|
||||||
|
size.QuadPart -= len;
|
||||||
|
} while (size.QuadPart);
|
||||||
|
CloseHandle( map );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
print_error( name, title );
|
||||||
|
}
|
||||||
|
CloseHandle( file );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Add or remove ANSICON to AutoRun.
|
||||||
|
void process_autorun( TCHAR cmd )
|
||||||
|
{
|
||||||
|
HKEY cmdkey;
|
||||||
|
TCHAR ansicon[MAX_PATH+8];
|
||||||
|
LPTSTR autorun, ansirun;
|
||||||
|
DWORD len, type, exist;
|
||||||
|
BOOL inst;
|
||||||
|
|
||||||
|
len = GetModuleFileName( NULL, ansicon+2, MAX_PATH );
|
||||||
|
ansicon[0] = '&';
|
||||||
|
ansicon[1] = ansicon[2+len] = '"';
|
||||||
|
_tcscpy( ansicon + 3+len, L" -p" );
|
||||||
|
len += 6;
|
||||||
|
|
||||||
|
inst = (_totlower( cmd ) == 'i');
|
||||||
|
RegCreateKeyEx( (_istlower( cmd )) ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,
|
||||||
|
CMDKEY, 0, NULL,
|
||||||
|
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
|
||||||
|
&cmdkey, &exist );
|
||||||
|
exist = 0;
|
||||||
|
RegQueryValueEx( cmdkey, AUTORUN, NULL, NULL, NULL, &exist );
|
||||||
|
autorun = malloc( exist + len * sizeof(TCHAR) + sizeof(TCHAR) );
|
||||||
|
// Let's assume there's sufficient memory.
|
||||||
|
if (exist > sizeof(TCHAR))
|
||||||
|
{
|
||||||
|
exist += sizeof(TCHAR);
|
||||||
|
RegQueryValueEx( cmdkey, AUTORUN, NULL, &type, (PBYTE)autorun, &exist );
|
||||||
|
ansirun = _tcsstr( autorun, ansicon+1 );
|
||||||
|
if (inst)
|
||||||
|
{
|
||||||
|
if (!ansirun)
|
||||||
|
{
|
||||||
|
_tcscpy( (LPTSTR)((PBYTE)autorun + exist - sizeof(TCHAR)), ansicon );
|
||||||
|
RegSetValueEx( cmdkey, AUTORUN, 0, type, (PBYTE)autorun,
|
||||||
|
exist + len*sizeof(TCHAR) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ansirun)
|
||||||
|
{
|
||||||
|
if (ansirun == autorun && exist == len*sizeof(TCHAR))
|
||||||
|
RegDeleteValue( cmdkey, AUTORUN );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ansirun > autorun && ansirun[-1] == '&')
|
||||||
|
--ansirun;
|
||||||
|
else if (autorun[len-1] != '&')
|
||||||
|
--len;
|
||||||
|
memcpy( ansirun, ansirun + len, exist - len*sizeof(TCHAR) );
|
||||||
|
RegSetValueEx( cmdkey, AUTORUN, 0, type, (PBYTE)autorun,
|
||||||
|
exist - len*sizeof(TCHAR) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (inst)
|
||||||
|
{
|
||||||
|
RegSetValueEx( cmdkey, AUTORUN, 0, REG_SZ, (PBYTE)(ansicon+1),
|
||||||
|
len*sizeof(TCHAR) );
|
||||||
|
}
|
||||||
|
|
||||||
|
free( autorun );
|
||||||
|
RegCloseKey( cmdkey );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Search each process in the snapshot for id.
|
||||||
|
BOOL find_proc_id( HANDLE snap, DWORD id, LPPROCESSENTRY32 ppe )
|
||||||
|
{
|
||||||
|
BOOL fOk;
|
||||||
|
|
||||||
|
ppe->dwSize = sizeof(PROCESSENTRY32);
|
||||||
|
for (fOk = Process32First( snap, ppe ); fOk; fOk = Process32Next( snap, ppe ))
|
||||||
|
if (ppe->th32ProcessID == id)
|
||||||
|
break;
|
||||||
|
|
||||||
|
return fOk;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Obtain the process and thread identifiers of the parent process.
|
||||||
|
BOOL GetParentProcessInfo( LPPROCESS_INFORMATION ppi )
|
||||||
|
{
|
||||||
|
HANDLE hSnap;
|
||||||
|
PROCESSENTRY32 pe;
|
||||||
|
THREADENTRY32 te;
|
||||||
|
DWORD id = GetCurrentProcessId();
|
||||||
|
BOOL fOk;
|
||||||
|
|
||||||
|
hSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS|TH32CS_SNAPTHREAD, id );
|
||||||
|
|
||||||
|
if (hSnap == INVALID_HANDLE_VALUE)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
find_proc_id( hSnap, id, &pe );
|
||||||
|
if (!find_proc_id( hSnap, pe.th32ParentProcessID, &pe ))
|
||||||
|
{
|
||||||
|
CloseHandle( hSnap );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
te.dwSize = sizeof(te);
|
||||||
|
for (fOk = Thread32First( hSnap, &te ); fOk; fOk = Thread32Next( hSnap, &te ))
|
||||||
|
if (te.th32OwnerProcessID == pe.th32ProcessID)
|
||||||
|
break;
|
||||||
|
|
||||||
|
CloseHandle( hSnap );
|
||||||
|
|
||||||
|
ppi->dwProcessId = pe.th32ProcessID;
|
||||||
|
ppi->dwThreadId = te.th32ThreadID;
|
||||||
|
|
||||||
|
return fOk;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Return the first non-space character from cmd.
|
||||||
|
LPTSTR skip_spaces( LPTSTR cmd )
|
||||||
|
{
|
||||||
|
while ((*cmd == ' ' || *cmd == '\t') && *cmd != '\0')
|
||||||
|
++cmd;
|
||||||
|
|
||||||
|
return cmd;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Return the end of the argument at cmd.
|
||||||
|
LPTSTR skip_arg( LPTSTR cmd )
|
||||||
|
{
|
||||||
|
while (*cmd != ' ' && *cmd != '\t' && *cmd != '\0')
|
||||||
|
{
|
||||||
|
if (*cmd == '"')
|
||||||
|
{
|
||||||
|
do
|
||||||
|
++cmd;
|
||||||
|
while (*cmd != '"' && *cmd != '\0');
|
||||||
|
if (*cmd == '\0')
|
||||||
|
--cmd;
|
||||||
|
}
|
||||||
|
++cmd;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cmd;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void help( void )
|
||||||
|
{
|
||||||
|
_putts( TEXT(
|
||||||
|
"ANSICON by Jason Hood <jadoxa@yahoo.com.au>.\n"
|
||||||
|
"Version " PVERS " (" PDATE "). Freeware.\n"
|
||||||
|
"http://ansicon.adoxa.cjb.net/\n"
|
||||||
|
"\n"
|
||||||
|
#ifdef _WIN64
|
||||||
|
"Process ANSI escape sequences in Windows console programs.\n"
|
||||||
|
#else
|
||||||
|
"Process ANSI escape sequences in Win32 console programs.\n"
|
||||||
|
#endif
|
||||||
|
"\n"
|
||||||
|
"ansicon -i|I | -u|U\n"
|
||||||
|
"ansicon [-m[<attr>]] [-p | -e|E string | -t|T [file(s)] | program [args]]\n"
|
||||||
|
"\n"
|
||||||
|
" -i\t\tinstall - add ANSICON to the AutoRun entry\n"
|
||||||
|
" -u\t\tuninstall - remove ANSICON from the AutoRun entry\n"
|
||||||
|
" -I -U\t\tuse local machine instead of current user\n"
|
||||||
|
" -m\t\tuse grey on black (\"monochrome\") or <attr> as default color\n"
|
||||||
|
" -p\t\thook into the parent process\n"
|
||||||
|
" -e\t\techo string\n"
|
||||||
|
" -E\t\techo string, don't append newline\n"
|
||||||
|
" -t\t\tdisplay files (\"-\" for stdin), combined as a single stream\n"
|
||||||
|
" -T\t\tdisplay files, name first, blank line before and after\n"
|
||||||
|
" program\trun the specified program\n"
|
||||||
|
" nothing\trun a new command processor, or display stdin if redirected\n"
|
||||||
|
"\n"
|
||||||
|
"<attr> is one or two hexadecimal digits; please use \"COLOR /?\" for details."
|
||||||
|
) );
|
||||||
|
}
|
35
ansicon.rc
Normal file
35
ansicon.rc
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
ansicon.rc - Version resource for ansicon.exe.
|
||||||
|
|
||||||
|
Jason Hood, 11 November, 2009.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <winver.h>
|
||||||
|
|
||||||
|
1 VERSIONINFO
|
||||||
|
FILEVERSION 1,3,0,0
|
||||||
|
PRODUCTVERSION 1,3,0,0
|
||||||
|
FILEOS VOS_NT
|
||||||
|
FILETYPE VFT_APP
|
||||||
|
{
|
||||||
|
BLOCK "StringFileInfo"
|
||||||
|
{
|
||||||
|
BLOCK "040904B0"
|
||||||
|
{
|
||||||
|
VALUE "Comments", "http://ansicon.adoxa.cjb.net/"
|
||||||
|
VALUE "CompanyName", "Jason Hood"
|
||||||
|
VALUE "FileDescription", "ANSI Console"
|
||||||
|
VALUE "FileVersion", "1.30"
|
||||||
|
VALUE "InternalName", "ansicon"
|
||||||
|
VALUE "LegalCopyright", "Freeware"
|
||||||
|
VALUE "OriginalFilename", "ansicon.exe"
|
||||||
|
VALUE "ProductName", "ANSICON"
|
||||||
|
VALUE "ProductVersion", "1.30"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BLOCK "VarFileInfo"
|
||||||
|
{
|
||||||
|
VALUE "Translation", 0x0409, 0x04B0
|
||||||
|
}
|
||||||
|
}
|
16
injdll.h
Normal file
16
injdll.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
injdll.h - Simple header file for injecting the DLL.
|
||||||
|
|
||||||
|
Jason Hood, 20 June, 2009.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INJDLL_H
|
||||||
|
#define INJDLL_H
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
void InjectDLL32( LPPROCESS_INFORMATION, LPCSTR );
|
||||||
|
void InjectDLL64( LPPROCESS_INFORMATION, LPCSTR );
|
||||||
|
|
||||||
|
#endif
|
112
injdll32.c
Normal file
112
injdll32.c
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
/*
|
||||||
|
Inject code into the target process to load our DLL. The target thread
|
||||||
|
should be suspended on entry; it remains suspended on exit.
|
||||||
|
|
||||||
|
Initially I used the "stack" method of injection. However, this fails
|
||||||
|
when DEP is active, since that doesn't allow code to execute in the stack.
|
||||||
|
To overcome this I used the "CreateRemoteThread" method. However, this
|
||||||
|
would fail with Wselect, a program to assist batch files. Wselect runs,
|
||||||
|
but it has no output. As it turns out, removing the suspended flag would
|
||||||
|
make Wselect work, but it caused problems with everything else. So now I
|
||||||
|
allocate a section of memory and change the context to run from there. At
|
||||||
|
first I had an event to signal when the library was loaded, then the memory
|
||||||
|
was released. However, that wouldn't work with -p and CMD.EXE (4NT v8
|
||||||
|
worked fine). Since it's possible the DLL might start a process suspended,
|
||||||
|
I've decided to simply keep the memory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "injdll.h"
|
||||||
|
|
||||||
|
#ifdef _WIN64
|
||||||
|
#include "wow64.h"
|
||||||
|
|
||||||
|
TWow64GetThreadContext Wow64GetThreadContext;
|
||||||
|
TWow64SetThreadContext Wow64SetThreadContext;
|
||||||
|
|
||||||
|
#define CONTEXT WOW64_CONTEXT
|
||||||
|
#undef CONTEXT_CONTROL
|
||||||
|
#define CONTEXT_CONTROL WOW64_CONTEXT_CONTROL
|
||||||
|
#define GetThreadContext Wow64GetThreadContext
|
||||||
|
#define SetThreadContext Wow64SetThreadContext
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
DWORD LLA;
|
||||||
|
|
||||||
|
|
||||||
|
void InjectDLL32( LPPROCESS_INFORMATION ppi, LPCSTR dll )
|
||||||
|
{
|
||||||
|
CONTEXT context;
|
||||||
|
DWORD len;
|
||||||
|
LPVOID mem;
|
||||||
|
DWORD mem32;
|
||||||
|
#define CODESIZE 20
|
||||||
|
BYTE code[CODESIZE+MAX_PATH];
|
||||||
|
|
||||||
|
len = lstrlenA( dll ) + 1;
|
||||||
|
if (len > MAX_PATH)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (LLA == 0)
|
||||||
|
{
|
||||||
|
#ifdef _WIN64
|
||||||
|
extern HMODULE hKernel;
|
||||||
|
#define GETPROC( proc ) proc = (T##proc)GetProcAddress( hKernel, #proc )
|
||||||
|
GETPROC( Wow64GetThreadContext );
|
||||||
|
GETPROC( Wow64SetThreadContext );
|
||||||
|
// Assume if one is defined, so is the other.
|
||||||
|
if (Wow64GetThreadContext == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
STARTUPINFO si;
|
||||||
|
PROCESS_INFORMATION pi;
|
||||||
|
ZeroMemory( &si, sizeof(si) );
|
||||||
|
si.cb = sizeof(si);
|
||||||
|
CopyMemory( code, dll, len - 7 ); // ...ANSI32.dll\0
|
||||||
|
CopyMemory( code + len - 7, "-LLA.exe", 9 ); // ...ANSI-LLA.exe\0
|
||||||
|
if (!CreateProcess( (char*)code, NULL, NULL, NULL, FALSE, 0, NULL, NULL,
|
||||||
|
&si, &pi ))
|
||||||
|
return;
|
||||||
|
WaitForSingleObject( pi.hProcess, INFINITE );
|
||||||
|
GetExitCodeProcess( pi.hProcess, &LLA );
|
||||||
|
CloseHandle( pi.hProcess );
|
||||||
|
CloseHandle( pi.hThread );
|
||||||
|
#else
|
||||||
|
LLA = (DWORD)GetProcAddress( GetModuleHandleA( "kernel32.dll" ),
|
||||||
|
"LoadLibraryA" );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
CopyMemory( code + CODESIZE, dll, len );
|
||||||
|
len += CODESIZE;
|
||||||
|
|
||||||
|
context.ContextFlags = CONTEXT_CONTROL;
|
||||||
|
GetThreadContext( ppi->hThread, &context );
|
||||||
|
mem = VirtualAllocEx( ppi->hProcess, NULL, len, MEM_COMMIT,
|
||||||
|
PAGE_EXECUTE_READWRITE );
|
||||||
|
mem32 = (DWORD)(DWORD_PTR)mem;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
PBYTE pB;
|
||||||
|
PDWORD pL;
|
||||||
|
} ip;
|
||||||
|
ip.pB = code;
|
||||||
|
|
||||||
|
*ip.pB++ = 0x68; // push eip
|
||||||
|
*ip.pL++ = context.Eip;
|
||||||
|
*ip.pB++ = 0x9c; // pushf
|
||||||
|
*ip.pB++ = 0x60; // pusha
|
||||||
|
*ip.pB++ = 0x68; // push "path\to\ANSI32.dll"
|
||||||
|
*ip.pL++ = mem32 + CODESIZE;
|
||||||
|
*ip.pB++ = 0xe8; // call LoadLibraryA
|
||||||
|
*ip.pL++ = LLA - (mem32 + (ip.pB+4 - code));
|
||||||
|
*ip.pB++ = 0x61; // popa
|
||||||
|
*ip.pB++ = 0x9d; // popf
|
||||||
|
*ip.pB++ = 0xc3; // ret
|
||||||
|
|
||||||
|
WriteProcessMemory( ppi->hProcess, mem, code, len, NULL );
|
||||||
|
FlushInstructionCache( ppi->hProcess, mem, len );
|
||||||
|
context.Eip = mem32;
|
||||||
|
SetThreadContext( ppi->hThread, &context );
|
||||||
|
}
|
98
injdll64.c
Normal file
98
injdll64.c
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
Inject code into the target process to load our DLL. The target thread
|
||||||
|
should be suspended on entry; it remains suspended on exit.
|
||||||
|
|
||||||
|
Initially I used the "stack" method of injection. However, this fails
|
||||||
|
when DEP is active, since that doesn't allow code to execute in the stack.
|
||||||
|
To overcome this I used the "CreateRemoteThread" method. However, this
|
||||||
|
would fail with Wselect, a program to assist batch files. Wselect runs,
|
||||||
|
but it has no output. As it turns out, removing the suspended flag would
|
||||||
|
make Wselect work, but it caused problems with everything else. So now I
|
||||||
|
allocate a section of memory and change the context to run from there. At
|
||||||
|
first I had an event to signal when the library was loaded, then the memory
|
||||||
|
was released. However, that wouldn't work with -p and CMD.EXE (4NT v8
|
||||||
|
worked fine). Since it's possible the DLL might start a process suspended,
|
||||||
|
I've decided to simply keep the memory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
void InjectDLL64( LPPROCESS_INFORMATION ppi, LPCSTR dll )
|
||||||
|
{
|
||||||
|
CONTEXT context;
|
||||||
|
DWORD len;
|
||||||
|
LPVOID mem;
|
||||||
|
DWORD64 LLA;
|
||||||
|
#define CODESIZE 92
|
||||||
|
static BYTE code[CODESIZE+MAX_PATH] = {
|
||||||
|
0,0,0,0,0,0,0,0, // original rip
|
||||||
|
0,0,0,0,0,0,0,0, // LoadLibraryA
|
||||||
|
0x9C, // pushfq
|
||||||
|
0x50, // push rax
|
||||||
|
0x51, // push rcx
|
||||||
|
0x52, // push rdx
|
||||||
|
0x53, // push rbx
|
||||||
|
0x55, // push rbp
|
||||||
|
0x56, // push rsi
|
||||||
|
0x57, // push rdi
|
||||||
|
0x41,0x50, // push r8
|
||||||
|
0x41,0x51, // push r9
|
||||||
|
0x41,0x52, // push r10
|
||||||
|
0x41,0x53, // push r11
|
||||||
|
0x41,0x54, // push r12
|
||||||
|
0x41,0x55, // push r13
|
||||||
|
0x41,0x56, // push r14
|
||||||
|
0x41,0x57, // push r15
|
||||||
|
0x48,0x83,0xEC,0x28, // sub rsp, 40
|
||||||
|
0x48,0x8D,0x0D,41,0,0,0, // lea ecx, "path\to\ANSI.dll"
|
||||||
|
0xFF,0x15,-49,-1,-1,-1, // call LoadLibraryA
|
||||||
|
0x48,0x83,0xC4,0x28, // add rsp, 40
|
||||||
|
0x41,0x5F, // pop r15
|
||||||
|
0x41,0x5E, // pop r14
|
||||||
|
0x41,0x5D, // pop r13
|
||||||
|
0x41,0x5C, // pop r12
|
||||||
|
0x41,0x5B, // pop r11
|
||||||
|
0x41,0x5A, // pop r10
|
||||||
|
0x41,0x59, // pop r9
|
||||||
|
0x41,0x58, // pop r8
|
||||||
|
0x5F, // pop rdi
|
||||||
|
0x5E, // pop rsi
|
||||||
|
0x5D, // pop rbp
|
||||||
|
0x5B, // pop rbx
|
||||||
|
0x5A, // pop rdx
|
||||||
|
0x59, // pop rcx
|
||||||
|
0x58, // pop rax
|
||||||
|
0x9D, // popfq
|
||||||
|
0xFF,0x25,-91,-1,-1,-1, // jmp original Rip
|
||||||
|
0, // dword alignment for LLA, fwiw
|
||||||
|
};
|
||||||
|
|
||||||
|
len = lstrlenA( dll ) + 1;
|
||||||
|
if (len > MAX_PATH)
|
||||||
|
return;
|
||||||
|
CopyMemory( code + CODESIZE, dll, len );
|
||||||
|
len += CODESIZE;
|
||||||
|
|
||||||
|
context.ContextFlags = CONTEXT_CONTROL;
|
||||||
|
GetThreadContext( ppi->hThread, &context );
|
||||||
|
mem = VirtualAllocEx( ppi->hProcess, NULL, len, MEM_COMMIT,
|
||||||
|
PAGE_EXECUTE_READWRITE );
|
||||||
|
LLA = (DWORD64)GetProcAddress( GetModuleHandleA( "kernel32.dll" ),
|
||||||
|
"LoadLibraryA" );
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
PBYTE pB;
|
||||||
|
PDWORD64 pL;
|
||||||
|
} ip;
|
||||||
|
ip.pB = code;
|
||||||
|
|
||||||
|
*ip.pL++ = context.Rip;
|
||||||
|
*ip.pL++ = LLA;
|
||||||
|
|
||||||
|
WriteProcessMemory( ppi->hProcess, mem, code, len, NULL );
|
||||||
|
FlushInstructionCache( ppi->hProcess, mem, len );
|
||||||
|
context.Rip = (DWORD64)mem + 16;
|
||||||
|
SetThreadContext( ppi->hThread, &context );
|
||||||
|
}
|
53
makefile
Normal file
53
makefile
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
# Simple makefile for ANSICON.
|
||||||
|
# Jason Hood, 11 March, 2006. Updated 20 June, 2009.
|
||||||
|
|
||||||
|
# I've used TDM64 (gcc 4.5.0), building the 32-bit version in the x86 directory
|
||||||
|
# and the 64-bit version in the x64 directory. MinGW32 (gcc 3.4.5) will also
|
||||||
|
# build the 32-bit version, but will of course fail on the 64-bit.
|
||||||
|
|
||||||
|
CC = gcc
|
||||||
|
CFLAGS = -O2 -Wall
|
||||||
|
|
||||||
|
x86/%.o: %.c
|
||||||
|
$(CC) -m32 -c $(CFLAGS) $(CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
x86/%v.o: %.rc
|
||||||
|
windres -U _WIN64 -F pe-i386 $< $@
|
||||||
|
|
||||||
|
x64/%.o: %.c
|
||||||
|
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
|
||||||
|
|
||||||
|
x64/%v.o: %.rc
|
||||||
|
windres $< $@
|
||||||
|
|
||||||
|
all: ansicon32 ansicon64
|
||||||
|
|
||||||
|
ansicon32: x86/ansicon.exe x86/ANSI32.dll
|
||||||
|
|
||||||
|
ansicon64: x64/ansicon.exe x64/ANSI64.dll x64/ANSI32.dll x64/ANSI-LLA.exe
|
||||||
|
|
||||||
|
x86/ansicon.exe: x86/ansicon.o x86/injdll32.o x86/ansiconv.o
|
||||||
|
$(CC) -m32 $+ -s -o $@
|
||||||
|
|
||||||
|
x86/ANSI32.dll: x86/ANSI.o x86/injdll32.o x86/ansiv.o
|
||||||
|
$(CC) -m32 $+ -s -o $@ -mdll -Wl,-shared
|
||||||
|
|
||||||
|
x64/ansicon.exe: x64/ansicon.o x64/injdll64.o x64/ansiconv.o
|
||||||
|
$(CC) $+ -s -o $@
|
||||||
|
|
||||||
|
x64/ANSI64.dll: x64/ANSI.o x64/injdll64.o x64/injdll32.o x64/ansiv.o
|
||||||
|
$(CC) $+ -s -o $@ -mdll -Wl,-shared
|
||||||
|
|
||||||
|
x64/ANSI32.dll: x86/ANSI32.dll
|
||||||
|
cmd /c copy x86\ANSI32.dll x64\ANSI32.dll
|
||||||
|
|
||||||
|
x64/ANSI-LLA.exe: ANSI-LLA.c
|
||||||
|
$(CC) -m32 $(CFLAGS) $< -s -o $@
|
||||||
|
|
||||||
|
x86/ansiconv.o: ansicon.rc
|
||||||
|
x86/ansiv.o: ansi.rc
|
||||||
|
x64/ansiconv.o: ansicon.rc
|
||||||
|
x64/ansiv.o: ansi.rc
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-cmd /c "del x86\*.o x64\*.o"
|
236
readme.txt
Normal file
236
readme.txt
Normal file
@ -0,0 +1,236 @@
|
|||||||
|
|
||||||
|
ANSICON
|
||||||
|
|
||||||
|
Copyright 2005-2010 Jason Hood
|
||||||
|
|
||||||
|
Version 1.30. Freeware
|
||||||
|
|
||||||
|
|
||||||
|
===========
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
ANSICON provides ANSI escape sequences for Windows console programs. It
|
||||||
|
provides much the same functionality as `ANSI.SYS' does for MS-DOS.
|
||||||
|
|
||||||
|
|
||||||
|
============
|
||||||
|
Requirements
|
||||||
|
============
|
||||||
|
|
||||||
|
Windows 2000 Professional and later (it won't work with NT or 9X).
|
||||||
|
|
||||||
|
|
||||||
|
============
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
Add x86 (if your OS is 32-bit) or x64 (if 64-bit) to your PATH, or copy
|
||||||
|
the relevant files to a directory already on the PATH. Alternatively,
|
||||||
|
use option `-i' (or `-I') to install it permanently, by adding an entry
|
||||||
|
to CMD.EXE's AutoRun registry value (current user or local machine,
|
||||||
|
respectively). Uninstall simply involves closing any programs that are
|
||||||
|
currently using it, running with `-u' (and again with `-U') to remove
|
||||||
|
the AutoRun entry/ies, then removing the directory from PATH or deleting
|
||||||
|
the files. No other changes are made.
|
||||||
|
|
||||||
|
---------
|
||||||
|
Upgrading
|
||||||
|
---------
|
||||||
|
|
||||||
|
Delete ANSI.dll, it has been replaced with ANSI32.dll.
|
||||||
|
|
||||||
|
|
||||||
|
=====
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
Running ANSICON with no arguments will start a new instance of the com-
|
||||||
|
mand processor (the program defined by the `ComSpec' environment var-
|
||||||
|
iable, typically `CMD.EXE'), or display standard input if it is redir-
|
||||||
|
ected. Passing the option `-p' (case sensitive) will enable the parent
|
||||||
|
process to recognise escapes (i.e. the command shell used to run ANSI-
|
||||||
|
CON). Use `-m' to set the current (and default) attribute to grey on
|
||||||
|
black ("monochrome"), or the attribute following the `m' (please use
|
||||||
|
`COLOR /?' for attribute values). The option `-e' will echo the command
|
||||||
|
line - the character after the `e' is ignored, the remainder is display-
|
||||||
|
ed verbatim; use `-E' to prevent a newline being written. The option
|
||||||
|
`-t' will display each file (or standard input if none or it is "-"), as
|
||||||
|
though they are a single file; `-T' will display the file name (in be-
|
||||||
|
tween "==> " and " <=="), a blank line (or an error message), the file
|
||||||
|
and another blank line. Anything else will be treated as a program and
|
||||||
|
its arguments. Eg: `ansicon -m30 -t file.ans' will display `file.ans'
|
||||||
|
using black on cyan as the default color.
|
||||||
|
|
||||||
|
Once installed, the ANSICON environment variable will be created. This
|
||||||
|
variable is of the form "WxH (wxh)", where W & H are the width and
|
||||||
|
height of the buffer and w & h are the width and height of the window.
|
||||||
|
The variable is updated whenever a program reads it directly (i.e. as
|
||||||
|
an individual request, not as part of the entire environment block).
|
||||||
|
For example, "set an" will not update it, but "echo %ansicon%" will.
|
||||||
|
|
||||||
|
|
||||||
|
=========
|
||||||
|
Sequences
|
||||||
|
=========
|
||||||
|
|
||||||
|
The following escape sequences are recognised.
|
||||||
|
|
||||||
|
\e[#A CUU: CUrsor Up
|
||||||
|
\e[#B CUD: CUrsor Down
|
||||||
|
\e[#C CUF: CUrsor Forward
|
||||||
|
\e[#D CUB: CUrsor Backward
|
||||||
|
\e[#E CNL: Cursor Next Line
|
||||||
|
\e[#F CPL: Cursor Preceding Line
|
||||||
|
\e[#G CHA: Cursor Horizontal Absolute
|
||||||
|
\e[#;#H CUP: CUrsor Position
|
||||||
|
\e[#;#f HVP: Horizontal and Vertical Position
|
||||||
|
\e[s SCP: Save Cursor Position
|
||||||
|
\e[u RCP: Restore Cursor Position
|
||||||
|
\e[#J ED: Erase Display
|
||||||
|
\e[#K EL: Erase Line
|
||||||
|
\e[#L IL: Insert Lines
|
||||||
|
\e[#M DL: Delete Lines
|
||||||
|
\e[#@ ICH: Insert CHaracter
|
||||||
|
\e[#P DCH: Delete CHaracter
|
||||||
|
\e[#;#;#m SGM: Set Graphics Mode
|
||||||
|
|
||||||
|
`\e' represents the escape character (ASCII 27); `#' represents a
|
||||||
|
decimal number (optional, in most cases defaulting to 1). Regarding
|
||||||
|
SGM: bold will set the foreground intensity; underline and blink will
|
||||||
|
set the background intensity; conceal uses background as foreground.
|
||||||
|
|
||||||
|
I make a distinction between "\e[m" and "\e[0;...m". Both will restore
|
||||||
|
the original foreground/background colors (and so "0" should be the
|
||||||
|
first parameter); the former will also restore the original bold and
|
||||||
|
underline attributes, whilst the latter will explicitly reset them.
|
||||||
|
|
||||||
|
|
||||||
|
===========
|
||||||
|
Limitations
|
||||||
|
===========
|
||||||
|
|
||||||
|
The entire console buffer is used, not just the visible window.
|
||||||
|
|
||||||
|
If running CMD.EXE, its own COLOR will be the initial color.
|
||||||
|
|
||||||
|
|
||||||
|
===============
|
||||||
|
Version History
|
||||||
|
===============
|
||||||
|
|
||||||
|
Legend: + added, - bug-fixed, * changed.
|
||||||
|
|
||||||
|
1.30 - 7 September, 2010:
|
||||||
|
+ x64 version.
|
||||||
|
|
||||||
|
1.25 - 22 July, 2010:
|
||||||
|
- hook LoadLibraryEx (now CScript works);
|
||||||
|
- fixed -i when AutoRun existed, but was empty;
|
||||||
|
+ support for Windows 7;
|
||||||
|
+ -I (and -U) use HKEY_LOCAL_MACHINE.
|
||||||
|
|
||||||
|
1.24 - 7 January, 2010:
|
||||||
|
- fix -t and -e when ANSICON was already running;
|
||||||
|
+ read standard input if redirected with no arguments, if -t has no
|
||||||
|
files, or if the name is "-" (which also serves as a workaround for
|
||||||
|
programs that don't get hooked, such as CScript).
|
||||||
|
|
||||||
|
1.23 - 11 November, 2009:
|
||||||
|
- restore hooked functions when unloading;
|
||||||
|
- reverse the "bold" and "underline" settings;
|
||||||
|
* conceal characters by making foreground color same as background.
|
||||||
|
|
||||||
|
1.22 - 5 October, 2009:
|
||||||
|
- hook LoadLibrary to inject into applications started via association.
|
||||||
|
|
||||||
|
1.21 - 23 September, 2009:
|
||||||
|
+ -i (and -u) option to add (remove) entry to AutoRun value.
|
||||||
|
|
||||||
|
1.20 - 21 June, 2009:
|
||||||
|
* use another injection method;
|
||||||
|
+ create ANSICON environment variable;
|
||||||
|
+ -e (and -E) option to echo the command line (without newline);
|
||||||
|
+ -t (and -T) option to type (display) files (with file name).
|
||||||
|
|
||||||
|
1.15 - 17 May, 2009:
|
||||||
|
- fix output corruption for long (over 8192 characters) ANSI strings.
|
||||||
|
|
||||||
|
1.14 - 3 April, 2009:
|
||||||
|
- fix the test for an empty import section (eg. XCOPY now works).
|
||||||
|
|
||||||
|
1.13 - 21 & 27 March, 2009:
|
||||||
|
* use a new injection method (to work with DEP);
|
||||||
|
* use Unicode.
|
||||||
|
|
||||||
|
1.12 - 9 March, 2009:
|
||||||
|
- fix processing child programs (generate a relocatable DLL).
|
||||||
|
|
||||||
|
1.11 - 28 February, 2009:
|
||||||
|
- fix processing child programs (only use for console executables).
|
||||||
|
|
||||||
|
1.10 - 22 February, 2009:
|
||||||
|
- fix output corruption (buffer overflow in MyConsoleWriteW);
|
||||||
|
- recognise current screen attributes as current ANSI atrributes;
|
||||||
|
- ignore Ctrl+C and Ctrl+Break;
|
||||||
|
+ process child programs.
|
||||||
|
|
||||||
|
1.01 - 12 March, 2006:
|
||||||
|
* \e[m will restore original color, not set grey on black;
|
||||||
|
+ -m option to set default (and initial) color;
|
||||||
|
- restore original color on exit;
|
||||||
|
- disable escape processing when console has disabled processed output;
|
||||||
|
+ \e[5m (blink) is the same as \e[4m (underline);
|
||||||
|
- do not conceal control characters (0 to 31).
|
||||||
|
|
||||||
|
1.00 - 23 October, 2005:
|
||||||
|
+ initial release.
|
||||||
|
|
||||||
|
|
||||||
|
===============
|
||||||
|
Acknowledgments
|
||||||
|
===============
|
||||||
|
|
||||||
|
Jean-Louis Morel, for his Perl package Win32::Console::ANSI. It
|
||||||
|
provided the basis of `ANSI.dll'.
|
||||||
|
|
||||||
|
Sergey Oblomov (hoopoepg), for Console Manager. It provided the basis
|
||||||
|
of `ansicon.exe'.
|
||||||
|
|
||||||
|
Anton Bassov's article "Process-wide API spying - an ultimate hack" in
|
||||||
|
"The Code Project".
|
||||||
|
|
||||||
|
Richard Quadling - his persistence in finding bugs has made ANSICON
|
||||||
|
what it is today.
|
||||||
|
|
||||||
|
Dmitry Menshikov, Marko Bozikovic and Philippe Villiers, for their
|
||||||
|
assistance in making the 64-bit version a reality.
|
||||||
|
|
||||||
|
|
||||||
|
=======
|
||||||
|
Contact
|
||||||
|
=======
|
||||||
|
|
||||||
|
mailto:jadoxa@yahoo.com.au
|
||||||
|
http://ansicon.adoxa.cjb.net/
|
||||||
|
|
||||||
|
Jason Hood
|
||||||
|
11 Buckle Street
|
||||||
|
North Rockhampton
|
||||||
|
Qld 4701
|
||||||
|
Australia
|
||||||
|
|
||||||
|
|
||||||
|
============
|
||||||
|
Distribution
|
||||||
|
============
|
||||||
|
|
||||||
|
The original zipfile can be freely distributed, by any means. However,
|
||||||
|
I would like to be informed if it is placed on a CD-ROM (other than an
|
||||||
|
archive compilation; permission is granted, I'd just like to know).
|
||||||
|
Modified versions may be distributed, provided it is indicated as such
|
||||||
|
in the version text and a source diff is included.
|
||||||
|
|
||||||
|
|
||||||
|
==============================
|
||||||
|
Jason Hood, 7 September, 2010.
|
88
wow64.h
Normal file
88
wow64.h
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
wow64.h - Definitions for Wow64.
|
||||||
|
|
||||||
|
Mingw64/TDM does not include these Wow64 definitions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef WOW64_H
|
||||||
|
#define WOW64_H
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#define WOW64_CONTEXT_i386 0x00010000
|
||||||
|
|
||||||
|
#define WOW64_CONTEXT_CONTROL (WOW64_CONTEXT_i386 | 0x00000001L)
|
||||||
|
#define WOW64_CONTEXT_INTEGER (WOW64_CONTEXT_i386 | 0x00000002L)
|
||||||
|
#define WOW64_CONTEXT_SEGMENTS (WOW64_CONTEXT_i386 | 0x00000004L)
|
||||||
|
#define WOW64_CONTEXT_FLOATING_POINT (WOW64_CONTEXT_i386 | 0x00000008L)
|
||||||
|
#define WOW64_CONTEXT_DEBUG_REGISTERS (WOW64_CONTEXT_i386 | 0x00000010L)
|
||||||
|
#define WOW64_CONTEXT_EXTENDED_REGISTERS (WOW64_CONTEXT_i386 | 0x00000020L)
|
||||||
|
|
||||||
|
#define WOW64_CONTEXT_FULL (WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS)
|
||||||
|
|
||||||
|
#define WOW64_CONTEXT_ALL (WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS | \
|
||||||
|
WOW64_CONTEXT_FLOATING_POINT | WOW64_CONTEXT_DEBUG_REGISTERS | \
|
||||||
|
WOW64_CONTEXT_EXTENDED_REGISTERS)
|
||||||
|
|
||||||
|
#define WOW64_SIZE_OF_80387_REGISTERS 80
|
||||||
|
|
||||||
|
#define WOW64_MAXIMUM_SUPPORTED_EXTENSION 512
|
||||||
|
|
||||||
|
typedef struct _WOW64_FLOATING_SAVE_AREA {
|
||||||
|
DWORD ControlWord;
|
||||||
|
DWORD StatusWord;
|
||||||
|
DWORD TagWord;
|
||||||
|
DWORD ErrorOffset;
|
||||||
|
DWORD ErrorSelector;
|
||||||
|
DWORD DataOffset;
|
||||||
|
DWORD DataSelector;
|
||||||
|
BYTE RegisterArea[WOW64_SIZE_OF_80387_REGISTERS];
|
||||||
|
DWORD Cr0NpxState;
|
||||||
|
} WOW64_FLOATING_SAVE_AREA;
|
||||||
|
|
||||||
|
typedef WOW64_FLOATING_SAVE_AREA *PWOW64_FLOATING_SAVE_AREA;
|
||||||
|
|
||||||
|
typedef struct _WOW64_CONTEXT {
|
||||||
|
|
||||||
|
DWORD ContextFlags;
|
||||||
|
|
||||||
|
DWORD Dr0;
|
||||||
|
DWORD Dr1;
|
||||||
|
DWORD Dr2;
|
||||||
|
DWORD Dr3;
|
||||||
|
DWORD Dr6;
|
||||||
|
DWORD Dr7;
|
||||||
|
|
||||||
|
WOW64_FLOATING_SAVE_AREA FloatSave;
|
||||||
|
|
||||||
|
DWORD SegGs;
|
||||||
|
DWORD SegFs;
|
||||||
|
DWORD SegEs;
|
||||||
|
DWORD SegDs;
|
||||||
|
|
||||||
|
DWORD Edi;
|
||||||
|
DWORD Esi;
|
||||||
|
DWORD Ebx;
|
||||||
|
DWORD Edx;
|
||||||
|
DWORD Ecx;
|
||||||
|
DWORD Eax;
|
||||||
|
|
||||||
|
DWORD Ebp;
|
||||||
|
DWORD Eip;
|
||||||
|
DWORD SegCs;
|
||||||
|
DWORD EFlags;
|
||||||
|
DWORD Esp;
|
||||||
|
DWORD SegSs;
|
||||||
|
|
||||||
|
BYTE ExtendedRegisters[WOW64_MAXIMUM_SUPPORTED_EXTENSION];
|
||||||
|
|
||||||
|
} WOW64_CONTEXT;
|
||||||
|
|
||||||
|
typedef WOW64_CONTEXT *PWOW64_CONTEXT;
|
||||||
|
|
||||||
|
|
||||||
|
typedef BOOL WINAPI (*TWow64GetThreadContext)( HANDLE hThread, PWOW64_CONTEXT lpContext );
|
||||||
|
typedef BOOL WINAPI (*TWow64SetThreadContext)( HANDLE hThread, CONST WOW64_CONTEXT *lpContext );
|
||||||
|
|
||||||
|
#endif
|
BIN
x64/ANSI-LLA.exe
Normal file
BIN
x64/ANSI-LLA.exe
Normal file
Binary file not shown.
BIN
x64/ANSI32.dll
Normal file
BIN
x64/ANSI32.dll
Normal file
Binary file not shown.
BIN
x64/ANSI64.dll
Normal file
BIN
x64/ANSI64.dll
Normal file
Binary file not shown.
BIN
x64/ansicon.exe
Normal file
BIN
x64/ansicon.exe
Normal file
Binary file not shown.
BIN
x86/ANSI32.dll
Normal file
BIN
x86/ANSI32.dll
Normal file
Binary file not shown.
BIN
x86/ansicon.exe
Normal file
BIN
x86/ansicon.exe
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user