Add files via upload

This commit is contained in:
avast-ti 2021-05-19 13:26:37 +02:00 committed by GitHub
parent c429804afa
commit 4e0e58a2a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
90 changed files with 5596 additions and 0 deletions

23
VB-Research/README.md Normal file
View File

@ -0,0 +1,23 @@
# VB6 Research samples
More technical informations at <https://decoded.avast.io/davidzimmer/reusing-vb6-p-code-functions/>
### Table of Contents
| Folder name | Description
|-------------------------|--------------------------------
| firstTest | simple return value from pcode
| globalVar | setup/test mem to handle global variables
| structs | passing structs from C to pcode
| two_funcs | interlink two pcode functions
| binary_ConstPoolEntry1 | test decoding a binary const pool entry
| binary_ConstPoolEntry2 | as 1, simplified decoding technique.
| lateBinding | late bind sapi voice example
| earlyBinding | early bind sapi voice example
| decrypt_test | ripping a decryptor from a pcode exe and calling directly with complex prototype
| getVarData | c host returns different types of variant data from callback to pcode.
| decrypt_benchmark | rc4 benchmarking apps in c/pcode and straight C
All samples were compiled using VB6 and VS 2008.

View File

@ -0,0 +1,36 @@
Attribute VB_Name = "Module1"
Option Explicit
Declare Function callback Lib "dummy" (ByRef b As Byte) As Long
Declare Function progress Lib "dummy" (ByVal b As Byte) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
Sub Main()
End Sub
Function test(ByVal xorKey As Long) As Long
Dim s As String
Dim b() As Byte
Dim i As Long
progress xorKey
'create const pool entry
'normally this would be a unicode string but we will make it binary
s = "this is my string"
progress LenB(s)
ReDim b(LenB(s))
CopyMemory ByVal VarPtr(b(0)), ByVal StrPtr(s), UBound(b)
progress 4
For i = 0 To UBound(b)
b(i) = b(i) Xor xorKey
Next
callback b(0) 'we should receive decoded C string that we can modify
test = progress(b(0)) 'just to pass back the data to see if modified..
End Function

View File

@ -0,0 +1,34 @@
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\Windows\SysWOW64\stdole2.tlb#OLE Automation
Module=Module1; Module1.bas
Startup="Sub Main"
HelpFile=""
Title="Project1"
ExeName32="Project1.exe"
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=-1
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
[fastBuild]
fullPath=%ap%\Project1.exe

View File

@ -0,0 +1 @@
Module1 = 52, 52, 896, 687,

View File

@ -0,0 +1,3 @@
Test decoding a binary const pool entry.
TODO: update to BSTR proper see latter examples

View File

@ -0,0 +1,173 @@
#include <windows.h>
#include <stdio.h>
#include <conio.h>
/*
output:
Launching pcode
in progress value = 55 <-- xor key passed into vb pcode as func arg
in progress value = 13 <-- strlen binary str
in progress value = 4 <-- step 4
in callback cstr = this is my string <-- cstr from decoded binary str in c callback
in progress value = 41 <-- first byte of string passed to callback modifed
retval = 43 <-- return value from progress callback (val+2)
*/
unsigned char pcode[] = {
0x6C, 0x0C, 0x00, 0xFC, 0x0E, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x3C, 0x1B, 0x01, 0x00, 0x43, 0x74,
0xFF, 0x6C, 0x74, 0xFF, 0xFB, 0xEE, 0xFC, 0x0E, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x3C, 0xF5, 0x00,
0x00, 0x00, 0x00, 0x6C, 0x74, 0xFF, 0xFB, 0xEE, 0x04, 0x70, 0xFF, 0xFE, 0x8E, 0x01, 0x00, 0x11,
0x00, 0x01, 0x00, 0x80, 0x00, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x70, 0xFF, 0x2E, 0x68, 0xFF,
0x40, 0x5E, 0x02, 0x00, 0x04, 0x00, 0x71, 0x64, 0xFF, 0x2D, 0x68, 0xFF, 0x6C, 0x74, 0xFF, 0x5E,
0x02, 0x00, 0x04, 0x00, 0x71, 0x60, 0xFF, 0x6C, 0x70, 0xFF, 0xF4, 0x01, 0xFC, 0xCB, 0x6C, 0x60,
0xFF, 0x6C, 0x64, 0xFF, 0x0A, 0x03, 0x00, 0x0C, 0x00, 0x3C, 0xF4, 0x04, 0xFC, 0x0D, 0x0A, 0x00,
0x00, 0x04, 0x00, 0x3C, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x04, 0x6C, 0xFF, 0x6C, 0x70, 0xFF, 0xF4,
0x01, 0xFC, 0xCB, 0xFE, 0x64, 0x58, 0xFF, 0xA9, 0x00, 0x6C, 0x6C, 0xFF, 0x6C, 0x70, 0xFF, 0xFC,
0x90, 0xE7, 0x6C, 0x0C, 0x00, 0xFB, 0x13, 0xFC, 0x0E, 0x6C, 0x6C, 0xFF, 0x6C, 0x70, 0xFF, 0xFC,
0xA0, 0x04, 0x6C, 0xFF, 0x66, 0x58, 0xFF, 0x89, 0x00, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x70,
0xFF, 0x2E, 0x68, 0xFF, 0x40, 0x0A, 0x04, 0x00, 0x04, 0x00, 0x3C, 0x2D, 0x68, 0xFF, 0xF5, 0x00,
0x00, 0x00, 0x00, 0x6C, 0x70, 0xFF, 0xFC, 0x90, 0x5E, 0x00, 0x00, 0x04, 0x00, 0x71, 0x64, 0xFF,
0x3C, 0x6C, 0x64, 0xFF, 0x71, 0x78, 0xFF, 0x14, 0xA8, 0x10, 0x40, 0x00, 0x08, 0x00, 0x24, 0x00,
0xD8, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xFF, 0x05, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFF, 0x06, 0x00, 0xE9, 0xE9, 0xE9, 0xE9,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x9E, 0x9E, 0x9E, 0x9E,
0x6C, 0x17, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF
};
struct ObjectTable{
int lNull1; // As Long ' 0x00 (00d)
int aExecProj; // As Long ' 0x04 (04d) Pointer to a memory structure
int aProjectInfo2; // As Long ' 0x08 (08d) Pointer to Project Info 2
int Const1; // As Long ' 0x0C
int Null2; // As Long ' 0x10
int lpProjectObject; // As Long ' 0x14
char uuidObj[15]; // As Byte 'converted from 4 flags dzzie (from vb.idc)
short fCompileType; // As Integer ' 0x28 (40d) Internal flag used during compilation
short ObjectCount1; // As Integer ' 0x2A
short iCompiledObjects; // As Integer ' 0x2C (44d) Number of objects compiled.
short iObjectsInUse; // As Integer ' 0x2E (46d) Updated in the IDE to correspond the total number ' but will go up or down when initializing/unloading modules.
int lpObjectArray; // As Long ' 0x30
int fIdeFlag; // As Long ' 0x34
int lpIdeData; // As Long ' 0x38
int lpIdeData2; // As Long ' 0x3C
int aProjectName; // As Long ' 0x40 NTS
int LangID1; // As Long ' 0x44
int LangID2; // As Long ' 0x48
int lpIdeData3; // As Long ' 0x4C
int dwIdentifier; // As Long ' 0x50
};
struct CodeObject{
int aObjectInfo; // As Long ' 0x00 Pointer to the Object Info for this Object.
int Const1; // As Long ' 0x04 Always set to -1 after compiling.
int aPublicBytes; // As Long ' 0x08 Pointer to Public Variable Size integers
int aStaticBytes; // As Long ' 0x0C Pointer to Static Variables Struct
int aModulePublic; // As Long ' 0x10 Pointer to Public Variables in DATA section
int aModuleStatic; // As Long ' 0x14 Pointer to Static Variables in DATA section
int aObjectName; // As Long ' 0x18 Name of the Object.
int ProcCount; // As Long ' 0x1C Number of Methods in Object
int aProcNamesArray;// As Long ' 0x20 If present, pointer to Method names array.
int oStaticVars; // As Long ' 0x24 Offset to Static Vars from aModuleStatic
int ObjectType; // As Long ' 0x28 Flags defining the Object Type.
int Null3; // As Long ' 0x2C Not valid after compilation.
};
struct ObjectInfo{
short wRefCount; // 0 As Integer ' Always 1 after compilation.
short ObjectIndex; // 2 As Integer '
int aObjectTable; // 4 As Long ' Pointer to the Object Table
int lpIdeData; // 8 Long ' Zero after compilation. Used in IDE only.
int lpPrivateObject; // 0xC As Long ' Pointer to Private Object Descriptor.
int dwReserved; // 0x10 As Long
int Null2; // 0x14 As Long
int aObject; // 0x18 As Long ' points to the parent tObject
int lpProjectData; // 0x1c As Long ' 0x1C [can someone verify this?]
short NumberOfProcs; // 0x20 As Integer
short wMethodCount2; // 0x22 As Integer ' Zeroed out after compilation. IDE only.
int lpMethods; // 0x24 As Long ' Pointer to Array of Methods.
short iConstantsCount; // 0x28 As Integer ' Number of Constants
short iMaxConstants; // 0x2A As Integer ' Maximum Constants to allocate.
int lpIdeData2; // 0x2C As Long
int lpIdeData3; // 0x30 As Long
int lpConstantPool; // 0x34 As Long 'can be immediatly followed by OptionalObjectInfo
};
//Declare Function callback Lib "dummy" (ByRef b As Byte) As Long
int __stdcall callback(char* cstr)
{
printf("in callback cstr = %s\n", cstr);
cstr[0] = 0x41; //to show we can modify values
return 21;
}
//Declare Function progress Lib "dummy" (ByVal b As Byte) As Long
int __stdcall progress(unsigned char b)
{
printf("in progress value = %x\n", b);
return b + 2;
}
void main(void){
int rv = 0;
void* constPool[20] = {0};
int lpProjObj[10] = {0};
ObjectTable objtable = {0};
CodeObject codeObj = {0};
ObjectInfo objInfo = {0};
typedef IUnknown* (__stdcall *CreateIExprSrvObj)(int,int,int);
HMODULE h = (HMODULE)LoadLibrary("msvbvm60.dll");
int lpProcCallEngine = (int)GetProcAddress(h,"ProcCallEngine");
CreateIExprSrvObj IExprSrvObj = (CreateIExprSrvObj)GetProcAddress(h,"CreateIExprSrvObj");
//printf("ProcCallEngine = %x, CreateIExprSrvObj=%x\n", lpProcCallEngine,IExprSrvObj);
IUnknown *iunk = IExprSrvObj(0,4,0); //initilize runtime
int mainLastOffset = (int)&pcode + (0xD8);
(*(int*)mainLastOffset) = (int)&objInfo; //patch RTMI of pcode to point to our dynamic ObjInfo Struct
objInfo.aObject = (int)&codeObj;
objInfo.lpConstantPool = (int)&constPool;
objInfo.aObjectTable = (int)&objtable;
objtable.lpProjectObject = (int)&lpProjObj; //ENGINE:66104EAB [ebp-2Ch] = ObjTable.lpProjectObject[0x0C]; (heap memory) unknown
/* dont do this..only works if not modified can crash latter..
lengthPrefix + xor('this is my string\x0', 0x55) //embedding binary data in const pool
unsigned char binaryString[] = {
19, 0,0,0, //strlen
0x21, 0x3D, 0x3C, 0x26, 0x75, 0x3C, 0x26, 0x75, 0x38, 0x2C, 0x75, 0x26, 0x21, 0x27, 0x3C, 0x3B, 0x32, 0x75, 0x55, 0x55
};//constPool[1] = &binaryString[4]; // <-- point to start of string after embedded 4 byte length */
constPool[0] = &progress;
constPool[1] = SysAllocStringByteLen("\x21\x3D\x3C\x26\x75\x3C\x26\x75\x38\x2C\x75\x26\x21\x27\x3C\x3B\x32\x75\x55\x55", 19);
constPool[2] = GetProcAddress(h,"VarPtr");
constPool[3] = GetProcAddress(GetModuleHandle("kernel32"),"RtlMoveMemory");
constPool[4] = &callback;
printf("Launching pcode\n");
_asm{
//int 3
push 0x55 ;//Function test(ByVal xorKey As Long) As Long this is xorkey arg
mov edx, mainLastOffset
mov ecx, lpProcCallEngine
call ecx
mov rv, eax ;//return value from our vb function
}
if(iunk!=NULL) iunk->Release(); //doesnt really matter...
printf("retval = %x\n", rv); //sub main can not return a value, but we can use any prototype for other funcs..no need to use only main.
printf("Press any key to exit...");
getch();
}

View File

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psc", "psc.vcproj", "{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.ActiveCfg = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.Build.0 = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.ActiveCfg = Release|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,176 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="psc"
ProjectGUID="{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
RootNamespace="psc"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="test.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath=".\main.cpp"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -0,0 +1,29 @@
Attribute VB_Name = "Module1"
Option Explicit
Declare Function callback Lib "dummy" (ByRef b As Byte) As Long
Declare Function progress Lib "dummy" (ByVal b As Byte) As Long
'Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
Sub Main()
End Sub
Function test(ByVal xorKey As Long) As Long
Dim b() As Byte
Dim i As Long
progress xorKey
b() = "this is my string"
progress UBound(b)
For i = 0 To UBound(b)
b(i) = b(i) Xor xorKey
Next
callback b(0) 'we should receive decoded C string that we can modify
test = progress(b(0)) 'just to pass back the data to see if modified..
End Function

View File

@ -0,0 +1,34 @@
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\Windows\SysWOW64\stdole2.tlb#OLE Automation
Module=Module1; Module1.bas
Startup="Sub Main"
HelpFile=""
Title="Project1"
ExeName32="Project1.exe"
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=-1
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
[fastBuild]
fullPath=%ap%\Project1.exe

View File

@ -0,0 +1 @@
Module1 = 52, 52, 912, 715,

View File

@ -0,0 +1,11 @@
This sample shows how to:
* embed binary strings in the constant pool
* decode them in pcode with an xor key given as an arg to the function
* do C call backs
* modify data in a c callback for use in the pcode
* return values both from callbacks, and from the pcode function itself
This one has been simplified from v1 to eliminate the copymemory call
and the CStr2Vec pcode function to convert a binary string from the const pool
into a byte array.

View File

@ -0,0 +1,158 @@
#include <windows.h>
#include <stdio.h>
#include <conio.h>
/*
output:
Launching pcode
in progress value = 55 <-- xor key passed into vb pcode as func arg
in progress value = 12 <-- ubound binary byte array from string
in callback cstr = this is my string <-- cstr from decoded binary str in c callback
in progress value = 41 <-- first byte of string passed to callback modifed
retval = 43 <-- return value from progress callback (val+2)
*/
unsigned char pcode[] = {
0x6C, 0x0C, 0x00, 0xFC, 0x0E, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x3C, 0x1B, 0x01, 0x00, 0xFC, 0x5F,
0x6C, 0xFF, 0x04, 0x6C, 0xFF, 0x04, 0x74, 0xFF, 0xFF, 0x01, 0x6C, 0x74, 0xFF, 0xF4, 0x01, 0xFC,
0xCB, 0xFC, 0x0E, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x3C, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x04, 0x70,
0xFF, 0x6C, 0x74, 0xFF, 0xF4, 0x01, 0xFC, 0xCB, 0xFE, 0x64, 0x64, 0xFF, 0x5E, 0x00, 0x6C, 0x70,
0xFF, 0x6C, 0x74, 0xFF, 0xFC, 0x90, 0xE7, 0x6C, 0x0C, 0x00, 0xFB, 0x13, 0xFC, 0x0E, 0x6C, 0x70,
0xFF, 0x6C, 0x74, 0xFF, 0xFC, 0xA0, 0x04, 0x70, 0xFF, 0x66, 0x64, 0xFF, 0x3E, 0x00, 0xF5, 0x00,
0x00, 0x00, 0x00, 0x6C, 0x74, 0xFF, 0x2E, 0x60, 0xFF, 0x40, 0x0A, 0x02, 0x00, 0x04, 0x00, 0x3C,
0x2D, 0x60, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x74, 0xFF, 0xFC, 0x90, 0x5E, 0x00, 0x00,
0x04, 0x00, 0x71, 0x5C, 0xFF, 0x3C, 0x6C, 0x5C, 0xFF, 0x71, 0x78, 0xFF, 0x14, 0x00, 0x00, 0x00,
0x98, 0x10, 0x40, 0x00, 0x08, 0x00, 0x20, 0x00, 0x90, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x74, 0xFF, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xFF, 0x06, 0x00,
0x6C, 0xFF, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0xE9, 0xE9, 0xE9,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x9E, 0x9E, 0x9E, 0x9E
};
struct ObjectTable{
int lNull1; // As Long ' 0x00 (00d)
int aExecProj; // As Long ' 0x04 (04d) Pointer to a memory structure
int aProjectInfo2; // As Long ' 0x08 (08d) Pointer to Project Info 2
int Const1; // As Long ' 0x0C
int Null2; // As Long ' 0x10
int lpProjectObject; // As Long ' 0x14
char uuidObj[15]; // As Byte 'converted from 4 flags dzzie (from vb.idc)
short fCompileType; // As Integer ' 0x28 (40d) Internal flag used during compilation
short ObjectCount1; // As Integer ' 0x2A
short iCompiledObjects; // As Integer ' 0x2C (44d) Number of objects compiled.
short iObjectsInUse; // As Integer ' 0x2E (46d) Updated in the IDE to correspond the total number ' but will go up or down when initializing/unloading modules.
int lpObjectArray; // As Long ' 0x30
int fIdeFlag; // As Long ' 0x34
int lpIdeData; // As Long ' 0x38
int lpIdeData2; // As Long ' 0x3C
int aProjectName; // As Long ' 0x40 NTS
int LangID1; // As Long ' 0x44
int LangID2; // As Long ' 0x48
int lpIdeData3; // As Long ' 0x4C
int dwIdentifier; // As Long ' 0x50
};
struct CodeObject{
int aObjectInfo; // As Long ' 0x00 Pointer to the Object Info for this Object.
int Const1; // As Long ' 0x04 Always set to -1 after compiling.
int aPublicBytes; // As Long ' 0x08 Pointer to Public Variable Size integers
int aStaticBytes; // As Long ' 0x0C Pointer to Static Variables Struct
int aModulePublic; // As Long ' 0x10 Pointer to Public Variables in DATA section
int aModuleStatic; // As Long ' 0x14 Pointer to Static Variables in DATA section
int aObjectName; // As Long ' 0x18 Name of the Object.
int ProcCount; // As Long ' 0x1C Number of Methods in Object
int aProcNamesArray;// As Long ' 0x20 If present, pointer to Method names array.
int oStaticVars; // As Long ' 0x24 Offset to Static Vars from aModuleStatic
int ObjectType; // As Long ' 0x28 Flags defining the Object Type.
int Null3; // As Long ' 0x2C Not valid after compilation.
};
struct ObjectInfo{
short wRefCount; // 0 As Integer ' Always 1 after compilation.
short ObjectIndex; // 2 As Integer '
int aObjectTable; // 4 As Long ' Pointer to the Object Table
int lpIdeData; // 8 Long ' Zero after compilation. Used in IDE only.
int lpPrivateObject; // 0xC As Long ' Pointer to Private Object Descriptor.
int dwReserved; // 0x10 As Long
int Null2; // 0x14 As Long
int aObject; // 0x18 As Long ' points to the parent tObject
int lpProjectData; // 0x1c As Long ' 0x1C [can someone verify this?]
short NumberOfProcs; // 0x20 As Integer
short wMethodCount2; // 0x22 As Integer ' Zeroed out after compilation. IDE only.
int lpMethods; // 0x24 As Long ' Pointer to Array of Methods.
short iConstantsCount; // 0x28 As Integer ' Number of Constants
short iMaxConstants; // 0x2A As Integer ' Maximum Constants to allocate.
int lpIdeData2; // 0x2C As Long
int lpIdeData3; // 0x30 As Long
int lpConstantPool; // 0x34 As Long 'can be immediatly followed by OptionalObjectInfo
};
//Declare Function callback Lib "dummy" (ByRef b As Byte) As Long
int __stdcall callback(char* cstr)
{
printf("in callback cstr = %s\n", cstr);
cstr[0] = 0x41; //to show we can modify values
return 21;
}
//Declare Function progress Lib "dummy" (ByVal b As Byte) As Long
int __stdcall progress(unsigned char b)
{
printf("in progress value = %x\n", b);
return b + 2;
}
void main(void){
int rv = 0;
void* constPool[20] = {0};
int lpProjObj[10] = {0};
ObjectTable objtable = {0};
CodeObject codeObj = {0};
ObjectInfo objInfo = {0};
typedef IUnknown* (__stdcall *CreateIExprSrvObj)(int,int,int);
HMODULE h = (HMODULE)LoadLibrary("msvbvm60.dll");
int lpProcCallEngine = (int)GetProcAddress(h,"ProcCallEngine");
CreateIExprSrvObj IExprSrvObj = (CreateIExprSrvObj)GetProcAddress(h,"CreateIExprSrvObj");
//printf("ProcCallEngine = %x, CreateIExprSrvObj=%x\n", lpProcCallEngine,IExprSrvObj);
IUnknown *iunk = IExprSrvObj(0,4,0); //initilize runtime
int mainLastOffset = (int)&pcode + (0x90); //last offset - funcstart
(*(int*)mainLastOffset) = (int)&objInfo; //patch lastOffset of pcode to point to our dynamic ObjInfo Struct
objInfo.aObject = (int)&codeObj;
objInfo.lpConstantPool = (int)&constPool;
objInfo.aObjectTable = (int)&objtable;
objtable.lpProjectObject = (int)&lpProjObj; //ENGINE:66104EAB [ebp-2Ch] = ObjTable.lpProjectObject[0x0C]; (heap memory) unknown
constPool[0] = &progress;
constPool[1] = SysAllocStringByteLen("\x21\x3D\x3C\x26\x75\x3C\x26\x75\x38\x2C\x75\x26\x21\x27\x3C\x3B\x32\x75\x55\x55", 19);
constPool[2] = &callback;
printf("Launching pcode\n");
_asm{
//int 3
push 0x55 ;//Function test(ByVal xorKey As Long) As Long this is xorkey arg
mov edx, mainLastOffset
mov ecx, lpProcCallEngine
call ecx
mov rv, eax ;//return value from our vb function
}
if(iunk!=NULL) iunk->Release(); //doesnt really matter...
printf("retval = %x\n", rv); //sub main can not return a value, but we can use any prototype for other funcs..no need to use only main.
printf("Press any key to exit...");
getch();
}

View File

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psc", "psc.vcproj", "{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.ActiveCfg = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.Build.0 = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.ActiveCfg = Release|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,176 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="psc"
ProjectGUID="{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
RootNamespace="psc"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="test.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath=".\main.cpp"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -0,0 +1 @@
RC4 benchmarking apps in c/pcode and straight C.

View File

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "b_rc4", "c_rc4.vcproj", "{3593918A-6943-4A87-B0EC-7D351FFEB2DA}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3593918A-6943-4A87-B0EC-7D351FFEB2DA}.Debug|Win32.ActiveCfg = Debug|Win32
{3593918A-6943-4A87-B0EC-7D351FFEB2DA}.Debug|Win32.Build.0 = Debug|Win32
{3593918A-6943-4A87-B0EC-7D351FFEB2DA}.Release|Win32.ActiveCfg = Release|Win32
{3593918A-6943-4A87-B0EC-7D351FFEB2DA}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,177 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="b_rc4"
ProjectGUID="{3593918A-6943-4A87-B0EC-7D351FFEB2DA}"
RootNamespace="b_rc4"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="./rc4.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="./rc4.exe"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath=".\main.cpp"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -0,0 +1,118 @@
/*
robin verton, dec 2015
implementation of the RC4 algo
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#define N 256 // 2^8
void swap(unsigned char *a, unsigned char *b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
int KSA(char *key, unsigned char *S) {
int len = strlen(key);
int j = 0;
for(int i = 0; i < N; i++)
S[i] = i;
for(int i = 0; i < N; i++) {
j = (j + S[i] + key[i % len]) % N;
swap(&S[i], &S[j]);
}
return 0;
}
int PRGA(unsigned char *S, char *plaintext, unsigned char *ciphertext) {
int i = 0;
int j = 0;
for(size_t n = 0, len = strlen(plaintext); n < len; n++) {
i = (i + 1) % N;
j = (j + S[i]) % N;
swap(&S[i], &S[j]);
int rnd = S[(S[i] + S[j]) % N];
ciphertext[n] = rnd ^ plaintext[n];
}
return 0;
}
int RC4(char *key, char *plaintext, unsigned char *ciphertext) {
unsigned char S[N];
KSA(key, S);
PRGA(S, plaintext, ciphertext);
return 0;
}
bool FileExists(LPCTSTR szPath)
{
DWORD dwAttrib = GetFileAttributes(szPath);
bool rv = (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) ? true : false;
return rv;
}
int file_length(FILE *f)
{
int pos;
int end;
pos = ftell (f);
fseek (f, 0, SEEK_END);
end = ftell (f);
fseek (f, pos, SEEK_SET);
return end;
}
int main(int argc, char *argv[]) {
FILE *fp;
char* dat = "./../lorem_ipsum.bin";
dat = "./../1mb_lorem_ipsum.bin";
if(!FileExists(dat)){
printf("%s not found\nPress any key to exit...", dat);
getch();
exit(0);
}
fp = fopen(dat, "rb");
if(fp==0){
printf("%s not found\nPress any key to exit...", dat);
getch();
exit(0);
}
int size = file_length(fp);
unsigned char* data = (unsigned char*)malloc(size);
fread(data , 1, size, fp);
fclose(fp);
unsigned int startTime = GetTickCount();
RC4("secret", (char*)data, data);
unsigned int elapsed = GetTickCount() - startTime;
printf("We ran C rc4 on 1mb of data: elapsedTime: %d milliSeconds\n", elapsed);
printf("Press any key to exit...");
getch();
return 0;
}

View File

@ -0,0 +1,272 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Faucibus vitae aliquet nec ullamcorper sit amet. Cursus in hac habitasse platea dictumst quisque. Consectetur adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Adipiscing enim eu turpis egestas pretium aenean pharetra. Nec feugiat nisl pretium fusce id velit ut. Libero justo laoreet sit amet cursus sit amet. Faucibus interdum posuere lorem ipsum. Sodales neque sodales ut etiam sit amet nisl. Nullam vehicula ipsum a arcu cursus vitae congue mauris. Donec enim diam vulputate ut pharetra. Egestas fringilla phasellus faucibus scelerisque eleifend donec. A pellentesque sit amet porttitor eget dolor morbi non arcu. Orci eu lobortis elementum nibh tellus molestie nunc. Eu volutpat odio facilisis mauris sit amet massa.
Nunc vel risus commodo viverra maecenas accumsan lacus. Adipiscing tristique risus nec feugiat. Eu consequat ac felis donec et odio pellentesque. Leo vel fringilla est ullamcorper eget nulla facilisi etiam. Laoreet non curabitur gravida arcu ac tortor. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus et. Tristique magna sit amet purus gravida quis. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Dictum fusce ut placerat orci nulla pellentesque dignissim enim sit. Nec ullamcorper sit amet risus nullam eget felis eget. Cursus vitae congue mauris rhoncus aenean vel elit. Dolor purus non enim praesent elementum facilisis leo vel fringilla. Enim ut sem viverra aliquet eget sit amet tellus cras. Amet nisl purus in mollis nunc. Auctor eu augue ut lectus arcu bibendum at varius vel. At in tellus integer feugiat scelerisque. Pharetra diam sit amet nisl suscipit.
Convallis tellus id interdum velit laoreet id donec ultrices. Sagittis nisl rhoncus mattis rhoncus. Mi eget mauris pharetra et ultrices neque ornare aenean euismod. Duis at consectetur lorem donec massa sapien. Mi eget mauris pharetra et ultrices. Diam quam nulla porttitor massa id. A erat nam at lectus urna. In egestas erat imperdiet sed euismod nisi porta lorem. Tellus rutrum tellus pellentesque eu. Quis auctor elit sed vulputate mi sit amet mauris. At lectus urna duis convallis. Nulla facilisi nullam vehicula ipsum a arcu. Aliquam eleifend mi in nulla posuere sollicitudin. Massa enim nec dui nunc mattis enim ut tellus.
Turpis massa tincidunt dui ut. Ipsum consequat nisl vel pretium. Lacus viverra vitae congue eu consequat. Viverra vitae congue eu consequat ac felis donec et odio. Quam vulputate dignissim suspendisse in. Libero volutpat sed cras ornare arcu dui vivamus. Consectetur libero id faucibus nisl tincidunt eget nullam. Nisi scelerisque eu ultrices vitae auctor eu augue ut. Augue neque gravida in fermentum et sollicitudin ac orci phasellus. Id aliquet lectus proin nibh. Tincidunt nunc pulvinar sapien et ligula ullamcorper. Magna eget est lorem ipsum. Velit aliquet sagittis id consectetur purus. Tellus orci ac auctor augue mauris augue neque gravida.
Non enim praesent elementum facilisis. In cursus turpis massa tincidunt dui ut ornare. Libero justo laoreet sit amet cursus sit amet dictum. Quam pellentesque nec nam aliquam sem et. Diam donec adipiscing tristique risus nec feugiat in. Proin libero nunc consequat interdum. Nunc eget lorem dolor sed viverra ipsum nunc aliquet bibendum. Nunc sed augue lacus viverra vitae congue eu consequat ac. Consequat id porta nibh venenatis cras. Nec sagittis aliquam malesuada bibendum arcu vitae elementum. Quis auctor elit sed vulputate mi sit amet mauris. Ipsum nunc aliquet bibendum enim. Massa eget egestas purus viverra accumsan. Eget arcu dictum varius duis. Non quam lacus suspendisse faucibus. Non tellus orci ac auctor augue mauris augue neque gravida.
Magna ac placerat vestibulum lectus mauris ultrices. Praesent semper feugiat nibh sed pulvinar proin gravida hendrerit. Donec ultrices tincidunt arcu non sodales neque sodales. Sit amet facilisis magna etiam tempor orci eu. Pellentesque dignissim enim sit amet venenatis urna cursus eget. Tincidunt lobortis feugiat vivamus at augue. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Ipsum suspendisse ultrices gravida dictum fusce ut placerat. Facilisi cras fermentum odio eu feugiat pretium. In mollis nunc sed id semper risus in hendrerit gravida. Semper quis lectus nulla at volutpat. Sit amet consectetur adipiscing elit ut aliquam. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor elit. Ut placerat orci nulla pellentesque dignissim enim sit amet venenatis. Morbi enim nunc faucibus a. In aliquam sem fringilla ut morbi tincidunt augue. Dui nunc mattis enim ut tellus elementum sagittis vitae et. Non odio euismod lacinia at quis risus.
Nunc sed id semper risus. Nibh tellus molestie nunc non blandit massa. Non odio euismod lacinia at. Porttitor eget dolor morbi non arcu risus quis varius. Arcu dictum varius duis at. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit amet. Cras tincidunt lobortis feugiat vivamus at augue eget arcu dictum. Pellentesque diam volutpat commodo sed egestas egestas fringilla. Risus quis varius quam quisque id diam vel. Facilisis volutpat est velit egestas dui id ornare arcu. Sagittis orci a scelerisque purus semper. Ultricies leo integer malesuada nunc vel risus. Enim neque volutpat ac tincidunt vitae semper quis lectus nulla. At augue eget arcu dictum varius duis at. Pellentesque adipiscing commodo elit at. Fusce id velit ut tortor pretium. Amet consectetur adipiscing elit duis tristique sollicitudin nibh. Gravida arcu ac tortor dignissim convallis. Vitae sapien pellentesque habitant morbi tristique senectus et netus et. Condimentum lacinia quis vel eros donec ac odio tempor.
Eu scelerisque felis imperdiet proin. Dictum sit amet justo donec enim diam vulputate ut. Pretium fusce id velit ut tortor pretium. Lectus quam id leo in vitae turpis massa sed elementum. Turpis in eu mi bibendum neque. Est lorem ipsum dolor sit. Lectus mauris ultrices eros in. Turpis massa sed elementum tempus egestas sed sed risus. Lectus quam id leo in vitae. Adipiscing diam donec adipiscing tristique risus nec. Adipiscing enim eu turpis egestas pretium. Amet risus nullam eget felis eget nunc lobortis mattis aliquam. Sed viverra ipsum nunc aliquet bibendum enim.
Semper auctor neque vitae tempus quam pellentesque nec. Cursus euismod quis viverra nibh cras pulvinar mattis nunc sed. Morbi tincidunt ornare massa eget egestas purus. Tortor consequat id porta nibh venenatis cras. Facilisi cras fermentum odio eu feugiat pretium nibh. Scelerisque felis imperdiet proin fermentum leo vel orci porta. Lobortis feugiat vivamus at augue eget arcu dictum. Tincidunt id aliquet risus feugiat in ante metus dictum at. Feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Aenean euismod elementum nisi quis. Lacus vestibulum sed arcu non odio euismod. Aliquam vestibulum morbi blandit cursus risus at ultrices mi tempus.
Amet nisl suscipit adipiscing bibendum est ultricies. Posuere lorem ipsum dolor sit amet consectetur adipiscing elit duis. Bibendum est ultricies integer quis auctor elit sed vulputate. Condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Venenatis a condimentum vitae sapien. Leo integer malesuada nunc vel risus commodo viverra maecenas accumsan. Vestibulum morbi blandit cursus risus at ultrices. Enim blandit volutpat maecenas volutpat blandit. Sodales ut eu sem integer vitae justo eget magna fermentum. At elementum eu facilisis sed odio morbi quis commodo.
Turpis nunc eget lorem dolor sed viverra ipsum nunc. In est ante in nibh mauris cursus mattis molestie a. Ac placerat vestibulum lectus mauris ultrices eros. Vitae auctor eu augue ut lectus arcu bibendum at. Nulla porttitor massa id neque. Nam libero justo laoreet sit amet cursus sit amet. At consectetur lorem donec massa. Ullamcorper a lacus vestibulum sed. Nunc sed velit dignissim sodales ut eu. Commodo ullamcorper a lacus vestibulum. Aliquet porttitor lacus luctus accumsan. Urna duis convallis convallis tellus id interdum.
Id venenatis a condimentum vitae. Nunc mi ipsum faucibus vitae. A scelerisque purus semper eget duis at tellus at urna. Elementum nibh tellus molestie nunc non. Etiam non quam lacus suspendisse faucibus interdum. Eu nisl nunc mi ipsum faucibus. Scelerisque eu ultrices vitae auctor. Nunc sed augue lacus viverra vitae congue. Non enim praesent elementum facilisis leo vel fringilla est. Cras semper auctor neque vitae tempus quam. Augue lacus viverra vitae congue eu consequat ac felis donec. Tortor dignissim convallis aenean et tortor at risus. Integer vitae justo eget magna fermentum iaculis eu non. Lobortis feugiat vivamus at augue eget arcu dictum varius duis. Mauris sit amet massa vitae. Luctus venenatis lectus magna fringilla urna porttitor rhoncus dolor.
Sit amet massa vitae tortor condimentum lacinia. Nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Velit sed ullamcorper morbi tincidunt ornare massa. Non pulvinar neque laoreet suspendisse interdum consectetur libero id. Varius sit amet mattis vulputate. Lorem ipsum dolor sit amet consectetur adipiscing elit pellentesque. Ullamcorper malesuada proin libero nunc consequat. Enim diam vulputate ut pharetra. Tortor dignissim convallis aenean et tortor at risus viverra. Ipsum faucibus vitae aliquet nec. Dolor sed viverra ipsum nunc aliquet bibendum enim. Ultrices dui sapien eget mi proin. Morbi tristique senectus et netus et malesuada fames. In eu mi bibendum neque. Vestibulum lorem sed risus ultricies. Tellus pellentesque eu tincidunt tortor aliquam. Nam libero justo laoreet sit amet cursus. Donec enim diam vulputate ut pharetra sit amet.
Morbi non arcu risus quis varius quam. Enim ut sem viverra aliquet eget sit amet. Nam at lectus urna duis convallis convallis tellus id interdum. Eget mauris pharetra et ultrices neque. Felis eget nunc lobortis mattis. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien et. Nulla malesuada pellentesque elit eget gravida cum. Non consectetur a erat nam at. Ultricies mi eget mauris pharetra et ultrices neque ornare. Aliquam etiam erat velit scelerisque in. Elementum sagittis vitae et leo duis ut diam. Urna cursus eget nunc scelerisque viverra mauris in aliquam. Elementum pulvinar etiam non quam lacus suspendisse. Blandit massa enim nec dui nunc mattis enim. Tempor nec feugiat nisl pretium fusce id velit ut.
Vivamus arcu felis bibendum ut tristique et egestas quis ipsum. Euismod lacinia at quis risus sed. Nec feugiat nisl pretium fusce id velit ut tortor pretium. Sit amet consectetur adipiscing elit ut aliquam purus sit amet. Pellentesque adipiscing commodo elit at imperdiet dui accumsan sit. Porttitor lacus luctus accumsan tortor posuere ac ut consequat. Semper feugiat nibh sed pulvinar proin. Et tortor at risus viverra adipiscing at in tellus integer. Scelerisque eleifend donec pretium vulputate. Eu nisl nunc mi ipsum faucibus vitae.
Varius morbi enim nunc faucibus a pellentesque sit. Lorem ipsum dolor sit amet consectetur adipiscing elit pellentesque. Pellentesque elit eget gravida cum. Proin sed libero enim sed faucibus turpis. In cursus turpis massa tincidunt dui. Id leo in vitae turpis massa sed. Duis ut diam quam nulla porttitor. Nibh sit amet commodo nulla facilisi nullam vehicula ipsum a. Nunc id cursus metus aliquam eleifend mi in nulla posuere. A scelerisque purus semper eget.
Porttitor leo a diam sollicitudin tempor. A cras semper auctor neque. Suspendisse in est ante in nibh mauris cursus. Tristique nulla aliquet enim tortor. Accumsan sit amet nulla facilisi morbi tempus iaculis urna. Arcu vitae elementum curabitur vitae nunc sed velit dignissim. Pellentesque habitant morbi tristique senectus et netus et. Nec feugiat nisl pretium fusce. Eget duis at tellus at urna condimentum mattis pellentesque id. Egestas tellus rutrum tellus pellentesque eu tincidunt tortor aliquam nulla. Viverra justo nec ultrices dui. Eu feugiat pretium nibh ipsum. Laoreet suspendisse interdum consectetur libero. Enim diam vulputate ut pharetra sit amet aliquam. Consectetur purus ut faucibus pulvinar. Cras tincidunt lobortis feugiat vivamus at augue eget arcu. Euismod in pellentesque massa placerat duis ultricies. Elementum integer enim neque volutpat ac tincidunt vitae. Ornare arcu dui vivamus arcu felis. Cursus euismod quis viverra nibh cras pulvinar mattis nunc sed.
Enim nulla aliquet porttitor lacus luctus accumsan. Elit duis tristique sollicitudin nibh sit. Non pulvinar neque laoreet suspendisse interdum consectetur. Duis ultricies lacus sed turpis tincidunt id. Ultrices in iaculis nunc sed augue lacus. Pulvinar mattis nunc sed blandit libero volutpat sed. Massa enim nec dui nunc mattis enim. Eget nunc scelerisque viverra mauris in aliquam sem fringilla ut. Amet est placerat in egestas erat imperdiet. Semper risus in hendrerit gravida rutrum quisque non tellus. Tincidunt id aliquet risus feugiat. Iaculis nunc sed augue lacus viverra vitae congue eu. Nunc sed blandit libero volutpat sed. Nulla at volutpat diam ut venenatis. Eget egestas purus viverra accumsan in nisl nisi scelerisque eu. Pretium lectus quam id leo in vitae. Nec sagittis aliquam malesuada bibendum arcu vitae elementum.
Proin fermentum leo vel orci porta non pulvinar neque laoreet. Sagittis eu volutpat odio facilisis mauris sit amet. Quam elementum pulvinar etiam non quam lacus. Tortor at risus viverra adipiscing at in tellus integer feugiat. Nec feugiat in fermentum posuere urna nec. Eu ultrices vitae auctor eu augue ut lectus. Sapien et ligula ullamcorper malesuada proin libero nunc consequat. Enim sed faucibus turpis in eu. Nisi lacus sed viverra tellus in hac habitasse platea dictumst. Pharetra et ultrices neque ornare aenean euismod elementum nisi. Varius quam quisque id diam vel quam elementum pulvinar. Pretium viverra suspendisse potenti nullam ac tortor. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt. Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor.
Aliquam sem fringilla ut morbi tincidunt augue interdum velit. Arcu cursus euismod quis viverra nibh. Quisque non tellus orci ac auctor. Aliquam nulla facilisi cras fermentum odio eu. Nunc non blandit massa enim. Semper risus in hendrerit gravida rutrum quisque. Eu turpis egestas pretium aenean. Varius quam quisque id diam vel quam elementum. Pretium nibh ipsum consequat nisl vel pretium lectus. Vel pharetra vel turpis nunc eget lorem. Bibendum at varius vel pharetra vel turpis. Et magnis dis parturient montes nascetur ridiculus mus mauris. Mi eget mauris pharetra et ultrices neque ornare aenean euismod. Non tellus orci ac auctor augue mauris augue neque gravida. Nullam eget felis eget nunc lobortis mattis aliquam faucibus. Tincidunt eget nullam non nisi est sit amet facilisis magna. Eget mauris pharetra et ultrices neque ornare aenean euismod elementum. Placerat orci nulla pellentesque dignissim enim sit. Sit amet cursus sit amet dictum sit. Quis vel eros donec ac odio tempor orci.
Feugiat nibh sed pulvinar proin gravida hendrerit lectus a. Egestas pretium aenean pharetra magna ac placerat. Et sollicitudin ac orci phasellus egestas. Feugiat nisl pretium fusce id velit. Arcu cursus euismod quis viverra nibh cras pulvinar mattis nunc. Tempor orci eu lobortis elementum. Eget arcu dictum varius duis. Habitant morbi tristique senectus et netus et malesuada fames. Viverra aliquet eget sit amet tellus cras adipiscing enim eu. Tellus mauris a diam maecenas sed enim ut. Nisi est sit amet facilisis magna etiam. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant. Gravida arcu ac tortor dignissim convallis aenean et.
Orci sagittis eu volutpat odio facilisis mauris sit amet. Faucibus turpis in eu mi bibendum neque egestas congue. Mus mauris vitae ultricies leo integer malesuada nunc vel. Mi ipsum faucibus vitae aliquet nec ullamcorper sit. Orci dapibus ultrices in iaculis nunc. Sit amet facilisis magna etiam tempor orci eu lobortis. Dignissim sodales ut eu sem. Rutrum quisque non tellus orci ac auctor augue mauris. Vulputate mi sit amet mauris commodo quis. Integer quis auctor elit sed vulputate mi sit amet. Magna sit amet purus gravida quis blandit turpis cursus. Penatibus et magnis dis parturient montes. At erat pellentesque adipiscing commodo. Suspendisse potenti nullam ac tortor vitae purus. Sit amet aliquam id diam. In arcu cursus euismod quis viverra. Urna duis convallis convallis tellus id interdum velit laoreet id. Arcu non odio euismod lacinia. Vitae congue eu consequat ac. In vitae turpis massa sed elementum tempus egestas sed sed.
Etiam sit amet nisl purus in mollis. Pellentesque diam volutpat commodo sed. Eget nunc lobortis mattis aliquam faucibus purus in massa tempor. Vel turpis nunc eget lorem dolor sed viverra ipsum nunc. Non consectetur a erat nam at. Mauris augue neque gravida in. Neque ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Tellus molestie nunc non blandit massa enim nec. Consequat mauris nunc congue nisi vitae. Ante metus dictum at tempor commodo ullamcorper. Orci dapibus ultrices in iaculis nunc sed augue. Urna cursus eget nunc scelerisque viverra mauris in. Ipsum suspendisse ultrices gravida dictum. Ac tortor dignissim convallis aenean. Amet consectetur adipiscing elit duis tristique sollicitudin. Eu scelerisque felis imperdiet proin fermentum leo vel orci. Felis eget nunc lobortis mattis aliquam. Viverra nam libero justo laoreet sit amet. Eget aliquet nibh praesent tristique magna sit.
Eget mauris pharetra et ultrices neque. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus pellentesque. Maecenas ultricies mi eget mauris pharetra et ultrices neque ornare. Purus non enim praesent elementum facilisis leo vel. Nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit amet. A erat nam at lectus urna duis. Massa id neque aliquam vestibulum morbi blandit cursus risus at. Vitae congue mauris rhoncus aenean vel elit. Arcu non sodales neque sodales ut etiam sit amet. Est lorem ipsum dolor sit amet consectetur. Vel turpis nunc eget lorem dolor sed viverra ipsum nunc.
Dictum at tempor commodo ullamcorper a lacus vestibulum sed. Ut tortor pretium viverra suspendisse potenti nullam ac tortor. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Nec ullamcorper sit amet risus nullam eget felis eget. Et malesuada fames ac turpis egestas. Nunc sed id semper risus in hendrerit. Amet volutpat consequat mauris nunc congue. Augue ut lectus arcu bibendum at. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum. Urna nunc id cursus metus aliquam eleifend. Nam libero justo laoreet sit amet cursus sit amet.
Vulputate eu scelerisque felis imperdiet proin fermentum. Sit amet mattis vulputate enim. Est ante in nibh mauris. Nulla malesuada pellentesque elit eget gravida cum sociis. Duis ut diam quam nulla porttitor massa id neque aliquam. Amet massa vitae tortor condimentum lacinia quis vel eros. Dictum non consectetur a erat nam at. Aenean pharetra magna ac placerat vestibulum lectus mauris. Bibendum est ultricies integer quis auctor elit sed vulputate. Nibh tellus molestie nunc non blandit massa enim nec dui. Vitae aliquet nec ullamcorper sit.
Rutrum quisque non tellus orci ac auctor augue mauris augue. Aliquam nulla facilisi cras fermentum odio eu feugiat pretium. Et netus et malesuada fames. Nec ultrices dui sapien eget mi. Odio pellentesque diam volutpat commodo sed egestas egestas fringilla phasellus. Cras pulvinar mattis nunc sed blandit libero volutpat sed. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc. Tempor nec feugiat nisl pretium fusce id velit ut. Viverra vitae congue eu consequat ac felis donec et odio. Massa id neque aliquam vestibulum morbi blandit cursus. Mattis pellentesque id nibh tortor id. Sit amet facilisis magna etiam tempor. Purus viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Neque convallis a cras semper auctor neque. Orci sagittis eu volutpat odio facilisis mauris.
Massa sapien faucibus et molestie ac feugiat. Ornare suspendisse sed nisi lacus sed viverra tellus in. Sagittis eu volutpat odio facilisis mauris sit amet. Sed risus pretium quam vulputate dignissim suspendisse in est. Nulla at volutpat diam ut venenatis tellus in metus. Aliquet bibendum enim facilisis gravida neque convallis a. Velit egestas dui id ornare arcu. Pulvinar neque laoreet suspendisse interdum consectetur libero id faucibus nisl. Nunc mi ipsum faucibus vitae aliquet. Lacus sed turpis tincidunt id aliquet risus feugiat. Non diam phasellus vestibulum lorem sed risus. Nec nam aliquam sem et tortor consequat. Enim nunc faucibus a pellentesque sit amet porttitor eget dolor. Felis eget nunc lobortis mattis aliquam faucibus purus in massa. Vel pharetra vel turpis nunc eget lorem dolor sed viverra. Ut venenatis tellus in metus vulputate eu.
Massa enim nec dui nunc mattis. Tempus urna et pharetra pharetra massa. Egestas quis ipsum suspendisse ultrices gravida dictum. Aliquam malesuada bibendum arcu vitae elementum curabitur. Euismod in pellentesque massa placerat duis ultricies lacus sed. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Suspendisse interdum consectetur libero id. Nec ullamcorper sit amet risus nullam eget felis. Non enim praesent elementum facilisis. Tempus quam pellentesque nec nam aliquam sem et tortor.
Semper quis lectus nulla at. Volutpat consequat mauris nunc congue nisi vitae suscipit tellus mauris. Duis convallis convallis tellus id interdum velit laoreet. Morbi tincidunt ornare massa eget egestas purus viverra. At consectetur lorem donec massa sapien faucibus et. Massa tincidunt dui ut ornare lectus. Etiam non quam lacus suspendisse faucibus interdum posuere lorem. Etiam erat velit scelerisque in dictum. Viverra aliquet eget sit amet tellus. Pretium quam vulputate dignissim suspendisse in est ante in. Tellus id interdum velit laoreet id. Nulla pharetra diam sit amet. In ante metus dictum at tempor commodo ullamcorper a. Convallis a cras semper auctor neque vitae tempus quam pellentesque. A diam sollicitudin tempor id eu nisl nunc mi ipsum. Mattis molestie a iaculis at erat pellentesque. Vitae nunc sed velit dignissim sodales ut.
Sollicitudin tempor id eu nisl. Vel elit scelerisque mauris pellentesque pulvinar pellentesque. Mattis molestie a iaculis at erat pellentesque. Iaculis nunc sed augue lacus viverra. Magna ac placerat vestibulum lectus. Pellentesque adipiscing commodo elit at imperdiet dui. Nulla pellentesque dignissim enim sit. Semper quis lectus nulla at volutpat diam. Vitae elementum curabitur vitae nunc sed velit. Tortor at risus viverra adipiscing at in tellus integer feugiat. Turpis tincidunt id aliquet risus feugiat in ante metus dictum.
Tempor orci eu lobortis elementum. Et odio pellentesque diam volutpat. Consequat nisl vel pretium lectus. Pellentesque adipiscing commodo elit at imperdiet. Lobortis elementum nibh tellus molestie nunc non blandit. Sit amet nisl suscipit adipiscing bibendum est. Eleifend quam adipiscing vitae proin sagittis nisl rhoncus. Purus in mollis nunc sed. Condimentum vitae sapien pellentesque habitant. Facilisis volutpat est velit egestas. Ornare arcu dui vivamus arcu felis bibendum ut tristique et. Sit amet est placerat in egestas. Arcu cursus euismod quis viverra nibh cras pulvinar mattis nunc. Neque aliquam vestibulum morbi blandit cursus risus.
Nunc pulvinar sapien et ligula ullamcorper malesuada proin. Venenatis a condimentum vitae sapien pellentesque habitant. Diam vulputate ut pharetra sit amet aliquam. Euismod nisi porta lorem mollis aliquam ut porttitor. Amet tellus cras adipiscing enim. Felis bibendum ut tristique et. Eget arcu dictum varius duis. Viverra mauris in aliquam sem. Ut lectus arcu bibendum at varius. Tempor orci eu lobortis elementum nibh. Aliquet nibh praesent tristique magna sit amet purus. Nunc vel risus commodo viverra maecenas accumsan. Consectetur purus ut faucibus pulvinar elementum integer enim. Nulla facilisi etiam dignissim diam quis enim. Nec dui nunc mattis enim ut tellus elementum sagittis vitae. Maecenas pharetra convallis posuere morbi leo urna molestie. Nisl condimentum id venenatis a. Adipiscing elit pellentesque habitant morbi tristique.
Odio pellentesque diam volutpat commodo sed egestas egestas fringilla phasellus. Amet nisl suscipit adipiscing bibendum est. Ut tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Auctor urna nunc id cursus metus aliquam. Curabitur gravida arcu ac tortor dignissim. At varius vel pharetra vel turpis nunc eget lorem dolor. Faucibus vitae aliquet nec ullamcorper sit amet. Amet justo donec enim diam vulputate ut pharetra sit amet. Quis blandit turpis cursus in hac. In ornare quam viverra orci sagittis eu volutpat odio facilisis. Elementum curabitur vitae nunc sed velit. Mattis nunc sed blandit libero volutpat sed.
Cras adipiscing enim eu turpis egestas. Pellentesque pulvinar pellentesque habitant morbi tristique. Eleifend donec pretium vulputate sapien nec. Tortor id aliquet lectus proin nibh nisl condimentum id. Est pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien. Orci nulla pellentesque dignissim enim sit amet venenatis. Etiam sit amet nisl purus in. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque. Maecenas pharetra convallis posuere morbi leo urna. Nisi lacus sed viverra tellus in hac.
Non blandit massa enim nec dui nunc mattis enim. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Ultrices in iaculis nunc sed. Integer enim neque volutpat ac tincidunt. Vel pharetra vel turpis nunc eget lorem dolor sed viverra. Volutpat est velit egestas dui. Aliquam sem fringilla ut morbi tincidunt. Sed cras ornare arcu dui vivamus arcu felis bibendum. Dolor morbi non arcu risus quis varius quam quisque. Cras tincidunt lobortis feugiat vivamus at augue. Purus sit amet luctus venenatis lectus magna fringilla urna porttitor.
Suspendisse faucibus interdum posuere lorem ipsum dolor sit. Diam in arcu cursus euismod quis viverra. Est lorem ipsum dolor sit amet consectetur. Interdum varius sit amet mattis vulputate. Arcu bibendum at varius vel pharetra. Nisl nisi scelerisque eu ultrices. Sed risus ultricies tristique nulla aliquet enim. Sed enim ut sem viverra. Fringilla ut morbi tincidunt augue interdum velit euismod in. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Cras ornare arcu dui vivamus arcu felis bibendum. Elementum integer enim neque volutpat ac tincidunt vitae semper quis. Diam volutpat commodo sed egestas egestas fringilla phasellus faucibus scelerisque. Vulputate enim nulla aliquet porttitor lacus luctus accumsan. Purus gravida quis blandit turpis cursus in hac. Quis enim lobortis scelerisque fermentum dui faucibus in ornare quam. Sagittis vitae et leo duis ut diam quam nulla. Ultricies tristique nulla aliquet enim.
Mauris pharetra et ultrices neque ornare. Netus et malesuada fames ac turpis egestas maecenas pharetra. Quis eleifend quam adipiscing vitae proin sagittis nisl rhoncus mattis. Neque laoreet suspendisse interdum consectetur libero. Eget est lorem ipsum dolor sit amet consectetur adipiscing elit. Consectetur adipiscing elit pellentesque habitant. Diam sit amet nisl suscipit adipiscing bibendum est. Gravida cum sociis natoque penatibus et magnis dis parturient. Ullamcorper malesuada proin libero nunc consequat. Lacus viverra vitae congue eu consequat ac. Laoreet sit amet cursus sit.
Arcu dui vivamus arcu felis bibendum. Ultrices sagittis orci a scelerisque purus semper eget. Cras adipiscing enim eu turpis egestas pretium aenean pharetra magna. Habitant morbi tristique senectus et netus et. Posuere sollicitudin aliquam ultrices sagittis orci. Porta nibh venenatis cras sed. Consequat id porta nibh venenatis cras sed. Ultricies tristique nulla aliquet enim tortor. Adipiscing enim eu turpis egestas pretium aenean. Nulla facilisi cras fermentum odio. Lacus sed turpis tincidunt id aliquet risus feugiat. Gravida in fermentum et sollicitudin. Cras semper auctor neque vitae tempus quam pellentesque nec. Senectus et netus et malesuada fames ac turpis egestas maecenas. Proin fermentum leo vel orci porta non. Faucibus et molestie ac feugiat. Facilisis sed odio morbi quis commodo. Ut enim blandit volutpat maecenas volutpat.
Donec ultrices tincidunt arcu non sodales neque sodales. Massa massa ultricies mi quis hendrerit dolor magna eget est. Varius quam quisque id diam vel quam. Tincidunt lobortis feugiat vivamus at augue. Diam vulputate ut pharetra sit amet aliquam id diam maecenas. Dolor sit amet consectetur adipiscing. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Tellus in hac habitasse platea dictumst vestibulum rhoncus. Dictum varius duis at consectetur lorem donec massa sapien. Donec ac odio tempor orci. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo nulla. Sed euismod nisi porta lorem mollis. Sed euismod nisi porta lorem mollis. Facilisis volutpat est velit egestas dui id ornare arcu odio. Turpis egestas pretium aenean pharetra magna ac. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. At tempor commodo ullamcorper a lacus vestibulum sed arcu non.
Ullamcorper morbi tincidunt ornare massa eget egestas purus. Volutpat maecenas volutpat blandit aliquam etiam erat. Egestas pretium aenean pharetra magna ac placerat vestibulum. Elementum sagittis vitae et leo. Id donec ultrices tincidunt arcu non sodales neque sodales. Diam volutpat commodo sed egestas egestas fringilla phasellus faucibus scelerisque. Quam id leo in vitae turpis massa. Nunc aliquet bibendum enim facilisis gravida neque convallis. Purus non enim praesent elementum facilisis leo. Auctor urna nunc id cursus metus aliquam. Posuere lorem ipsum dolor sit amet. Mattis pellentesque id nibh tortor id. Integer vitae justo eget magna fermentum iaculis eu non. Euismod lacinia at quis risus sed vulputate odio. Sit amet nulla facilisi morbi. Posuere urna nec tincidunt praesent semper feugiat.
Ut lectus arcu bibendum at varius vel pharetra. Molestie ac feugiat sed lectus. Amet mattis vulputate enim nulla. Sagittis id consectetur purus ut faucibus pulvinar. Eget duis at tellus at urna condimentum mattis pellentesque. Vel elit scelerisque mauris pellentesque pulvinar. Lectus proin nibh nisl condimentum id venenatis a condimentum. Mi eget mauris pharetra et. Arcu non odio euismod lacinia at. Mus mauris vitae ultricies leo. Etiam dignissim diam quis enim lobortis. Eros donec ac odio tempor orci. Risus sed vulputate odio ut. Ut porttitor leo a diam sollicitudin tempor. Pellentesque habitant morbi tristique senectus.
Sollicitudin tempor id eu nisl nunc mi. Sodales ut eu sem integer vitae justo eget. Fringilla urna porttitor rhoncus dolor purus non enim praesent elementum. Tellus in metus vulputate eu scelerisque felis imperdiet. Tincidunt ornare massa eget egestas purus viverra. Sit amet aliquam id diam. Convallis a cras semper auctor neque vitae tempus quam pellentesque. In fermentum et sollicitudin ac orci phasellus egestas. In metus vulputate eu scelerisque felis imperdiet proin. Eget nunc scelerisque viverra mauris in aliquam sem fringilla ut. Mattis molestie a iaculis at erat pellentesque adipiscing.
Malesuada fames ac turpis egestas maecenas pharetra convallis posuere morbi. Blandit aliquam etiam erat velit scelerisque. Sit amet risus nullam eget felis. Senectus et netus et malesuada fames ac turpis egestas sed. Sem viverra aliquet eget sit amet. Porta nibh venenatis cras sed felis eget velit aliquet sagittis. Cras ornare arcu dui vivamus arcu felis bibendum ut tristique. Congue quisque egestas diam in arcu cursus euismod quis. Praesent semper feugiat nibh sed pulvinar proin. Egestas tellus rutrum tellus pellentesque eu tincidunt tortor aliquam. Nisi lacus sed viverra tellus. Donec ac odio tempor orci dapibus ultrices in iaculis nunc.
Orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt tortor. Pretium nibh ipsum consequat nisl vel pretium lectus. Habitasse platea dictumst quisque sagittis purus sit. Orci a scelerisque purus semper eget. Scelerisque felis imperdiet proin fermentum leo vel orci porta non. Bibendum arcu vitae elementum curabitur vitae nunc sed. Ut faucibus pulvinar elementum integer enim. Diam quam nulla porttitor massa id neque aliquam. Tortor condimentum lacinia quis vel eros donec. In metus vulputate eu scelerisque felis imperdiet proin fermentum leo. Turpis cursus in hac habitasse platea. Montes nascetur ridiculus mus mauris vitae ultricies. Pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Eu tincidunt tortor aliquam nulla. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Gravida arcu ac tortor dignissim. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Morbi tincidunt augue interdum velit euismod in. Malesuada fames ac turpis egestas sed tempus urna et. Sed vulputate mi sit amet mauris commodo quis imperdiet massa.
Sit amet tellus cras adipiscing enim eu turpis. Semper risus in hendrerit gravida. Ultricies mi eget mauris pharetra et ultrices neque ornare. Elementum nibh tellus molestie nunc non. Potenti nullam ac tortor vitae purus faucibus. Non sodales neque sodales ut. Neque laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt. Massa sed elementum tempus egestas sed. Fermentum iaculis eu non diam. Cras semper auctor neque vitae tempus quam pellentesque nec. Sed egestas egestas fringilla phasellus. Ac tincidunt vitae semper quis lectus nulla at. Pellentesque pulvinar pellentesque habitant morbi. Amet consectetur adipiscing elit ut. Non odio euismod lacinia at quis risus. Pellentesque sit amet porttitor eget dolor.
Convallis aenean et tortor at risus viverra. Auctor eu augue ut lectus arcu bibendum at. Pellentesque massa placerat duis ultricies lacus sed turpis tincidunt. Ullamcorper malesuada proin libero nunc consequat. Dignissim cras tincidunt lobortis feugiat. Netus et malesuada fames ac turpis egestas maecenas pharetra convallis. Et sollicitudin ac orci phasellus egestas. Id velit ut tortor pretium viverra suspendisse potenti nullam ac. Orci a scelerisque purus semper eget duis at. Dolor sit amet consectetur adipiscing elit pellentesque. Potenti nullam ac tortor vitae purus.
Faucibus pulvinar elementum integer enim. Tincidunt vitae semper quis lectus nulla at. Gravida neque convallis a cras semper auctor. Est sit amet facilisis magna etiam tempor orci eu. Nunc mattis enim ut tellus elementum sagittis. Quis enim lobortis scelerisque fermentum dui faucibus. Egestas integer eget aliquet nibh praesent tristique magna sit amet. Amet massa vitae tortor condimentum lacinia. Aliquam sem fringilla ut morbi. Molestie nunc non blandit massa enim nec. Eget nunc scelerisque viverra mauris in aliquam. Eu non diam phasellus vestibulum lorem. Commodo odio aenean sed adipiscing diam donec adipiscing tristique. Ornare arcu dui vivamus arcu. Diam sit amet nisl suscipit adipiscing bibendum. Neque egestas congue quisque egestas diam in.
Habitant morbi tristique senectus et netus. Molestie ac feugiat sed lectus vestibulum mattis. Tincidunt augue interdum velit euismod in pellentesque massa. Purus sit amet volutpat consequat mauris nunc. Ultrices mi tempus imperdiet nulla. Orci nulla pellentesque dignissim enim. In hac habitasse platea dictumst quisque sagittis purus sit. Magna fringilla urna porttitor rhoncus dolor purus non enim praesent. Pretium lectus quam id leo in vitae turpis massa. Cursus in hac habitasse platea.
Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Sem et tortor consequat id porta. Vitae turpis massa sed elementum tempus egestas sed sed risus. Viverra nam libero justo laoreet sit amet cursus sit amet. Morbi tincidunt augue interdum velit euismod in pellentesque. Viverra tellus in hac habitasse platea dictumst vestibulum. In massa tempor nec feugiat nisl pretium. Lectus urna duis convallis convallis tellus id. Vitae et leo duis ut diam quam nulla porttitor massa. In fermentum et sollicitudin ac orci phasellus egestas tellus rutrum. Nisl nunc mi ipsum faucibus vitae aliquet nec. Penatibus et magnis dis parturient montes nascetur ridiculus mus mauris. Etiam sit amet nisl purus in mollis.
Suspendisse potenti nullam ac tortor. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Enim lobortis scelerisque fermentum dui faucibus in. Ut sem nulla pharetra diam. Leo vel orci porta non pulvinar neque laoreet. Quisque sagittis purus sit amet volutpat consequat. Consectetur adipiscing elit ut aliquam purus sit amet luctus. Leo duis ut diam quam nulla porttitor massa. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant. Risus pretium quam vulputate dignissim suspendisse in est ante. Ullamcorper morbi tincidunt ornare massa eget egestas. Nullam non nisi est sit amet facilisis magna. Ipsum dolor sit amet consectetur. Pretium vulputate sapien nec sagittis aliquam. A diam maecenas sed enim. Nulla porttitor massa id neque. Pellentesque habitant morbi tristique senectus et. Odio aenean sed adipiscing diam donec adipiscing tristique risus nec. Lorem dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Magnis dis parturient montes nascetur ridiculus mus.
In arcu cursus euismod quis viverra nibh cras pulvinar mattis. Libero enim sed faucibus turpis. Sit amet justo donec enim diam vulputate ut pharetra. Netus et malesuada fames ac turpis. Nunc congue nisi vitae suscipit tellus. Enim praesent elementum facilisis leo. Sagittis purus sit amet volutpat consequat mauris nunc. Sit amet nisl purus in mollis nunc. Arcu non sodales neque sodales ut etiam sit amet. Ac placerat vestibulum lectus mauris ultrices eros. Enim ut sem viverra aliquet. Ut etiam sit amet nisl. Ipsum a arcu cursus vitae congue mauris rhoncus.
Aliquam malesuada bibendum arcu vitae elementum curabitur vitae nunc sed. Amet consectetur adipiscing elit duis tristique. Elit at imperdiet dui accumsan sit amet nulla facilisi. Aliquet enim tortor at auctor. Tristique et egestas quis ipsum suspendisse ultrices gravida dictum. Eu sem integer vitae justo eget magna fermentum iaculis. Pellentesque elit eget gravida cum sociis natoque penatibus et magnis. Tortor at auctor urna nunc id cursus metus aliquam. Blandit libero volutpat sed cras ornare arcu dui vivamus. Quam vulputate dignissim suspendisse in est ante. Vel turpis nunc eget lorem. Enim nulla aliquet porttitor lacus luctus accumsan tortor posuere. Morbi tempus iaculis urna id volutpat lacus laoreet non curabitur. Vulputate odio ut enim blandit. Metus dictum at tempor commodo ullamcorper. Ridiculus mus mauris vitae ultricies leo. Vel facilisis volutpat est velit egestas dui id ornare arcu. Gravida arcu ac tortor dignissim convallis. Cursus euismod quis viverra nibh cras pulvinar mattis nunc. Placerat vestibulum lectus mauris ultrices eros in.
Faucibus purus in massa tempor nec feugiat. Euismod quis viverra nibh cras. Quam viverra orci sagittis eu volutpat odio. Tellus molestie nunc non blandit massa enim nec dui nunc. Iaculis nunc sed augue lacus viverra vitae congue eu. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Nulla porttitor massa id neque. Varius vel pharetra vel turpis nunc eget. Risus pretium quam vulputate dignissim. Massa vitae tortor condimentum lacinia quis vel. Tortor aliquam nulla facilisi cras. Risus pretium quam vulputate dignissim suspendisse in est. Ut faucibus pulvinar elementum integer enim neque volutpat ac tincidunt. Sit amet volutpat consequat mauris nunc congue nisi vitae. Tempus iaculis urna id volutpat lacus laoreet non curabitur gravida.
In nisl nisi scelerisque eu ultrices vitae. Habitasse platea dictumst vestibulum rhoncus est. Aliquam sem fringilla ut morbi tincidunt augue interdum velit. Iaculis eu non diam phasellus vestibulum lorem sed risus. Velit scelerisque in dictum non consectetur a erat nam. In tellus integer feugiat scelerisque varius morbi enim nunc faucibus. Nec sagittis aliquam malesuada bibendum arcu vitae. Sed augue lacus viverra vitae congue eu consequat ac felis. Proin fermentum leo vel orci porta non pulvinar neque laoreet. Habitasse platea dictumst vestibulum rhoncus est pellentesque. Bibendum ut tristique et egestas.
Nunc sed augue lacus viverra vitae congue. Tempor id eu nisl nunc mi. Ultrices vitae auctor eu augue ut lectus. Feugiat scelerisque varius morbi enim nunc faucibus a pellentesque sit. Et netus et malesuada fames ac turpis egestas sed tempus. Arcu dictum varius duis at consectetur lorem donec massa sapien. Nibh mauris cursus mattis molestie a iaculis. Phasellus faucibus scelerisque eleifend donec pretium. Tortor condimentum lacinia quis vel eros donec ac odio. Amet nisl suscipit adipiscing bibendum est. Dui ut ornare lectus sit amet est placerat in. Duis convallis convallis tellus id. Sociis natoque penatibus et magnis dis parturient. Adipiscing at in tellus integer feugiat. In nibh mauris cursus mattis molestie a iaculis at. Dui ut ornare lectus sit amet.
Blandit cursus risus at ultrices mi tempus imperdiet nulla. Orci ac auctor augue mauris augue neque gravida. Mauris nunc congue nisi vitae suscipit. Lectus quam id leo in vitae. Mauris commodo quis imperdiet massa tincidunt nunc. Pellentesque diam volutpat commodo sed egestas egestas fringilla phasellus. Id venenatis a condimentum vitae sapien pellentesque habitant. Lacus laoreet non curabitur gravida arcu ac tortor. Scelerisque viverra mauris in aliquam sem. Mollis aliquam ut porttitor leo. Neque laoreet suspendisse interdum consectetur. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Dolor purus non enim praesent elementum facilisis leo vel.
Rhoncus mattis rhoncus urna neque viverra. Venenatis lectus magna fringilla urna porttitor. Purus in massa tempor nec feugiat nisl pretium fusce. Maecenas pharetra convallis posuere morbi leo urna molestie. Id venenatis a condimentum vitae sapien pellentesque. Erat imperdiet sed euismod nisi porta lorem mollis. Quis eleifend quam adipiscing vitae proin sagittis. Convallis posuere morbi leo urna molestie at. Sit amet mauris commodo quis imperdiet. Rutrum quisque non tellus orci ac auctor augue mauris augue. Malesuada nunc vel risus commodo.
Arcu dictum varius duis at consectetur lorem donec massa sapien. Lorem ipsum dolor sit amet consectetur. Libero enim sed faucibus turpis in eu mi bibendum. Ipsum faucibus vitae aliquet nec ullamcorper sit amet. Viverra orci sagittis eu volutpat odio facilisis mauris sit amet. Integer eget aliquet nibh praesent tristique magna sit. Eros donec ac odio tempor. Feugiat sed lectus vestibulum mattis. Tortor vitae purus faucibus ornare. Scelerisque in dictum non consectetur. Consectetur adipiscing elit duis tristique sollicitudin nibh. Mauris a diam maecenas sed enim ut.
Lorem ipsum dolor sit amet consectetur. At imperdiet dui accumsan sit amet nulla facilisi. Dui sapien eget mi proin sed. Maecenas ultricies mi eget mauris pharetra et ultrices. Nibh venenatis cras sed felis eget velit aliquet. Etiam erat velit scelerisque in. Eu nisl nunc mi ipsum faucibus. Eget velit aliquet sagittis id consectetur. Mauris a diam maecenas sed enim. Rhoncus aenean vel elit scelerisque. Risus in hendrerit gravida rutrum quisque non tellus orci ac.
Faucibus et molestie ac feugiat sed lectus. Purus viverra accumsan in nisl nisi scelerisque. Auctor elit sed vulputate mi sit amet. Sed egestas egestas fringilla phasellus. Lectus sit amet est placerat in egestas erat imperdiet. Rhoncus mattis rhoncus urna neque viverra justo nec. Elementum facilisis leo vel fringilla. Laoreet sit amet cursus sit amet dictum sit amet justo. Massa tempor nec feugiat nisl pretium fusce id velit ut. Enim facilisis gravida neque convallis a cras semper. Neque volutpat ac tincidunt vitae semper quis.
Consectetur purus ut faucibus pulvinar elementum. Orci porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Neque viverra justo nec ultrices dui sapien eget. Posuere lorem ipsum dolor sit amet consectetur adipiscing elit duis. Pellentesque eu tincidunt tortor aliquam. Augue neque gravida in fermentum et sollicitudin ac. Eu feugiat pretium nibh ipsum consequat. Enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Ac orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. Cras ornare arcu dui vivamus arcu. Libero volutpat sed cras ornare arcu dui. Sapien et ligula ullamcorper malesuada proin libero nunc consequat interdum.
Condimentum mattis pellentesque id nibh. Neque volutpat ac tincidunt vitae semper quis lectus. Nulla pellentesque dignissim enim sit amet venenatis urna cursus eget. Turpis tincidunt id aliquet risus feugiat in ante metus. Blandit turpis cursus in hac. Aliquam eleifend mi in nulla posuere. Semper eget duis at tellus. Eu feugiat pretium nibh ipsum consequat nisl. Est sit amet facilisis magna etiam. Augue neque gravida in fermentum et sollicitudin ac orci phasellus. Lacus vel facilisis volutpat est velit egestas dui id. Pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Dictum at tempor commodo ullamcorper a. Et tortor at risus viverra adipiscing at in tellus integer. Velit egestas dui id ornare arcu odio ut.
Tortor condimentum lacinia quis vel eros donec. Libero enim sed faucibus turpis in eu. Rhoncus dolor purus non enim praesent elementum facilisis leo. Eget egestas purus viverra accumsan in. Morbi leo urna molestie at elementum eu facilisis sed. Consectetur adipiscing elit duis tristique sollicitudin nibh sit. Tempor orci dapibus ultrices in iaculis nunc. Cras adipiscing enim eu turpis egestas pretium aenean pharetra magna. Justo eget magna fermentum iaculis. Aliquam faucibus purus in massa tempor nec feugiat. Ut lectus arcu bibendum at varius vel.
Dolor sit amet consectetur adipiscing elit pellentesque habitant morbi tristique. Augue eget arcu dictum varius duis at consectetur. Ultrices sagittis orci a scelerisque purus semper eget. Nam at lectus urna duis. Id venenatis a condimentum vitae. In vitae turpis massa sed elementum. Tristique senectus et netus et malesuada fames ac turpis. Pellentesque id nibh tortor id aliquet lectus proin nibh. Ullamcorper a lacus vestibulum sed arcu non odio euismod. Consectetur lorem donec massa sapien. Dignissim diam quis enim lobortis scelerisque. Metus dictum at tempor commodo ullamcorper a lacus vestibulum. Consequat nisl vel pretium lectus quam id. Nam libero justo laoreet sit amet cursus sit amet dictum. Nec ultrices dui sapien eget mi proin. Nulla aliquet porttitor lacus luctus accumsan. Velit euismod in pellentesque massa.
Nibh ipsum consequat nisl vel pretium lectus quam id. Placerat vestibulum lectus mauris ultrices eros in. Feugiat scelerisque varius morbi enim. Quis enim lobortis scelerisque fermentum dui faucibus. Nunc faucibus a pellentesque sit amet porttitor eget. Nunc eget lorem dolor sed viverra. Dui faucibus in ornare quam viverra. Non arcu risus quis varius quam quisque id diam. Vel risus commodo viverra maecenas accumsan lacus vel facilisis volutpat. Eget dolor morbi non arcu risus quis varius quam. Libero volutpat sed cras ornare arcu dui vivamus. Tempor orci dapibus ultrices in iaculis nunc sed. Egestas dui id ornare arcu. Arcu felis bibendum ut tristique et. Aliquam id diam maecenas ultricies. Ornare aenean euismod elementum nisi quis. Et sollicitudin ac orci phasellus egestas tellus rutrum tellus.
Ac tincidunt vitae semper quis lectus nulla at volutpat. Viverra tellus in hac habitasse platea dictumst. Quis blandit turpis cursus in hac habitasse. Bibendum arcu vitae elementum curabitur vitae nunc sed velit dignissim. Felis eget velit aliquet sagittis. Maecenas volutpat blandit aliquam etiam erat velit. Lorem dolor sed viverra ipsum nunc aliquet bibendum enim. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Arcu dui vivamus arcu felis bibendum ut tristique et egestas. Libero nunc consequat interdum varius. Id nibh tortor id aliquet lectus. Odio tempor orci dapibus ultrices in. Adipiscing elit ut aliquam purus sit amet luctus. Ut eu sem integer vitae justo. Interdum velit euismod in pellentesque massa. Tortor pretium viverra suspendisse potenti nullam ac.
Sagittis orci a scelerisque purus semper eget. Nec feugiat nisl pretium fusce id. Eu volutpat odio facilisis mauris sit amet massa vitae tortor. A iaculis at erat pellentesque adipiscing commodo elit at. Tortor at auctor urna nunc id cursus. At quis risus sed vulputate odio ut enim blandit. Quam adipiscing vitae proin sagittis. Integer eget aliquet nibh praesent tristique magna sit amet. Phasellus faucibus scelerisque eleifend donec pretium vulputate sapien nec. Justo eget magna fermentum iaculis. Eleifend mi in nulla posuere sollicitudin aliquam ultrices sagittis. Suscipit adipiscing bibendum est ultricies integer quis. Dictum varius duis at consectetur lorem donec massa sapien faucibus. Pretium viverra suspendisse potenti nullam ac tortor vitae. Tincidunt augue interdum velit euismod in. At risus viverra adipiscing at. Pellentesque eu tincidunt tortor aliquam nulla facilisi. Ultricies mi quis hendrerit dolor magna. Mauris augue neque gravida in fermentum et sollicitudin ac orci. Convallis convallis tellus id interdum velit laoreet.
Neque sodales ut etiam sit amet nisl purus in mollis. Lorem ipsum dolor sit amet consectetur adipiscing. Adipiscing elit pellentesque habitant morbi tristique senectus et netus. Et netus et malesuada fames ac turpis egestas sed tempus. Proin sagittis nisl rhoncus mattis rhoncus urna neque. Scelerisque in dictum non consectetur a erat nam. Commodo elit at imperdiet dui. Facilisis magna etiam tempor orci eu lobortis elementum. Eu non diam phasellus vestibulum lorem sed risus. Semper viverra nam libero justo laoreet sit amet cursus sit. At varius vel pharetra vel turpis nunc eget lorem.
Nunc sed blandit libero volutpat sed. Viverra justo nec ultrices dui sapien eget mi proin. Sed ullamcorper morbi tincidunt ornare massa. Vitae auctor eu augue ut lectus arcu. Vitae turpis massa sed elementum. Interdum velit euismod in pellentesque massa placerat duis. Vitae suscipit tellus mauris a diam maecenas sed enim. Nunc mi ipsum faucibus vitae aliquet nec ullamcorper. Dignissim diam quis enim lobortis scelerisque fermentum dui faucibus. Luctus venenatis lectus magna fringilla urna porttitor rhoncus dolor purus. Dolor morbi non arcu risus quis varius. Adipiscing diam donec adipiscing tristique risus nec feugiat in fermentum. Turpis tincidunt id aliquet risus feugiat in. Viverra justo nec ultrices dui sapien.
Purus non enim praesent elementum facilisis. Nulla porttitor massa id neque aliquam vestibulum morbi blandit. Non consectetur a erat nam at. Varius duis at consectetur lorem donec massa sapien faucibus. Luctus venenatis lectus magna fringilla urna porttitor rhoncus. Faucibus a pellentesque sit amet porttitor eget. Sed augue lacus viverra vitae congue eu consequat. Enim lobortis scelerisque fermentum dui faucibus in ornare quam viverra. Pellentesque massa placerat duis ultricies. Morbi blandit cursus risus at. Convallis posuere morbi leo urna molestie at elementum eu facilisis. Cum sociis natoque penatibus et magnis dis. Sit amet consectetur adipiscing elit pellentesque. Ornare aenean euismod elementum nisi quis eleifend. Platea dictumst quisque sagittis purus sit amet volutpat. Proin nibh nisl condimentum id venenatis a condimentum. Cursus risus at ultrices mi tempus imperdiet nulla malesuada pellentesque. Hac habitasse platea dictumst quisque sagittis purus sit amet volutpat. Id donec ultrices tincidunt arcu non sodales neque. Non sodales neque sodales ut etiam.
Nam libero justo laoreet sit. Fusce ut placerat orci nulla. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Malesuada proin libero nunc consequat interdum varius sit. Nunc eget lorem dolor sed viverra ipsum nunc aliquet bibendum. Tortor posuere ac ut consequat semper viverra nam libero justo. Semper feugiat nibh sed pulvinar. Elit sed vulputate mi sit amet mauris. Sed cras ornare arcu dui. Varius vel pharetra vel turpis nunc eget. Purus sit amet volutpat consequat mauris nunc congue nisi vitae. Sem et tortor consequat id porta nibh venenatis. Habitant morbi tristique senectus et netus et malesuada fames ac. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant. Euismod lacinia at quis risus sed vulputate odio.
Laoreet non curabitur gravida arcu ac tortor. Ut ornare lectus sit amet est placerat. Turpis tincidunt id aliquet risus feugiat in. At tempor commodo ullamcorper a lacus vestibulum sed. Curabitur gravida arcu ac tortor dignissim convallis aenean et. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque. Nunc non blandit massa enim nec dui nunc mattis enim. Egestas integer eget aliquet nibh. A arcu cursus vitae congue mauris rhoncus aenean. Arcu non sodales neque sodales. Pulvinar mattis nunc sed blandit libero volutpat sed cras. Sit amet consectetur adipiscing elit ut aliquam purus. Risus in hendrerit gravida rutrum quisque non. Lorem donec massa sapien faucibus et molestie ac feugiat. Tincidunt dui ut ornare lectus sit amet est. Enim nunc faucibus a pellentesque sit amet porttitor eget dolor. Auctor neque vitae tempus quam pellentesque nec nam aliquam sem.
Risus pretium quam vulputate dignissim suspendisse. Tempor id eu nisl nunc mi ipsum faucibus vitae. Elit pellentesque habitant morbi tristique senectus. Consequat ac felis donec et odio pellentesque diam volutpat commodo. Gravida cum sociis natoque penatibus. Etiam tempor orci eu lobortis elementum. In tellus integer feugiat scelerisque varius morbi enim nunc faucibus. Pretium quam vulputate dignissim suspendisse in est ante in. Risus pretium quam vulputate dignissim suspendisse in est ante in. Elementum integer enim neque volutpat ac tincidunt vitae semper quis. Faucibus purus in massa tempor nec. Iaculis at erat pellentesque adipiscing. Diam maecenas sed enim ut sem viverra aliquet eget sit. Aliquam nulla facilisi cras fermentum odio.
Tempus urna et pharetra pharetra massa massa ultricies mi quis. Non curabitur gravida arcu ac tortor dignissim convallis aenean et. Et ultrices neque ornare aenean euismod. Neque convallis a cras semper auctor neque. In nibh mauris cursus mattis. Vitae congue eu consequat ac felis donec et odio pellentesque. Turpis in eu mi bibendum neque egestas congue. Sed vulputate odio ut enim blandit volutpat maecenas volutpat blandit. Magna fringilla urna porttitor rhoncus dolor. Malesuada fames ac turpis egestas maecenas pharetra convallis posuere. Eu tincidunt tortor aliquam nulla. Integer quis auctor elit sed. Venenatis cras sed felis eget velit aliquet sagittis. Sed arcu non odio euismod lacinia at quis. Ullamcorper morbi tincidunt ornare massa eget egestas. Sollicitudin nibh sit amet commodo nulla. Morbi quis commodo odio aenean sed. Gravida neque convallis a cras semper auctor neque vitae tempus. Diam maecenas sed enim ut sem viverra aliquet.
Donec massa sapien faucibus et molestie ac feugiat sed. Luctus venenatis lectus magna fringilla urna porttitor rhoncus dolor purus. Ultricies lacus sed turpis tincidunt id aliquet. Condimentum vitae sapien pellentesque habitant. Nulla pellentesque dignissim enim sit amet. Imperdiet nulla malesuada pellentesque elit eget gravida. Vestibulum lectus mauris ultrices eros in cursus. Neque convallis a cras semper auctor neque vitae tempus. Enim nunc faucibus a pellentesque sit amet porttitor eget. Diam volutpat commodo sed egestas. Ac tortor dignissim convallis aenean et tortor at risus. Risus pretium quam vulputate dignissim suspendisse in est ante in. Nunc lobortis mattis aliquam faucibus. Erat velit scelerisque in dictum non consectetur a erat. Id nibh tortor id aliquet lectus proin nibh. Et malesuada fames ac turpis.
Libero justo laoreet sit amet cursus. Facilisis mauris sit amet massa vitae. Non curabitur gravida arcu ac tortor. Egestas fringilla phasellus faucibus scelerisque eleifend donec. Egestas tellus rutrum tellus pellentesque eu tincidunt tortor aliquam. Odio pellentesque diam volutpat commodo sed egestas egestas. Cursus sit amet dictum sit amet justo. In vitae turpis massa sed elementum. Consectetur lorem donec massa sapien faucibus et molestie. Sed lectus vestibulum mattis ullamcorper. Ut sem viverra aliquet eget sit amet tellus cras. Aliquam nulla facilisi cras fermentum odio eu feugiat pretium nibh. Ullamcorper malesuada proin libero nunc consequat interdum varius sit amet. Turpis egestas sed tempus urna et pharetra pharetra massa massa. Ornare lectus sit amet est placerat in egestas erat imperdiet. Bibendum est ultricies integer quis auctor elit sed. Aliquam ut porttitor leo a diam sollicitudin tempor.
Turpis egestas integer eget aliquet. Ac odio tempor orci dapibus. Sed id semper risus in hendrerit. Ultrices vitae auctor eu augue ut. Maecenas accumsan lacus vel facilisis volutpat est velit egestas dui. Purus sit amet luctus venenatis. Tristique nulla aliquet enim tortor at auctor urna. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Nullam eget felis eget nunc lobortis mattis aliquam. Lobortis elementum nibh tellus molestie nunc non. Eu facilisis sed odio morbi quis commodo. Lorem ipsum dolor sit amet consectetur adipiscing. Ac turpis egestas sed tempus urna. At ultrices mi tempus imperdiet nulla malesuada pellentesque elit eget. Interdum posuere lorem ipsum dolor.
Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Pretium quam vulputate dignissim suspendisse in est ante. Sem integer vitae justo eget magna fermentum. Morbi non arcu risus quis. Elementum nisi quis eleifend quam adipiscing vitae proin. Nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Tellus in metus vulputate eu scelerisque felis imperdiet proin fermentum. Imperdiet dui accumsan sit amet. Mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare massa. Nunc non blandit massa enim nec dui nunc. Senectus et netus et malesuada fames ac turpis egestas sed. Ullamcorper malesuada proin libero nunc consequat interdum. Fames ac turpis egestas maecenas pharetra convallis posuere. A lacus vestibulum sed arcu non odio.
Pellentesque habitant morbi tristique senectus et netus et. Imperdiet massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada. Netus et malesuada fames ac turpis egestas maecenas pharetra. Condimentum lacinia quis vel eros. Magnis dis parturient montes nascetur ridiculus mus mauris. In ante metus dictum at. Sed blandit libero volutpat sed cras ornare arcu dui vivamus. Sed libero enim sed faucibus turpis in eu. At tempor commodo ullamcorper a lacus vestibulum sed arcu non. Aliquam ut porttitor leo a diam sollicitudin tempor. Dignissim cras tincidunt lobortis feugiat vivamus at. Erat imperdiet sed euismod nisi porta lorem.
Ut venenatis tellus in metus vulputate eu scelerisque. Ultrices neque ornare aenean euismod elementum. Quam viverra orci sagittis eu volutpat. Morbi tincidunt ornare massa eget egestas purus viverra. Amet nulla facilisi morbi tempus. Sollicitudin tempor id eu nisl nunc mi ipsum faucibus vitae. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Quis varius quam quisque id diam. Scelerisque varius morbi enim nunc. Auctor elit sed vulputate mi sit amet mauris. Pulvinar pellentesque habitant morbi tristique senectus et netus.
Egestas sed tempus urna et pharetra. In hendrerit gravida rutrum quisque. Tortor aliquam nulla facilisi cras fermentum odio. Senectus et netus et malesuada fames ac. Sit amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Laoreet sit amet cursus sit amet. Vitae proin sagittis nisl rhoncus mattis rhoncus urna neque viverra. Tristique nulla aliquet enim tortor at auctor. Vestibulum sed arcu non odio. Sed enim ut sem viverra aliquet eget. Ultrices sagittis orci a scelerisque. Etiam sit amet nisl purus in mollis. Euismod elementum nisi quis eleifend quam. Tincidunt praesent semper feugiat nibh sed pulvinar. Turpis egestas integer eget aliquet nibh praesent tristique.
Tortor dignissim convallis aenean et tortor. Urna et pharetra pharetra massa massa ultricies mi quis hendrerit. Dui vivamus arcu felis bibendum ut tristique et. Magna eget est lorem ipsum dolor sit. Justo donec enim diam vulputate ut pharetra sit. Blandit volutpat maecenas volutpat blandit aliquam etiam erat. Sem et tortor consequat id. Enim nunc faucibus a pellentesque sit amet. Facilisis mauris sit amet massa vitae tortor condimentum lacinia quis. Suspendisse ultrices gravida dictum fusce ut. Leo a diam sollicitudin tempor id. Leo a diam sollicitudin tempor id eu nisl. Purus gravida quis blandit turpis cursus in hac. Metus vulputate eu scelerisque felis imperdiet proin fermentum leo vel. Malesuada fames ac turpis egestas integer eget aliquet nibh. Id donec ultrices tincidunt arcu. Nunc faucibus a pellentesque sit amet porttitor. At augue eget arcu dictum varius.
Felis eget velit aliquet sagittis id consectetur. Habitant morbi tristique senectus et netus et malesuada fames ac. Volutpat est velit egestas dui id ornare arcu. Auctor neque vitae tempus quam pellentesque nec nam aliquam. Nisl nisi scelerisque eu ultrices. Viverra nam libero justo laoreet sit amet cursus. Urna condimentum mattis pellentesque id nibh tortor. Pulvinar pellentesque habitant morbi tristique senectus et. Arcu dictum varius duis at consectetur lorem donec massa. Tempus iaculis urna id volutpat lacus laoreet. Nunc sed id semper risus in hendrerit. Praesent tristique magna sit amet purus gravida quis blandit. Lacus laoreet non curabitur gravida arcu ac tortor dignissim. Eget arcu dictum varius duis at consectetur lorem donec. In metus vulputate eu scelerisque felis imperdiet.
Massa tempor nec feugiat nisl pretium fusce id velit ut. Lectus nulla at volutpat diam ut. Amet venenatis urna cursus eget nunc scelerisque viverra mauris. A cras semper auctor neque vitae tempus. Magna eget est lorem ipsum dolor sit amet consectetur adipiscing. A pellentesque sit amet porttitor eget. Eget duis at tellus at urna. Ac turpis egestas maecenas pharetra convallis posuere. Rutrum quisque non tellus orci ac auctor. Quam elementum pulvinar etiam non. Lacus sed viverra tellus in. Sit amet nulla facilisi morbi tempus iaculis urna.
Quam quisque id diam vel quam elementum pulvinar etiam. Est ullamcorper eget nulla facilisi. Porta lorem mollis aliquam ut porttitor leo. Urna duis convallis convallis tellus id interdum velit. Purus viverra accumsan in nisl nisi scelerisque eu. Ultrices eros in cursus turpis massa tincidunt. Leo a diam sollicitudin tempor id eu. Ullamcorper a lacus vestibulum sed arcu. Sem viverra aliquet eget sit amet. Varius morbi enim nunc faucibus a. Bibendum at varius vel pharetra. Augue lacus viverra vitae congue. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus a.
Consectetur adipiscing elit ut aliquam. Volutpat lacus laoreet non curabitur. Nulla facilisi morbi tempus iaculis urna id volutpat lacus laoreet. Urna nec tincidunt praesent semper feugiat nibh. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Venenatis a condimentum vitae sapien pellentesque. Id donec ultrices tincidunt arcu non sodales neque sodales. Magna sit amet purus gravida quis blandit turpis. Malesuada fames ac turpis egestas. Purus non enim praesent elementum. Interdum consectetur libero id faucibus nisl tincidunt eget nullam. Senectus et netus et malesuada. Nulla malesuada pellentesque elit eget gravida cum sociis. Amet purus gravida quis blandit turpis cursus. Eu turpis egestas pretium aenean pharetra magna.
Mattis vulputate enim nulla aliquet porttitor. Eu feugiat pretium nibh ipsum consequat nisl vel. Lacinia quis vel eros donec ac odio tempor orci dapibus. Sapien faucibus et molestie ac feugiat sed lectus vestibulum. Placerat duis ultricies lacus sed turpis tincidunt id aliquet. Mauris pharetra et ultrices neque ornare aenean euismod elementum nisi. Erat pellentesque adipiscing commodo elit at imperdiet. Leo vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Libero nunc consequat interdum varius. Tristique nulla aliquet enim tortor at. Odio facilisis mauris sit amet massa vitae tortor. Vitae semper quis lectus nulla at volutpat diam ut venenatis. Velit laoreet id donec ultrices tincidunt arcu non sodales neque. Lorem mollis aliquam ut porttitor leo a diam. Lectus arcu bibendum at varius vel pharetra vel.
Risus pretium quam vulputate dignissim. Lacus sed turpis tincidunt id aliquet risus feugiat in. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Vulputate mi sit amet mauris commodo quis imperdiet massa tincidunt. Sit amet mattis vulputate enim nulla aliquet. Ut aliquam purus sit amet luctus. Nunc mattis enim ut tellus elementum sagittis vitae et. Ac ut consequat semper viverra nam libero justo. Et sollicitudin ac orci phasellus. Elit sed vulputate mi sit amet mauris commodo quis imperdiet.
Nunc non blandit massa enim nec dui nunc. Tellus pellentesque eu tincidunt tortor aliquam nulla. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Laoreet non curabitur gravida arcu ac tortor dignissim convallis aenean. Quisque egestas diam in arcu. Amet nisl suscipit adipiscing bibendum. Turpis egestas integer eget aliquet nibh praesent tristique magna. Semper quis lectus nulla at volutpat. Cursus eget nunc scelerisque viverra. Malesuada bibendum arcu vitae elementum curabitur vitae. Faucibus purus in massa tempor nec feugiat nisl pretium. Lorem mollis aliquam ut porttitor leo a. Et netus et malesuada fames ac. Platea dictumst vestibulum rhoncus est pellentesque elit. Erat imperdiet sed euismod nisi porta lorem mollis.
Feugiat in fermentum posuere urna nec tincidunt praesent semper feugiat. Lacus vel facilisis volutpat est velit egestas dui. Pellentesque sit amet porttitor eget dolor morbi non arcu risus. Elit at imperdiet dui accumsan sit amet nulla facilisi. Aliquam id diam maecenas ultricies mi eget mauris. Pellentesque eu tincidunt tortor aliquam nulla facilisi. Amet mattis vulputate enim nulla aliquet. Sollicitudin nibh sit amet commodo nulla facilisi nullam vehicula. Vulputate dignissim suspendisse in est ante in nibh. At ultrices mi tempus imperdiet nulla malesuada pellentesque elit. Ornare arcu dui vivamus arcu felis bibendum ut. Ultrices in iaculis nunc sed augue. Diam vel quam elementum pulvinar etiam. Elit scelerisque mauris pellentesque pulvinar pellentesque. Leo in vitae turpis massa sed. Sed sed risus pretium quam vulputate dignissim suspendisse in est. Orci nulla pellentesque dignissim enim sit amet venenatis. Et leo duis ut diam. Integer feugiat scelerisque varius morbi enim nunc faucibus. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum.
Elementum pulvinar etiam non quam. Orci nulla pellentesque dignissim enim sit amet. Commodo quis imperdiet massa tincidunt nunc. Mattis vulputate enim nulla aliquet. Eleifend mi in nulla posuere sollicitudin aliquam ultrices sagittis. Purus gravida quis blandit turpis cursus in hac. Morbi tristique senectus et netus et malesuada fames ac turpis. Tellus rutrum tellus pellentesque eu tincidunt tortor. Id semper risus in hendrerit gravida. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Habitant morbi tristique senectus et netus et malesuada fames. In pellentesque massa placerat duis ultricies.
Feugiat vivamus at augue eget arcu dictum varius duis at. In est ante in nibh mauris cursus mattis molestie a. Non diam phasellus vestibulum lorem. Lectus urna duis convallis convallis tellus id interdum velit. Donec massa sapien faucibus et molestie ac feugiat. Pharetra sit amet aliquam id diam maecenas ultricies mi eget. Mauris in aliquam sem fringilla. Molestie at elementum eu facilisis sed odio morbi quis commodo. Neque ornare aenean euismod elementum. Nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. Netus et malesuada fames ac turpis. Eu sem integer vitae justo.
Egestas maecenas pharetra convallis posuere morbi leo urna molestie at. A diam maecenas sed enim ut. Blandit turpis cursus in hac habitasse platea. Id leo in vitae turpis massa sed elementum tempus. Velit euismod in pellentesque massa placerat duis. Congue eu consequat ac felis donec. In eu mi bibendum neque egestas congue quisque. Laoreet id donec ultrices tincidunt arcu. Eu feugiat pretium nibh ipsum consequat nisl vel. Magna etiam tempor orci eu lobortis elementum nibh tellus molestie. Laoreet id donec ultrices tincidunt arcu non sodales neque sodales. Dui accumsan sit amet nulla facilisi morbi tempus. Libero volutpat sed cras ornare arcu dui vivamus. Ac turpis egestas sed tempus urna et pharetra. Congue mauris rhoncus aenean vel. Nibh tortor id aliquet lectus proin nibh nisl. Felis eget nunc lobortis mattis aliquam faucibus purus. Eget velit aliquet sagittis id.
Volutpat ac tincidunt vitae semper quis lectus nulla at. Lorem ipsum dolor sit amet consectetur adipiscing. At lectus urna duis convallis convallis. Lacinia quis vel eros donec ac. Dolor sed viverra ipsum nunc aliquet bibendum. Urna id volutpat lacus laoreet non curabitur gravida arcu. Sociis natoque penatibus et magnis dis parturient. Gravida dictum fusce ut placerat orci. Quis eleifend quam adipiscing vitae proin sagittis nisl. Eu mi bibendum neque egestas. Tristique risus nec feugiat in fermentum posuere. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Purus gravida quis blandit turpis cursus in hac habitasse platea. Interdum consectetur libero id faucibus nisl tincidunt eget. Sed pulvinar proin gravida hendrerit lectus. Amet dictum sit amet justo.
Facilisis mauris sit amet massa vitae tortor condimentum lacinia. Imperdiet nulla malesuada pellentesque elit. Lacus vel facilisis volutpat est velit egestas dui. Nibh praesent tristique magna sit amet purus gravida quis blandit. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Cras sed felis eget velit aliquet sagittis id consectetur purus. In ornare quam viverra orci sagittis eu volutpat. Ultrices gravida dictum fusce ut placerat orci nulla pellentesque dignissim. Senectus et netus et malesuada fames ac turpis. Nisl purus in mollis nunc sed id semper. A diam maecenas sed enim ut. Interdum velit euismod in pellentesque massa placerat duis ultricies. Vel facilisis volutpat est velit egestas dui id ornare.
Suspendisse faucibus interdum posuere lorem ipsum. In ornare quam viverra orci sagittis. Felis eget velit aliquet sagittis id. Phasellus vestibulum lorem sed risus ultricies tristique nulla aliquet. Mauris augue neque gravida in fermentum et sollicitudin. Neque ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Convallis aenean et tortor at risus. Bibendum est ultricies integer quis auctor elit sed vulputate. Purus sit amet volutpat consequat mauris nunc congue nisi vitae. In nibh mauris cursus mattis molestie a. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Urna condimentum mattis pellentesque id nibh tortor id aliquet. Enim ut sem viverra aliquet eget sit amet. Varius sit amet mattis vulputate. Integer eget aliquet nibh praesent tristique magna sit amet purus. A lacus vestibulum sed arcu non odio euismod lacinia at. Tellus orci ac auctor augue mauris augue neque gravida in. Urna molestie at elementum eu. Euismod lacinia at quis risus. At ultrices mi tempus imperdiet nulla.
Elementum integer enim neque volutpat. Sit amet mattis vulputate enim nulla aliquet porttitor. Accumsan tortor posuere ac ut consequat semper. Gravida rutrum quisque non tellus orci ac. Eget est lorem ipsum dolor. Nibh praesent tristique magna sit. Egestas congue quisque egestas diam in arcu cursus euismod. Sed felis eget velit aliquet sagittis id consectetur purus ut. Bibendum neque egestas congue quisque egestas diam in arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Morbi leo urna molestie at elementum eu facilisis sed odio. Felis bibendum ut tristique et egestas quis ipsum. Ut consequat semper viverra nam. Sem et tortor consequat id. Dolor purus non enim praesent elementum facilisis leo vel fringilla.
Consectetur libero id faucibus nisl tincidunt eget. Rhoncus aenean vel elit scelerisque. Augue ut lectus arcu bibendum at varius vel pharetra. Elementum facilisis leo vel fringilla est ullamcorper eget. Massa tempor nec feugiat nisl pretium fusce id. Dignissim diam quis enim lobortis scelerisque. Amet cursus sit amet dictum sit. Sociis natoque penatibus et magnis dis parturient montes. Turpis cursus in hac habitasse platea dictumst. Bibendum at varius vel pharetra vel turpis. Sollicitudin ac orci phasellus egestas tellus rutrum. Id aliquet risus feugiat in ante metus dictum at tempor. Duis ut diam quam nulla. Accumsan tortor posuere ac ut consequat semper. Orci ac auctor augue mauris augue neque gravida in fermentum. Molestie a iaculis at erat pellentesque adipiscing commodo elit at.
Tellus elementum sagittis vitae et leo duis. Egestas sed tempus urna et. Scelerisque felis imperdiet proin fermentum leo vel orci. Nisl vel pretium lectus quam id leo in. Morbi quis commodo odio aenean sed adipiscing diam donec adipiscing. Dignissim convallis aenean et tortor at risus viverra adipiscing at. Sagittis eu volutpat odio facilisis mauris sit. Mattis aliquam faucibus purus in. Dolor sit amet consectetur adipiscing elit pellentesque habitant morbi. In metus vulputate eu scelerisque felis imperdiet proin. Eu mi bibendum neque egestas congue. Pretium lectus quam id leo in vitae turpis massa sed. Tellus integer feugiat scelerisque varius. Etiam tempor orci eu lobortis elementum nibh tellus. Massa enim nec dui nunc. Nisl pretium fusce id velit ut tortor pretium.
Tortor dignissim convallis aenean et tortor. Urna et pharetra pharetra massa massa ultricies mi quis hendrerit. Dui vivamus arcu felis bibendum ut tristique et. Magna eget est lorem ipsum dolor sit. Justo donec enim diam vulputate ut pharetra sit. Blandit volutpat maecenas volutpat blandit aliquam etiam erat. Sem et tortor consequat id. Enim nunc faucibus a pellentesque sit amet. Facilisis mauris sit amet massa vitae tortor condimentum lacinia quis. Suspendisse ultrices gravida dictum fusce ut. Leo a diam sollicitudin tempor id. Leo a diam sollicitudin tempor id eu nisl. Purus gravida quis blandit turpis cursus in hac. Metus vulputate eu scelerisque felis imperdiet proin fermentum leo vel. Malesuada fames ac turpis egestas integer eget aliquet nibh. Id donec ultrices tincidunt arcu. Nunc faucibus a pellentesque sit amet porttitor. At augue eget arcu dictum varius.
Felis eget velit aliquet sagittis id consectetur. Habitant morbi tristique senectus et netus et malesuada fames ac. Volutpat est velit egestas dui id ornare arcu. Auctor neque vitae tempus quam pellentesque nec nam aliquam. Nisl nisi scelerisque eu ultrices. Viverra nam libero justo laoreet sit amet cursus. Urna condimentum mattis pellentesque id nibh tortor. Pulvinar pellentesque habitant morbi tristique senectus et. Arcu dictum varius duis at consectetur lorem donec massa. Tempus iaculis urna id volutpat lacus laoreet. Nunc sed id semper risus in hendrerit. Praesent tristique magna sit amet purus gravida quis blandit. Lacus laoreet non curabitur gravida arcu ac tortor dignissim. Eget arcu dictum varius duis at consectetur lorem donec. In metus vulputate eu scelerisque felis imperdiet.
Massa tempor nec feugiat nisl pretium fusce id velit ut. Lectus nulla at volutpat diam ut. Amet venenatis urna cursus eget nunc scelerisque viverra mauris. A cras semper auctor neque vitae tempus. Magna eget est lorem ipsum dolor sit amet consectetur adipiscing. A pellentesque sit amet porttitor eget. Eget duis at tellus at urna. Ac turpis egestas maecenas pharetra convallis posuere. Rutrum quisque non tellus orci ac auctor. Quam elementum pulvinar etiam non. Lacus sed viverra tellus in. Sit amet nulla facilisi morbi tempus iaculis urna.
Quam quisque id diam vel quam elementum pulvinar etiam. Est ullamcorper eget nulla facilisi. Porta lorem mollis aliquam ut porttitor leo. Urna duis convallis convallis tellus id interdum velit. Purus viverra accumsan in nisl nisi scelerisque eu. Ultrices eros in cursus turpis massa tincidunt. Leo a diam sollicitudin tempor id eu. Ullamcorper a lacus vestibulum sed arcu. Sem viverra aliquet eget sit amet. Varius morbi enim nunc faucibus a. Bibendum at varius vel pharetra. Augue lacus viverra vitae congue. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus a.
Consectetur adipiscing elit ut aliquam. Volutpat lacus laoreet non curabitur. Nulla facilisi morbi tempus iaculis urna id volutpat lacus laoreet. Urna nec tincidunt praesent semper feugiat nibh. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Venenatis a condimentum vitae sapien pellentesque. Id donec ultrices tincidunt arcu non sodales neque sodales. Magna sit amet purus gravida quis blandit turpis. Malesuada fames ac turpis egestas. Purus non enim praesent elementum. Interdum consectetur libero id faucibus nisl tincidunt eget nullam. Senectus et netus et malesuada. Nulla malesuada pellentesque elit eget gravida cum sociis. Amet purus gravida quis blandit turpis cursus. Eu turpis egestas pretium aenean pharetra magna.
Mattis vulputate enim nulla aliquet porttitor. Eu feugiat pretium nibh ipsum consequat nisl vel. Lacinia quis vel eros donec ac odio tempor orci dapibus. Sapien faucibus et molestie ac feugiat sed lectus vestibulum. Placerat duis ultricies lacus sed turpis tincidunt id aliquet. Mauris pharetra et ultrices neque ornare aenean euismod elementum nisi. Erat pellentesque adipiscing commodo elit at imperdiet. Leo vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Libero nunc consequat interdum varius. Tristique nulla aliquet enim tortor at. Odio facilisis mauris sit amet massa vitae tortor. Vitae semper quis lectus nulla at volutpat diam ut venenatis. Velit laoreet id donec ultrices tincidunt arcu non sodales neque. Lorem mollis aliquam ut porttitor leo a diam. Lectus arcu bibendum at varius vel pharetra vel.
Risus pretium quam vulputate dignissim. Lacus sed turpis tincidunt id aliquet risus feugiat in. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Vulputate mi sit amet mauris commodo quis imperdiet massa tincidunt. Sit amet mattis vulputate enim nulla aliquet. Ut aliquam purus sit amet luctus. Nunc mattis enim ut tellus elementum sagittis vitae et. Ac ut consequat semper viverra nam libero justo. Et sollicitudin ac orci phasellus. Elit sed vulputate mi sit amet mauris commodo quis imperdiet.
Nunc non blandit massa enim nec dui nunc. Tellus pellentesque eu tincidunt tortor aliquam nulla. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Laoreet non curabitur gravida arcu ac tortor dignissim convallis aenean. Quisque egestas diam in arcu. Amet nisl suscipit adipiscing bibendum. Turpis egestas integer eget aliquet nibh praesent tristique magna. Semper quis lectus nulla at volutpat. Cursus eget nunc scelerisque viverra. Malesuada bibendum arcu vitae elementum curabitur vitae. Faucibus purus in massa tempor nec feugiat nisl pretium. Lorem mollis aliquam ut porttitor leo a. Et netus et malesuada fames ac. Platea dictumst vestibulum rhoncus est pellentesque elit. Erat imperdiet sed euismod nisi porta lorem mollis.
Feugiat in fermentum posuere urna nec tincidunt praesent semper feugiat. Lacus vel facilisis volutpat est velit egestas dui. Pellentesque sit amet porttitor eget dolor morbi non arcu risus. Elit at imperdiet dui accumsan sit amet nulla facilisi. Aliquam id diam maecenas ultricies mi eget mauris. Pellentesque eu tincidunt tortor aliquam nulla facilisi. Amet mattis vulputate enim nulla aliquet. Sollicitudin nibh sit amet commodo nulla facilisi nullam vehicula. Vulputate dignissim suspendisse in est ante in nibh. At ultrices mi tempus imperdiet nulla malesuada pellentesque elit. Ornare arcu dui vivamus arcu felis bibendum ut. Ultrices in iaculis nunc sed augue. Diam vel quam elementum pulvinar etiam. Elit scelerisque mauris pellentesque pulvinar pellentesque. Leo in vitae turpis massa sed. Sed sed risus pretium quam vulputate dignissim suspendisse in est. Orci nulla pellentesque dignissim enim sit amet venenatis. Et leo duis ut diam. Integer feugiat scelerisque varius morbi enim nunc faucibus. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum.
Elementum pulvinar etiam non quam. Orci nulla pellentesque dignissim enim sit amet. Commodo quis imperdiet massa tincidunt nunc. Mattis vulputate enim nulla aliquet. Eleifend mi in nulla posuere sollicitudin aliquam ultrices sagittis. Purus gravida quis blandit turpis cursus in hac. Morbi tristique senectus et netus et malesuada fames ac turpis. Tellus rutrum tellus pellentesque eu tincidunt tortor. Id semper risus in hendrerit gravida. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Habitant morbi tristique senectus et netus et malesuada fames. In pellentesque massa placerat duis ultricies.
Feugiat vivamus at augue eget arcu dictum varius duis at. In est ante in nibh mauris cursus mattis molestie a. Non diam phasellus vestibulum lorem. Lectus urna duis convallis convallis tellus id interdum velit. Donec massa sapien faucibus et molestie ac feugiat. Pharetra sit amet aliquam id diam maecenas ultricies mi eget. Mauris in aliquam sem fringilla. Molestie at elementum eu facilisis sed odio morbi quis commodo. Neque ornare aenean euismod elementum. Nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. Netus et malesuada fames ac turpis. Eu sem integer vitae justo.
Egestas maecenas pharetra convallis posuere morbi leo urna molestie at. A diam maecenas sed enim ut. Blandit turpis cursus in hac habitasse platea. Id leo in vitae turpis massa sed elementum tempus. Velit euismod in pellentesque massa placerat duis. Congue eu consequat ac felis donec. In eu mi bibendum neque egestas congue quisque. Laoreet id donec ultrices tincidunt arcu. Eu feugiat pretium nibh ipsum consequat nisl vel. Magna etiam tempor orci eu lobortis elementum nibh tellus molestie. Laoreet id donec ultrices tincidunt arcu non sodales neque sodales. Dui accumsan sit amet nulla facilisi morbi tempus. Libero volutpat sed cras ornare arcu dui vivamus. Ac turpis egestas sed tempus urna et pharetra. Congue mauris rhoncus aenean vel. Nibh tortor id aliquet lectus proin nibh nisl. Felis eget nunc lobortis mattis aliquam faucibus purus. Eget velit aliquet sagittis id.
Volutpat ac tincidunt vitae semper quis lectus nulla at. Lorem ipsum dolor sit amet consectetur adipiscing. At lectus urna duis convallis convallis. Lacinia quis vel eros donec ac. Dolor sed viverra ipsum nunc aliquet bibendum. Urna id volutpat lacus laoreet non curabitur gravida arcu. Sociis natoque penatibus et magnis dis parturient. Gravida dictum fusce ut placerat orci. Quis eleifend quam adipiscing vitae proin sagittis nisl. Eu mi bibendum neque egestas. Tristique risus nec feugiat in fermentum posuere. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Purus gravida quis blandit turpis cursus in hac habitasse platea. Interdum consectetur libero id faucibus nisl tincidunt eget. Sed pulvinar proin gravida hendrerit lectus. Amet dictum sit amet justo.
Facilisis mauris sit amet massa vitae tortor condimentum lacinia. Imperdiet nulla malesuada pellentesque elit. Lacus vel facilisis volutpat est velit egestas dui. Nibh praesent tristique magna sit amet purus gravida quis blandit. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Cras sed felis eget velit aliquet sagittis id consectetur purus. In ornare quam viverra orci sagittis eu volutpat. Ultrices gravida dictum fusce ut placerat orci nulla pellentesque dignissim. Senectus et netus et malesuada fames ac turpis. Nisl purus in mollis nunc sed id semper. A diam maecenas sed enim ut. Interdum velit euismod in pellentesque massa placerat duis ultricies. Vel facilisis volutpat est velit egestas dui id ornare.
Suspendisse faucibus interdum posuere lorem ipsum. In ornare quam viverra orci sagittis. Felis eget velit aliquet sagittis id. Phasellus vestibulum lorem sed risus ultricies tristique nulla aliquet. Mauris augue neque gravida in fermentum et sollicitudin. Neque ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Convallis aenean et tortor at risus. Bibendum est ultricies integer quis auctor elit sed vulputate. Purus sit amet volutpat consequat mauris nunc congue nisi vitae. In nibh mauris cursus mattis molestie a. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Urna condimentum mattis pellentesque id nibh tortor id aliquet. Enim ut sem viverra aliquet eget sit amet. Varius sit amet mattis vulputate. Integer eget aliquet nibh praesent tristique magna sit amet purus. A lacus vestibulum sed arcu non odio euismod lacinia at. Tellus orci ac auctor augue mauris augue neque gravida in. Urna molestie at elementum eu. Euismod lacinia at quis risus. At ultrices mi tempus imperdiet nulla.
Elementum integer enim neque volutpat. Sit amet mattis vulputate enim nulla aliquet porttitor. Accumsan tortor posuere ac ut consequat semper. Gravida rutrum quisque non tellus orci ac. Eget est lorem ipsum dolor. Nibh praesent tristique magna sit. Egestas congue quisque egestas diam in arcu cursus euismod. Sed felis eget velit aliquet sagittis id consectetur purus ut. Bibendum neque egestas congue quisque egestas diam in arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Morbi leo urna molestie at elementum eu facilisis sed odio. Felis bibendum ut tristique et egestas quis ipsum. Ut consequat semper viverra nam. Sem et tortor consequat id. Dolor purus non enim praesent elementum facilisis leo vel fringilla.
Consectetur libero id faucibus nisl tincidunt eget. Rhoncus aenean vel elit scelerisque. Augue ut lectus arcu bibendum at varius vel pharetra. Elementum facilisis leo vel fringilla est ullamcorper eget. Massa tempor nec feugiat nisl pretium fusce id. Dignissim diam quis enim lobortis scelerisque. Amet cursus sit amet dictum sit. Sociis natoque penatibus et magnis dis parturient montes. Turpis cursus in hac habitasse platea dictumst. Bibendum at varius vel pharetra vel turpis. Sollicitudin ac orci phasellus egestas tellus rutrum. Id aliquet risus feugiat in ante metus dictum at tempor. Duis ut diam quam nulla. Accumsan tortor posuere ac ut consequat semper. Orci ac auctor augue mauris augue neque gravida in fermentum. Molestie a iaculis at erat pellentesque adipiscing commodo elit at.
Tellus elementum sagittis vitae et leo duis. Egestas sed tempus urna et. Scelerisque felis imperdiet proin fermentum leo vel orci. Nisl vel pretium lectus quam id leo in. Morbi quis commodo odio aenean sed adipiscing diam donec adipiscing. Dignissim convallis aenean et tortor at risus viverra adipiscing at. Sagittis eu volutpat odio facilisis mauris sit. Mattis aliquam faucibus purus in. Dolor sit amet consectetur adipiscing elit pellentesque habitant morbi. In metus vulputate eu scelerisque felis imperdiet proin. Eu mi bibendum neque egestas congue. Pretium lectus quam id leo in vitae turpis massa sed. Tellus integer feugiat scelerisque varius. Etiam tempor orci eu lobortis elementum nibh tellus. Massa enim nec dui nunc. Nisl pretium fusce id velit ut tortor pretium.
Tortor dignissim convallis aenean et tortor. Urna et pharetra pharetra massa massa ultricies mi quis hendrerit. Dui vivamus arcu felis bibendum ut tristique et. Magna eget est lorem ipsum dolor sit. Justo donec enim diam vulputate ut pharetra sit. Blandit volutpat maecenas volutpat blandit aliquam etiam erat. Sem et tortor consequat id. Enim nunc faucibus a pellentesque sit amet. Facilisis mauris sit amet massa vitae tortor condimentum lacinia quis. Suspendisse ultrices gravida dictum fusce ut. Leo a diam sollicitudin tempor id. Leo a diam sollicitudin tempor id eu nisl. Purus gravida quis blandit turpis cursus in hac. Metus vulputate eu scelerisque felis imperdiet proin fermentum leo vel. Malesuada fames ac turpis egestas integer eget aliquet nibh. Id donec ultrices tincidunt arcu. Nunc faucibus a pellentesque sit amet porttitor. At augue eget arcu dictum varius.
Felis eget velit aliquet sagittis id consectetur. Habitant morbi tristique senectus et netus et malesuada fames ac. Volutpat est velit egestas dui id ornare arcu. Auctor neque vitae tempus quam pellentesque nec nam aliquam. Nisl nisi scelerisque eu ultrices. Viverra nam libero justo laoreet sit amet cursus. Urna condimentum mattis pellentesque id nibh tortor. Pulvinar pellentesque habitant morbi tristique senectus et. Arcu dictum varius duis at consectetur lorem donec massa. Tempus iaculis urna id volutpat lacus laoreet. Nunc sed id semper risus in hendrerit. Praesent tristique magna sit amet purus gravida quis blandit. Lacus laoreet non curabitur gravida arcu ac tortor dignissim. Eget arcu dictum varius duis at consectetur lorem donec. In metus vulputate eu scelerisque felis imperdiet.
Massa tempor nec feugiat nisl pretium fusce id velit ut. Lectus nulla at volutpat diam ut. Amet venenatis urna cursus eget nunc scelerisque viverra mauris. A cras semper auctor neque vitae tempus. Magna eget est lorem ipsum dolor sit amet consectetur adipiscing. A pellentesque sit amet porttitor eget. Eget duis at tellus at urna. Ac turpis egestas maecenas pharetra convallis posuere. Rutrum quisque non tellus orci ac auctor. Quam elementum pulvinar etiam non. Lacus sed viverra tellus in. Sit amet nulla facilisi morbi tempus iaculis urna.
Quam quisque id diam vel quam elementum pulvinar etiam. Est ullamcorper eget nulla facilisi. Porta lorem mollis aliquam ut porttitor leo. Urna duis convallis convallis tellus id interdum velit. Purus viverra accumsan in nisl nisi scelerisque eu. Ultrices eros in cursus turpis massa tincidunt. Leo a diam sollicitudin tempor id eu. Ullamcorper a lacus vestibulum sed arcu. Sem viverra aliquet eget sit amet. Varius morbi enim nunc faucibus a. Bibendum at varius vel pharetra. Augue lacus viverra vitae congue. Dolor sed viverra ipsum nunc aliquet bibendum enim facilisis. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus a.
Consectetur adipiscing elit ut aliquam. Volutpat lacus laoreet non curabitur. Nulla facilisi morbi tempus iaculis urna id volutpat lacus laoreet. Urna nec tincidunt praesent semper feugiat nibh. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Venenatis a condimentum vitae sapien pellentesque. Id donec ultrices tincidunt arcu non sodales neque sodales. Magna sit amet purus gravida quis blandit turpis. Malesuada fames ac turpis egestas. Purus non enim praesent elementum. Interdum consectetur libero id faucibus nisl tincidunt eget nullam. Senectus et netus et malesuada. Nulla malesuada pellentesque elit eget gravida cum sociis. Amet purus gravida quis blandit turpis cursus. Eu turpis egestas pretium aenean pharetra magna.
Mattis vulputate enim nulla aliquet porttitor. Eu feugiat pretium nibh ipsum consequat nisl vel. Lacinia quis vel eros donec ac odio tempor orci dapibus. Sapien faucibus et molestie ac feugiat sed lectus vestibulum. Placerat duis ultricies lacus sed turpis tincidunt id aliquet. Mauris pharetra et ultrices neque ornare aenean euismod elementum nisi. Erat pellentesque adipiscing commodo elit at imperdiet. Leo vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Libero nunc consequat interdum varius. Tristique nulla aliquet enim tortor at. Odio facilisis mauris sit amet massa vitae tortor. Vitae semper quis lectus nulla at volutpat diam ut venenatis. Velit laoreet id donec ultrices tincidunt arcu non sodales neque. Lorem mollis aliquam ut porttitor leo a diam. Lectus arcu bibendum at varius vel pharetra vel.
Risus pretium quam vulputate dignissim. Lacus sed turpis tincidunt id aliquet risus feugiat in. Sollicitudin aliquam ultrices sagittis orci a scelerisque purus semper eget. Vulputate mi sit amet mauris commodo quis imperdiet massa tincidunt. Sit amet mattis vulputate enim nulla aliquet. Ut aliquam purus sit amet luctus. Nunc mattis enim ut tellus elementum sagittis vitae et. Ac ut consequat semper viverra nam libero justo. Et sollicitudin ac orci phasellus. Elit sed vulputate mi sit amet mauris commodo quis imperdiet.
Nunc non blandit massa enim nec dui nunc. Tellus pellentesque eu tincidunt tortor aliquam nulla. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Laoreet non curabitur gravida arcu ac tortor dignissim convallis aenean. Quisque egestas diam in arcu. Amet nisl suscipit adipiscing bibendum. Turpis egestas integer eget aliquet nibh praesent tristique magna. Semper quis lectus nulla at volutpat. Cursus eget nunc scelerisque viverra. Malesuada bibendum arcu vitae elementum curabitur vitae. Faucibus purus in massa tempor nec feugiat nisl pretium. Lorem mollis aliquam ut porttitor leo a. Et netus et malesuada fames ac. Platea dictumst vestibulum rhoncus est pellentesque elit. Erat imperdiet sed euismod nisi porta lorem mollis.
Feugiat in fermentum posuere urna nec tincidunt praesent semper feugiat. Lacus vel facilisis volutpat est velit egestas dui. Pellentesque sit amet porttitor eget dolor morbi non arcu risus. Elit at imperdiet dui accumsan sit amet nulla facilisi. Aliquam id diam maecenas ultricies mi eget mauris. Pellentesque eu tincidunt tortor aliquam nulla facilisi. Amet mattis vulputate enim nulla aliquet. Sollicitudin nibh sit amet commodo nulla facilisi nullam vehicula. Vulputate dignissim suspendisse in est ante in nibh. At ultrices mi tempus imperdiet nulla malesuada pellentesque elit. Ornare arcu dui vivamus arcu felis bibendum ut. Ultrices in iaculis nunc sed augue. Diam vel quam elementum pulvinar etiam. Elit scelerisque mauris pellentesque pulvinar pellentesque. Leo in vitae turpis massa sed. Sed sed risus pretium quam vulputate dignissim suspendisse in est. Orci nulla pellentesque dignissim enim sit amet venenatis. Et leo duis ut diam. Integer feugiat scelerisque varius morbi enim nunc faucibus. Pharetra vel turpis nunc eget lorem dolor sed viverra ipsum.
Elementum pulvinar etiam non quam. Orci nulla pellentesque dignissim enim sit amet. Commodo quis imperdiet massa tincidunt nunc. Mattis vulputate enim nulla aliquet. Eleifend mi in nulla posuere sollicitudin aliquam ultrices sagittis. Purus gravida quis blandit turpis cursus in hac. Morbi tristique senectus et netus et malesuada fames ac turpis. Tellus rutrum tellus pellentesque eu tincidunt tortor. Id semper risus in hendrerit gravida. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Habitant morbi tristique senectus et netus et malesuada fames. In pellentesque massa placerat duis ultricies.
Feugiat vivamus at augue eget arcu dictum varius duis at. In est ante in nibh mauris cursus mattis molestie a. Non diam phasellus vestibulum lorem. Lectus urna duis convallis convallis tellus id interdum velit. Donec massa sapien faucibus et molestie ac feugiat. Pharetra sit amet aliquam id diam maecenas ultricies mi eget. Mauris in aliquam sem fringilla. Molestie at elementum eu facilisis sed odio morbi quis commodo. Neque ornare aenean euismod elementum. Nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. Netus et malesuada fames ac turpis. Eu sem integer vitae justo.
Egestas maecenas pharetra convallis posuere morbi leo urna molestie at. A diam maecenas sed enim ut. Blandit turpis cursus in hac habitasse platea. Id leo in vitae turpis massa sed elementum tempus. Velit euismod in pellentesque massa placerat duis. Congue eu consequat ac felis donec. In eu mi bibendum neque egestas congue quisque. Laoreet id donec ultrices tincidunt arcu. Eu feugiat pretium nibh ipsum consequat nisl vel. Magna etiam tempor orci eu lobortis elementum nibh tellus molestie. Laoreet id donec ultrices tincidunt arcu non sodales neque sodales. Dui accumsan sit amet nulla facilisi morbi tempus. Libero volutpat sed cras ornare arcu dui vivamus. Ac turpis egestas sed tempus urna et pharetra. Congue mauris rhoncus aenean vel. Nibh tortor id aliquet lectus proin nibh nisl. Felis eget nunc lobortis mattis aliquam faucibus purus. Eget velit aliquet sagittis id.
Volutpat ac tincidunt vitae semper quis lectus nulla at. Lorem ipsum dolor sit amet consectetur adipiscing. At lectus urna duis convallis convallis. Lacinia quis vel eros donec ac. Dolor sed viverra ipsum nunc aliquet bibendum. Urna id volutpat lacus laoreet non curabitur gravida arcu. Sociis natoque penatibus et magnis dis parturient. Gravida dictum fusce ut placerat orci. Quis eleifend quam adipiscing vitae proin sagittis nisl. Eu mi bibendum neque egestas. Tristique risus nec feugiat in fermentum posuere. Urna condimentum mattis pellentesque id nibh tortor id aliquet lectus. Purus gravida quis blandit turpis cursus in hac habitasse platea. Interdum consectetur libero id faucibus nisl tincidunt eget. Sed pulvinar proin gravida hendrerit lectus. Amet dictum sit amet justo.
Facilisis mauris sit amet massa vitae tortor condimentum lacinia. Imperdiet nulla malesuada pellentesque elit. Lacus vel facilisis volutpat est velit egestas dui. Nibh praesent tristique magna sit amet purus gravida quis blandit. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Cras sed felis eget velit aliquet sagittis id consectetur purus. In ornare quam viverra orci sagittis eu volutpat. Ultrices gravida dictum fusce ut placerat orci nulla pellentesque dignissim. Senectus et netus et malesuada fames ac turpis. Nisl purus in mollis nunc sed id semper. A diam maecenas sed enim ut. Interdum velit euismod in pellentesque massa placerat duis ultricies. Vel facilisis volutpat est velit egestas dui id ornare.
Suspendisse faucibus interdum posuere lorem ipsum. In ornare quam viverra orci sagittis. Felis eget velit aliquet sagittis id. Phasellus vestibulum lorem sed risus ultricies tristique nulla aliquet. Mauris augue neque gravida in fermentum et sollicitudin. Neque ornare aenean euismod elementum nisi quis eleifend quam adipiscing. Convallis aenean et tortor at risus. Bibendum est ultricies integer quis auctor elit sed vulputate. Purus sit amet volutpat consequat mauris nunc congue nisi vitae. In nibh mauris cursus mattis molestie a. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Urna condimentum mattis pellentesque id nibh tortor id aliquet. Enim ut sem viverra aliquet eget sit amet. Varius sit amet mattis vulputate. Integer eget aliquet nibh praesent tristique magna sit amet purus. A lacus vestibulum sed arcu non odio euismod lacinia at. Tellus orci ac auctor augue mauris augue neque gravida in. Urna molestie at elementum eu. Euismod lacinia at quis risus. At ultrices mi tempus imperdiet nulla.
Elementum integer enim neque volutpat. Sit amet mattis vulputate enim nulla aliquet porttitor. Accumsan tortor posuere ac ut consequat semper. Gravida rutrum quisque non tellus orci ac. Eget est lorem ipsum dolor. Nibh praesent tristique magna sit. Egestas congue quisque egestas diam in arcu cursus euismod. Sed felis eget velit aliquet sagittis id consectetur purus ut. Bibendum neque egestas congue quisque egestas diam in arcu. Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Morbi leo urna molestie at elementum eu facilisis sed odio. Felis bibendum ut tristique et egestas quis ipsum. Ut consequat semper viverra nam. Sem et tortor consequat id. Dolor purus non enim praesent elementum facilisis leo vel fringilla.
Consectetur libero id faucibus nisl tincidunt eget. Rhoncus aenean vel elit scelerisque. Augue ut lectus arcu bibendum at varius vel pharetra. Elementum facilisis leo vel fringilla est ullamcorper eget. Massa tempor nec feugiat nisl pretium fusce id. Dignissim diam quis enim lobortis scelerisque. Amet cursus sit amet dictum sit. Sociis natoque penatibus et magnis dis parturient montes. Turpis cursus in hac habitasse platea dictumst. Bibendum at varius vel pharetra vel turpis. Sollicitudin ac orci phasellus egestas tellus rutrum. Id aliquet risus feugiat in ante metus dictum at tempor. Duis ut diam quam nulla. Accumsan tortor posuere ac ut consequat semper. Orci ac auctor augue mauris augue neque gravida in fermentum. Molestie a iaculis at erat pellentesque adipiscing commodo elit at.
Tellus elementum sagittis vitae et leo duis. Egestas sed tempus urna et. Scelerisque felis imperdiet proin fermentum leo vel orci. Nisl vel pretium lectus quam id leo in. Morbi quis commodo odio aenean sed adipiscing diam donec adipiscing. Dignissim convallis aenean et tortor at risus viverra adipiscing at. Sagittis eu volutpat odio facilisis mauris sit. Mattis aliquam faucibus purus in. Dolor sit amet consectetur adipiscing elit pellentesque habitant morbi. In metus vulputate eu scelerisque felis imperdiet proin. Eu mi bibendum neque egestas congue. Pretium lectus quam id leo in vitae turpis massa sed. Tellus integer feugiat scelerisque varius. Etiam tempor orci eu lobortis elementum nibh tellus. Massa enim nec dui nunc. Nisl pretium fusce id velit ut tortor pretium.

View File

@ -0,0 +1,131 @@
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include "vb.h" //structures
#include "pcode.h"
int lpProcCallEngine = 0;
//examples progress callback (same vb declare as sleep)
void __stdcall callback(int arg){
printf("%d\n",arg);
}
void __stdcall strCallBack(char* arg){
printf("string callback: %s\n",arg);
}
bool FileExists(LPCTSTR szPath)
{
DWORD dwAttrib = GetFileAttributes(szPath);
bool rv = (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) ? true : false;
return rv;
}
int file_length(FILE *f)
{
int pos;
int end;
pos = ftell (f);
fseek (f, 0, SEEK_END);
end = ftell (f);
fseek (f, pos, SEEK_SET);
return end;
}
SAFEARRAY* loadData(void){
FILE *fp;
char* dat = "lorem_ipsum.txt";
//dat = "1mb_lorem_ipsum.bin";
if(!FileExists(dat)){
printf("%s not found\nPress any key to exit...", dat);
getch();
exit(0);
}
fp = fopen(dat, "rb");
if(fp==0){
printf("%s not found\nPress any key to exit...", dat);
getch();
exit(0);
}
int size = file_length(fp);
SAFEARRAY* sa = SafeArrayCreateVector(VT_UI1, 0, size);
if(sa==0){
printf("Could not create safearray sz:%x\nPress any key to exit...", size);
getch();
exit(0);
}
fread(sa->pvData , 1, size, fp);
fclose(fp);
return sa;
}
void main(void){
int rv = 0, i=0;
int abort = 0;
int constPool[20] = {0}; //no const pool needed for the rc4
int lpProjObj[10] = {0};
objInfo.aObject = (int)&codeObj;
objInfo.lpConstantPool = (int)&constPool;
objInfo.aObjectTable = (int)&objtable;
objtable.lpProjectObject = (int)&lpProjObj;
HMODULE hRuntime = (HMODULE)LoadLibrary("msvbvm60.dll");
lpProcCallEngine = (int)GetProcAddress(hRuntime,"ProcCallEngine");
CreateIExprSrvObj IExprSrvObj = (CreateIExprSrvObj)GetProcAddress(hRuntime,"CreateIExprSrvObj");
IExprSrvObj(0,4,0); //initilize runtime enough for most things to work (COM, native pcode handlers etc)
// rc4 - 504 bytes
int offset_rc4 = (int)&rc4 + 0x198;
(*(int*)offset_rc4) = (int)&objInfo;
char* pass = "secret";
SAFEARRAY* data = loadData();
SAFEARRAY* key = SafeArrayCreateVector(VT_UI1, 0, strlen(pass));
memcpy(key->pvData, pass, strlen(pass));
unsigned char* d = (unsigned char*)data->pvData;
printf("start %c%c%c%c%c\n", d[0], d[1], d[2], d[3], d[4]);
//Public Sub rc4(b() As Byte, key() As Byte) - data encrypted in place..
unsigned int startTime = GetTickCount();
for(i = 0; i < 10; i++){
_asm{
//int 3
lea eax, key
push eax
lea eax, data
push eax
mov edx, offset_rc4
mov ecx, lpProcCallEngine
call ecx
}
printf("%2d) %c%c%c%c%c\n", i, d[0], d[1], d[2], d[3], d[4]);
}
unsigned int elapsed = GetTickCount() - startTime;
printf("We ran 504 byte pcode rc4 12 times on 100kb of data/cycle: elapsedTime: %d milliSeconds\n", elapsed);
printf("Press any key to exit...");
getch();
}

View File

@ -0,0 +1,35 @@
unsigned char rc4[] = {
0x00, 0x02, 0x00, 0x05, 0x4B, 0xFF, 0xFF, 0x00, 0x15, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x04, 0x5C,
0xFF, 0xF5, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0x64, 0x48, 0xFF, 0x33, 0x00, 0x00, 0x0D, 0x6C, 0x5C,
0xFF, 0xE4, 0x6C, 0x5C, 0xFF, 0x04, 0x64, 0xFF, 0xA2, 0x00, 0x0A, 0x04, 0x5C, 0xFF, 0x66, 0x48,
0xFF, 0x1C, 0x00, 0x00, 0x0A, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x71, 0x5C, 0xFF, 0x00, 0x0A, 0xF5,
0x00, 0x00, 0x00, 0x00, 0x71, 0x58, 0xFF, 0x00, 0x0A, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x71, 0x54,
0xFF, 0x00, 0x15, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x04, 0x5C, 0xFF, 0xF5, 0xFF, 0x00, 0x00, 0x00,
0xFE, 0x64, 0x40, 0xFF, 0xCD, 0x00, 0x00, 0x2F, 0x6C, 0x58, 0xFF, 0x6C, 0x5C, 0xFF, 0x04, 0x64,
0xFF, 0x9D, 0xE7, 0xAA, 0x6C, 0x5C, 0xFF, 0x80, 0x10, 0x00, 0xF4, 0x01, 0xFC, 0xCB, 0xC2, 0xF5,
0x01, 0x00, 0x00, 0x00, 0xAA, 0x80, 0x10, 0x00, 0xFC, 0x90, 0xE7, 0xAA, 0xF5, 0x00, 0x01, 0x00,
0x00, 0xC2, 0x71, 0x58, 0xFF, 0x00, 0x0F, 0x6C, 0x5C, 0xFF, 0x04, 0x64, 0xFF, 0x9D, 0xFC, 0x0D,
0xFC, 0xF0, 0x52, 0xFF, 0x00, 0x10, 0x6C, 0x58, 0xFF, 0x04, 0x64, 0xFF, 0x9D, 0x6C, 0x5C, 0xFF,
0x04, 0x64, 0xFF, 0xA2, 0x00, 0x0F, 0xFC, 0xE0, 0x52, 0xFF, 0xFC, 0x14, 0x6C, 0x58, 0xFF, 0x04,
0x64, 0xFF, 0xA2, 0x00, 0x0A, 0x04, 0x5C, 0xFF, 0x66, 0x40, 0xFF, 0x66, 0x00, 0x00, 0x0A, 0xF5,
0x00, 0x00, 0x00, 0x00, 0x71, 0x5C, 0xFF, 0x00, 0x0A, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x71, 0x58,
0xFF, 0x00, 0x0A, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x71, 0x54, 0xFF, 0x00, 0x17, 0xF5, 0x00, 0x00,
0x00, 0x00, 0x04, 0x5C, 0xFF, 0x80, 0x0C, 0x00, 0xF4, 0x01, 0xFC, 0xCB, 0xFE, 0x64, 0x38, 0xFF,
0x95, 0x01, 0x00, 0x14, 0x6C, 0x58, 0xFF, 0xF5, 0x01, 0x00, 0x00, 0x00, 0xAA, 0xF5, 0x00, 0x01,
0x00, 0x00, 0xC2, 0x71, 0x58, 0xFF, 0x00, 0x17, 0x6C, 0x54, 0xFF, 0x6C, 0x58, 0xFF, 0x04, 0x64,
0xFF, 0x9D, 0xE7, 0xAA, 0xF5, 0x00, 0x01, 0x00, 0x00, 0xC2, 0x71, 0x54, 0xFF, 0x00, 0x0F, 0x6C,
0x58, 0xFF, 0x04, 0x64, 0xFF, 0x9D, 0xFC, 0x0D, 0xFC, 0xF0, 0x52, 0xFF, 0x00, 0x10, 0x6C, 0x54,
0xFF, 0x04, 0x64, 0xFF, 0x9D, 0x6C, 0x58, 0xFF, 0x04, 0x64, 0xFF, 0xA2, 0x00, 0x0F, 0xFC, 0xE0,
0x52, 0xFF, 0xFC, 0x14, 0x6C, 0x54, 0xFF, 0x04, 0x64, 0xFF, 0xA2, 0x00, 0x30, 0x6C, 0x5C, 0xFF,
0x80, 0x0C, 0x00, 0xFC, 0x90, 0xFC, 0x14, 0x6C, 0x58, 0xFF, 0x04, 0x64, 0xFF, 0x9D, 0x6C, 0x54,
0xFF, 0x04, 0x64, 0xFF, 0x9D, 0xA9, 0xF3, 0x00, 0x01, 0xC1, 0xE7, 0x04, 0x64, 0xFF, 0x9D, 0xFB,
0x12, 0xFC, 0x0D, 0x6C, 0x5C, 0xFF, 0x80, 0x0C, 0x00, 0xFC, 0xA0, 0x00, 0x0A, 0x04, 0x5C, 0xFF,
0x66, 0x38, 0xFF, 0x02, 0x01, 0x00, 0x00, 0x14, 0x74, 0x10, 0x40, 0x00, 0x0C, 0x00, 0x44, 0x00,
0x98, 0x01, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
0x38, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0xFF, 0x05, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x92, 0x00,
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC
};

View File

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psc", "psc.vcproj", "{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.ActiveCfg = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.Build.0 = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.ActiveCfg = Release|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,185 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="psc"
ProjectGUID="{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
RootNamespace="psc"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="test.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="./test.exe"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath=".\main.cpp"
>
</File>
<File
RelativePath=".\pcode.h"
>
</File>
<File
RelativePath=".\vb.h"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -0,0 +1,93 @@
Attribute VB_Name = "Module1"
'this is a sample to test ripping a decoder with variant types from a malware to reuse it from C
Public Declare Sub cb Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare Sub scb Lib "kernel32" (ByVal msg As String)
Sub Main()
Dim tmp As String
tmp = rc4("AAAA", Chr(&H41), True)
'InputBox "", , Hex(StrPtr(tmp)) 'this is how i extracted the encrypted value from memory...
scb CStr(rc4(tmp, Chr(&H41), True)) 'replace this with a msgbox if testing in IDE
End Sub
Public Function rc4(ByteOrString As Variant, ByVal password As String, strret As Boolean)
On Error Resume Next
Dim RB(0 To 255) As Integer, X As Long, Y As Long, Z As Long, key() As Byte, temp As Byte
Dim byteArray() As Byte
Dim plen As Long
Const LANG_US = &H409
If TypeName(ByteOrString) = "Byte()" Then
byteArray() = ByteOrString
cb 1
ElseIf TypeName(ByteOrString) = "String" Then
byteArray() = StrConv(ByteOrString, vbFromUnicode, LANG_US)
cb 2
Else
cb -1
Exit Function
End If
If TypeName(password) = "Byte()" Then
key() = password
If UBound(key) > 255 Then ReDim Preserve key(255)
cb 3
Else
If Len(password) = 0 Then
cb -2
Exit Function
End If
If Len(password) > 256 Then
key() = StrConv(Left$(CStr(password), 256), vbFromUnicode, LANG_US)
Else
key() = StrConv(CStr(password), vbFromUnicode, LANG_US)
End If
cb 4
End If
plen = UBound(key) + 1
cb 6
'Debug.Print "key=" & HexDump(Key)
'Debug.Print "data=" & HexDump(ByteArray)
For X = 0 To 255
RB(X) = X
Next X
X = 0
Y = 0
Z = 0
For X = 0 To 255
Y = (Y + RB(X) + key(X Mod plen)) Mod 256
temp = RB(X)
RB(X) = RB(Y)
RB(Y) = temp
Next X
X = 0
Y = 0
Z = 0
For X = 0 To UBound(byteArray)
Y = (Y + 1) Mod 256
Z = (Z + RB(Y)) Mod 256
temp = RB(Y)
RB(Y) = RB(Z)
RB(Z) = temp
byteArray(X) = byteArray(X) Xor (RB((RB(Y) + RB(Z)) Mod 256))
Next X
If strret Then
cb 7
rc4 = StrConv(byteArray, vbUnicode, LANG_US)
Else
cb 8
rc4 = byteArray
End If
End Function

View File

@ -0,0 +1,33 @@
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\..\Windows\SysWOW64\stdole2.tlb#OLE Automation
Module=Module1; Module1.bas
Startup="Sub Main"
HelpFile=""
ExeName32="decoder.exe"
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=-1
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
[fastBuild]
fullPath=%ap%\decoder.exe

View File

@ -0,0 +1 @@
Module1 = 68, 20, 1378, 940,

View File

@ -0,0 +1,65 @@
struct ObjectTable{
int lNull1; // As Long ' 0x00 (00d)
int aExecProj; // As Long ' 0x04 (04d) Pointer to a memory structure
int aProjectInfo2; // As Long ' 0x08 (08d) Pointer to Project Info 2
int Const1; // As Long ' 0x0C
int Null2; // As Long ' 0x10
int lpProjectObject; // As Long ' 0x14
char uuidObj[15]; // As Byte 'converted from 4 flags dzzie (from vb.idc)
short fCompileType; // As Integer ' 0x28 (40d) Internal flag used during compilation
short ObjectCount1; // As Integer ' 0x2A
short iCompiledObjects; // As Integer ' 0x2C (44d) Number of objects compiled.
short iObjectsInUse; // As Integer ' 0x2E (46d) Updated in the IDE to correspond the total number ' but will go up or down when initializing/unloading modules.
int lpObjectArray; // As Long ' 0x30
int fIdeFlag; // As Long ' 0x34
int lpIdeData; // As Long ' 0x38
int lpIdeData2; // As Long ' 0x3C
int aProjectName; // As Long ' 0x40 NTS
int LangID1; // As Long ' 0x44
int LangID2; // As Long ' 0x48
int lpIdeData3; // As Long ' 0x4C
int dwIdentifier; // As Long ' 0x50
};
struct CodeObject{
int aObjectInfo; // As Long ' 0x00 Pointer to the Object Info for this Object.
int Const1; // As Long ' 0x04 Always set to -1 after compiling.
int aPublicBytes; // As Long ' 0x08 Pointer to Public Variable Size integers
int aStaticBytes; // As Long ' 0x0C Pointer to Static Variables Struct
int aModulePublic; // As Long ' 0x10 Pointer to Public Variables in DATA section
int aModuleStatic; // As Long ' 0x14 Pointer to Static Variables in DATA section
int aObjectName; // As Long ' 0x18 Name of the Object.
int ProcCount; // As Long ' 0x1C Number of Methods in Object
int aProcNamesArray;// As Long ' 0x20 If present, pointer to Method names array.
int oStaticVars; // As Long ' 0x24 Offset to Static Vars from aModuleStatic
int ObjectType; // As Long ' 0x28 Flags defining the Object Type.
int Null3; // As Long ' 0x2C Not valid after compilation.
};
struct ObjectInfo{
short wRefCount; // 0 As Integer ' Always 1 after compilation.
short ObjectIndex; // 2 As Integer '
int aObjectTable; // 4 As Long ' Pointer to the Object Table
int lpIdeData; // 8 Long ' Zero after compilation. Used in IDE only.
int lpPrivateObject; // 0xC As Long ' Pointer to Private Object Descriptor.
int dwReserved; // 0x10 As Long
int Null2; // 0x14 As Long
int aObject; // 0x18 As Long ' points to the parent tObject
int lpProjectData; // 0x1c As Long ' 0x1C [can someone verify this?]
short NumberOfProcs; // 0x20 As Integer
short wMethodCount2; // 0x22 As Integer ' Zeroed out after compilation. IDE only.
int lpMethods; // 0x24 As Long ' Pointer to Array of Methods.
short iConstantsCount; // 0x28 As Integer ' Number of Constants
short iMaxConstants; // 0x2A As Integer ' Maximum Constants to allocate.
int lpIdeData2; // 0x2C As Long
int lpIdeData3; // 0x30 As Long
int lpConstantPool; // 0x34 As Long 'can be immediatly followed by OptionalObjectInfo
};
ObjectTable objtable = {0};
CodeObject codeObj = {0};
ObjectInfo objInfo = {0};
typedef void (__stdcall *CreateIExprSrvObj)(int,int,int);

View File

@ -0,0 +1 @@
Replicates ripping a decryption function from a malware and reusing it on our own from a C host with our own data.

View File

@ -0,0 +1,168 @@
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include "vb.h" //structures
#include "pcode.h"
int lpProcCallEngine = 0;
//examples progress callback (same vb declare as sleep)
void __stdcall callback(int arg){
printf("%d\n",arg);
}
void __stdcall strCallBack(char* arg){
printf("string callback: %s\n",arg);
}
//get a temp pointer to p + xBytes without casts or pointer arithmetic
int* pPlus(int * p, int increment){
_asm{
mov eax, p
add eax, increment
}
}
int initExtendedTLS(HMODULE hRuntime){
//vb file access however requires Ebthread+18 to point to valid alloc that doesnt happen with IExprSrvObj initilization..
//we dont really need this if we use C callbacks...only use this if really necessary since it adds complexity
//we get its tls index offset from the start of the rtcGetErl export...
//.text:660EA58E FF 35 00 00 11 66 push _g_itlsEbthread
int* lpRtcErl = (int*)GetProcAddress(hRuntime,"rtcGetErl");
if(lpRtcErl==0) return -1;
short p = (short)(*lpRtcErl);
if (p != 0x35FF) return -2; //Check rtcGetErl for push opcode failed
int* tlsEbthread = (int*)*(pPlus(lpRtcErl,2)); //address of tls slot variable
int* tlsMem = (int*)TlsGetValue(*tlsEbthread); //slot value -> actual memory alloc
if ( tlsMem == 0 ) return -3; //TlsGetValue(*g_itlsEbthread) failed
int buf = (int)malloc(80);
if(buf==0) return -4;
memset((void*)buf,0,80); //MUST be zeroed out
//printf("tlsMem = %x dummy=%x\n", tlsMem, buf);
//printf("tlsMem + 0x18 = %x\n", (char*)tlsMem + 0x18);
//_asm int 3
*pPlus(tlsMem,0x18) = buf; //fill in this field of struct with our own alloced memory
return 1;
}
int offset_rc4;
void __declspec(naked) stubCall_rc4(){
_asm{
//int 3
mov edx, offset_rc4
mov ecx, lpProcCallEngine
jmp ecx
}
}
void main(void){
int rv = 0;
int abort = 0;
int constPool[20] = {0};
int lpProjObj[10] = {0};
objInfo.aObject = (int)&codeObj;
objInfo.lpConstantPool = (int)&constPool;
objInfo.aObjectTable = (int)&objtable;
objtable.lpProjectObject = (int)&lpProjObj;
/*some debugging values
printf("objtable = %x\n", &objtable);
printf("lpProjObj = %x\n", &lpProjObj);
printf("constPool = %x\n", &constPool);
printf("pcode = %x - %x\n", &pcode, &pcode + sizeof(pcode));
printf("abort addr: %x\n", (int)&abort);*/
HMODULE hRuntime = (HMODULE)LoadLibrary("msvbvm60.dll");
lpProcCallEngine = (int)GetProcAddress(hRuntime,"ProcCallEngine");
CreateIExprSrvObj IExprSrvObj = (CreateIExprSrvObj)GetProcAddress(hRuntime,"CreateIExprSrvObj");
IExprSrvObj(0,4,0); //initilize runtime enough for most things to work (COM, native pcode handlers etc)
//do you need access to native vb file access functions or vb msgbox? (C callbacks cleaner)
/*if(initExtendedTLS(hRuntime) != 1){
printf("initExtendedTLS failed...");
return;
}*/
//build the const pool
constPool[0x0] = (int)GetProcAddress(hRuntime,"rtcVarBstrFromAnsi");
constPool[0x1] = (int)SysAllocString(L"AAAA");
constPool[0x2] = (int)&stubCall_rc4; //Module1.Proc_4015EC
constPool[0x3] = (int)&strCallBack;
constPool[0x4] = (int)GetProcAddress(hRuntime,"rtcTypeName");
constPool[0x5] = (int)SysAllocString(L"Byte()");
constPool[0x6] = (int)&callback;
constPool[0x7] = (int)SysAllocString(L"String");
constPool[0x8] = (int)GetProcAddress(hRuntime,"rtcStrConvVar2");
constPool[0x9] = (int)GetProcAddress(hRuntime,"rtcLeftCharBstr");
offset_rc4 = (int)&rc4 + 0x3e4;
(*(int*)offset_rc4) = (int)&objInfo;
int offset_sub_main = (int)&sub_main + 0x90;
(*(int*)offset_sub_main) = (int)&objInfo;
/* full run tested & working..
_asm{
//int 3
mov edx, offset_sub_main
mov ecx, lpProcCallEngine
call ecx
mov rv, eax
}
*/
//now lets call the rc4 function on our own
/*
Public Function rc4(ByteOrString As Variant, ByVal password As String, strret As Boolean) as variant
0019FC58 ebp-E8 0x0019FC70 ; ebp-D0 = empty variant (retval)
0019FC5C ebp-E4 0x0019FC88 ; ebp-B8 = variant bstr aaaa
0019FC60 ebp-E0 0x00794DEC = 0x41
0019FC64 ebp-DC 0x0019FC82 ; ebp-BE = -1
*/
VARIANT retVal = {VT_EMPTY};
VARIANT v = {VT_EMPTY};
v.vt = VT_BSTR;
v.bstrVal = SysAllocStringByteLen("\x92\x01\x60\x01\xA7\x00\x7C\x00",8);
BSTR passwd = SysAllocString(L"A");
int boolStrRet = -1; //vb true
_asm{
//int 3
lea eax, boolStrRet
push eax
push passwd
lea eax, v
push eax
lea eax, retVal
push eax
mov edx, offset_rc4
mov ecx, lpProcCallEngine
call ecx
}
printf("retval.vt = %x\n", retVal.vt);
wprintf(L"retval.bstr = %s\n", retVal.bstrVal);
printf("Press any key to exit...");
getch();
}

View File

@ -0,0 +1,91 @@
unsigned char sub_main[] = {
0xF5, 0x41, 0x00, 0x00, 0x00, 0x04, 0x68, 0xFF, 0x0A, 0x00, 0x00, 0x08, 0x00, 0xF4, 0xFF, 0x2B,
0x42, 0xFF, 0x04, 0x68, 0xFF, 0xFD, 0xFE, 0x44, 0xFF, 0x3A, 0x58, 0xFF, 0x01, 0x00, 0x4E, 0x48,
0xFF, 0x04, 0x48, 0xFF, 0x04, 0x30, 0xFF, 0x0A, 0x02, 0x00, 0x10, 0x00, 0x04, 0x30, 0xFF, 0x60,
0x31, 0x78, 0xFF, 0x2F, 0x44, 0xFF, 0x36, 0x06, 0x00, 0x48, 0xFF, 0x68, 0xFF, 0x30, 0xFF, 0xF5,
0x41, 0x00, 0x00, 0x00, 0x04, 0x68, 0xFF, 0x0A, 0x00, 0x00, 0x08, 0x00, 0xF4, 0xFF, 0x2B, 0x42,
0xFF, 0x04, 0x68, 0xFF, 0xFD, 0xFE, 0x44, 0xFF, 0x04, 0x78, 0xFF, 0x4D, 0x58, 0xFF, 0x08, 0x40,
0x04, 0x48, 0xFF, 0x0A, 0x02, 0x00, 0x10, 0x00, 0x04, 0x48, 0xFF, 0xFC, 0x4B, 0x23, 0x2C, 0xFF,
0x04, 0x28, 0xFF, 0x34, 0x6C, 0x28, 0xFF, 0x0A, 0x03, 0x00, 0x04, 0x00, 0x3C, 0x32, 0x06, 0x00,
0x44, 0xFF, 0x2C, 0xFF, 0x28, 0xFF, 0x36, 0x06, 0x00, 0x68, 0xFF, 0x48, 0xFF, 0x48, 0xFF, 0x14,
0xC0, 0x10, 0x40, 0x00, 0x04, 0x00, 0x54, 0x00, 0x90, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x78, 0xFF, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
0x00, 0x00, 0x00, 0x00, 0x44, 0xFF, 0x01, 0x00, 0x2C, 0xFF, 0x01, 0x00, 0x28, 0xFF, 0x01, 0x00,
0x68, 0xFF, 0x02, 0x00, 0x48, 0xFF, 0x02, 0x00, 0x30, 0xFF, 0x02, 0x00, 0x00, 0x08, 0x6C, 0x14,
0x00, 0x43, 0x68, 0xFF, 0x00, 0x05, 0x4B, 0xFF, 0xFF, 0x00, 0x18, 0x6C, 0x10, 0x00, 0x0B, 0x04
};
unsigned char rc4[] = {
0x00, 0x08, 0x6C, 0x14, 0x00, 0x43, 0x68, 0xFF, 0x00, 0x05, 0x4B, 0xFF, 0xFF, 0x00, 0x18, 0x6C,
0x10, 0x00, 0x0B, 0x04, 0x00, 0x04, 0x00, 0x23, 0x2C, 0xFF, 0x1B, 0x05, 0x00, 0xFB, 0x30, 0x2F,
0x2C, 0xFF, 0x1C, 0x49, 0x00, 0x00, 0x14, 0xFD, 0x16, 0x10, 0x00, 0x1C, 0xFF, 0xFC, 0x60, 0x18,
0xFF, 0x04, 0x18, 0xFF, 0x04, 0x34, 0xFF, 0xFF, 0x01, 0x00, 0x0D, 0xF5, 0x01, 0x00, 0x00, 0x00,
0x0A, 0x06, 0x00, 0x04, 0x00, 0x3C, 0x1E, 0xAF, 0x00, 0x00, 0x18, 0x6C, 0x10, 0x00, 0x0B, 0x04,
0x00, 0x04, 0x00, 0x23, 0x2C, 0xFF, 0x1B, 0x07, 0x00, 0xFB, 0x30, 0x2F, 0x2C, 0xFF, 0x1C, 0x9A,
0x00, 0x00, 0x29, 0xF5, 0x09, 0x04, 0x00, 0x00, 0xF5, 0x80, 0x00, 0x00, 0x00, 0x6C, 0x10, 0x00,
0x04, 0x08, 0xFF, 0x0A, 0x08, 0x00, 0x10, 0x00, 0x04, 0x08, 0xFF, 0xFC, 0x60, 0x18, 0xFF, 0x04,
0x18, 0xFF, 0x04, 0x34, 0xFF, 0xFF, 0x01, 0x35, 0x08, 0xFF, 0x00, 0x0D, 0xF5, 0x02, 0x00, 0x00,
0x00, 0x0A, 0x06, 0x00, 0x04, 0x00, 0x3C, 0x1E, 0xAF, 0x00, 0x00, 0x02, 0x00, 0x0D, 0xF5, 0xFF,
0xFF, 0xFF, 0xFF, 0x0A, 0x06, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x06, 0xFD, 0x95, 0x10, 0x00, 0x00,
0x02, 0x00, 0x1D, 0x04, 0x68, 0xFF, 0x4D, 0x1C, 0xFF, 0x08, 0x40, 0x0B, 0x04, 0x00, 0x04, 0x00,
0x23, 0x2C, 0xFF, 0x1B, 0x05, 0x00, 0xFB, 0x30, 0x2F, 0x2C, 0xFF, 0x1C, 0x1A, 0x01, 0x00, 0x11,
0x6C, 0x68, 0xFF, 0xFC, 0x5F, 0x18, 0xFF, 0x04, 0x18, 0xFF, 0x04, 0x3C, 0xFF, 0xFF, 0x01, 0x00,
0x12, 0x6C, 0x3C, 0xFF, 0xF4, 0x01, 0xFC, 0xCB, 0xF5, 0xFF, 0x00, 0x00, 0x00, 0xDB, 0x1C, 0x0A,
0x01, 0x00, 0x19, 0xF5, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xFF, 0x00, 0x00, 0x00, 0x04, 0x3C, 0xFF,
0xFE, 0x8F, 0x01, 0x00, 0x11, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x0D, 0xF5, 0x03, 0x00, 0x00,
0x00, 0x0A, 0x06, 0x00, 0x04, 0x00, 0x3C, 0x1E, 0xDC, 0x01, 0x00, 0x02, 0x00, 0x0F, 0x6C, 0x68,
0xFF, 0x4A, 0xF5, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x1C, 0x3E, 0x01, 0x00, 0x0D, 0xF5, 0xFE, 0xFF,
0xFF, 0xFF, 0x0A, 0x06, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x06, 0xFD, 0x95, 0x10, 0x00, 0x00, 0x02,
0x00, 0x0F, 0x6C, 0x68, 0xFF, 0x4A, 0xF5, 0x00, 0x01, 0x00, 0x00, 0xDB, 0x1C, 0x95, 0x01, 0x00,
0x43, 0xF5, 0x00, 0x01, 0x00, 0x00, 0x6C, 0x68, 0xFF, 0x0B, 0x09, 0x00, 0x08, 0x00, 0x31, 0x2C,
0xFF, 0xF5, 0x09, 0x04, 0x00, 0x00, 0xF5, 0x80, 0x00, 0x00, 0x00, 0x3E, 0x2C, 0xFF, 0x46, 0x08,
0xFF, 0x04, 0xF8, 0xFE, 0x0A, 0x08, 0x00, 0x10, 0x00, 0x04, 0xF8, 0xFE, 0xFC, 0x60, 0x18, 0xFF,
0x04, 0x18, 0xFF, 0x04, 0x3C, 0xFF, 0xFF, 0x01, 0x2F, 0x2C, 0xFF, 0x36, 0x04, 0x00, 0x08, 0xFF,
0xF8, 0xFE, 0x1E, 0xCD, 0x01, 0x00, 0x02, 0x00, 0x36, 0xF5, 0x09, 0x04, 0x00, 0x00, 0xF5, 0x80,
0x00, 0x00, 0x00, 0x6C, 0x68, 0xFF, 0x46, 0x1C, 0xFF, 0x4E, 0x08, 0xFF, 0x04, 0x08, 0xFF, 0x04,
0xF8, 0xFE, 0x0A, 0x08, 0x00, 0x10, 0x00, 0x04, 0xF8, 0xFE, 0xFC, 0x60, 0x18, 0xFF, 0x04, 0x18,
0xFF, 0x04, 0x3C, 0xFF, 0xFF, 0x01, 0x36, 0x04, 0x00, 0x08, 0xFF, 0xF8, 0xFE, 0x00, 0x02, 0x00,
0x0D, 0xF5, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x02, 0x00, 0x12,
0x6C, 0x3C, 0xFF, 0xF4, 0x01, 0xFC, 0xCB, 0xF5, 0x01, 0x00, 0x00, 0x00, 0xAA, 0x71, 0x30, 0xFF,
0x00, 0x0D, 0xF5, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x15, 0xF5,
0x00, 0x00, 0x00, 0x00, 0x04, 0x48, 0xFF, 0xF5, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0x64, 0xF0, 0xFE,
0x29, 0x02, 0x00, 0x0D, 0x6C, 0x48, 0xFF, 0xE4, 0x6C, 0x48, 0xFF, 0x04, 0x50, 0xFF, 0xA2, 0x00,
0x0A, 0x04, 0x48, 0xFF, 0x66, 0xF0, 0xFE, 0x12, 0x02, 0x00, 0x0A, 0xF5, 0x00, 0x00, 0x00, 0x00,
0x71, 0x48, 0xFF, 0x00, 0x0A, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x71, 0x44, 0xFF, 0x00, 0x0A, 0xF5,
0x00, 0x00, 0x00, 0x00, 0x71, 0x40, 0xFF, 0x00, 0x15, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x04, 0x48,
0xFF, 0xF5, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0x64, 0xE8, 0xFE, 0xB9, 0x02, 0x00, 0x25, 0x6C, 0x44,
0xFF, 0x6C, 0x48, 0xFF, 0x04, 0x50, 0xFF, 0x9D, 0xE7, 0xAA, 0x6C, 0x48, 0xFF, 0x6C, 0x30, 0xFF,
0xC2, 0x6C, 0x3C, 0xFF, 0xFC, 0x90, 0xE7, 0xAA, 0xF5, 0x00, 0x01, 0x00, 0x00, 0xC2, 0x71, 0x44,
0xFF, 0x00, 0x0F, 0x6C, 0x48, 0xFF, 0x04, 0x50, 0xFF, 0x9D, 0xFC, 0x0D, 0xFC, 0xF0, 0x3A, 0xFF,
0x00, 0x10, 0x6C, 0x44, 0xFF, 0x04, 0x50, 0xFF, 0x9D, 0x6C, 0x48, 0xFF, 0x04, 0x50, 0xFF, 0xA2,
0x00, 0x0F, 0xFC, 0xE0, 0x3A, 0xFF, 0xFC, 0x14, 0x6C, 0x44, 0xFF, 0x04, 0x50, 0xFF, 0xA2, 0x00,
0x0A, 0x04, 0x48, 0xFF, 0x66, 0xE8, 0xFE, 0x5C, 0x02, 0x00, 0x0A, 0xF5, 0x00, 0x00, 0x00, 0x00,
0x71, 0x48, 0xFF, 0x00, 0x0A, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x71, 0x44, 0xFF, 0x00, 0x0A, 0xF5,
0x00, 0x00, 0x00, 0x00, 0x71, 0x40, 0xFF, 0x00, 0x17, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x04, 0x48,
0xFF, 0x6C, 0x34, 0xFF, 0xF4, 0x01, 0xFC, 0xCB, 0xFE, 0x64, 0xE0, 0xFE, 0x81, 0x03, 0x00, 0x14,
0x6C, 0x44, 0xFF, 0xF5, 0x01, 0x00, 0x00, 0x00, 0xAA, 0xF5, 0x00, 0x01, 0x00, 0x00, 0xC2, 0x71,
0x44, 0xFF, 0x00, 0x17, 0x6C, 0x40, 0xFF, 0x6C, 0x44, 0xFF, 0x04, 0x50, 0xFF, 0x9D, 0xE7, 0xAA,
0xF5, 0x00, 0x01, 0x00, 0x00, 0xC2, 0x71, 0x40, 0xFF, 0x00, 0x0F, 0x6C, 0x44, 0xFF, 0x04, 0x50,
0xFF, 0x9D, 0xFC, 0x0D, 0xFC, 0xF0, 0x3A, 0xFF, 0x00, 0x10, 0x6C, 0x40, 0xFF, 0x04, 0x50, 0xFF,
0x9D, 0x6C, 0x44, 0xFF, 0x04, 0x50, 0xFF, 0xA2, 0x00, 0x0F, 0xFC, 0xE0, 0x3A, 0xFF, 0xFC, 0x14,
0x6C, 0x40, 0xFF, 0x04, 0x50, 0xFF, 0xA2, 0x00, 0x30, 0x6C, 0x48, 0xFF, 0x6C, 0x34, 0xFF, 0xFC,
0x90, 0xFC, 0x14, 0x6C, 0x44, 0xFF, 0x04, 0x50, 0xFF, 0x9D, 0x6C, 0x40, 0xFF, 0x04, 0x50, 0xFF,
0x9D, 0xA9, 0xF3, 0x00, 0x01, 0xC1, 0xE7, 0x04, 0x50, 0xFF, 0x9D, 0xFB, 0x12, 0xFC, 0x0D, 0x6C,
0x48, 0xFF, 0x6C, 0x34, 0xFF, 0xFC, 0xA0, 0x00, 0x0A, 0x04, 0x48, 0xFF, 0x66, 0xE0, 0xFE, 0xEE,
0x02, 0x00, 0x08, 0x7F, 0x18, 0x00, 0x1C, 0xBC, 0x03, 0x00, 0x0D, 0xF5, 0x07, 0x00, 0x00, 0x00,
0x0A, 0x06, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x23, 0xF5, 0x09, 0x04, 0x00, 0x00, 0xF5, 0x40, 0x00,
0x00, 0x00, 0x04, 0x34, 0xFF, 0x4D, 0x1C, 0xFF, 0x11, 0x60, 0x04, 0x08, 0xFF, 0x0A, 0x08, 0x00,
0x10, 0x00, 0x04, 0x08, 0xFF, 0xFC, 0xF6, 0x6C, 0xFF, 0x1E, 0xD9, 0x03, 0x00, 0x02, 0x00, 0x0D,
0xF5, 0x08, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x0E, 0x6C, 0x34, 0xFF,
0x4D, 0x1C, 0xFF, 0x11, 0x20, 0xFD, 0x00, 0x6C, 0xFF, 0x00, 0x02, 0x00, 0x00, 0xFD, 0x95, 0x10,
0x00, 0xF0, 0xF0, 0xF0, 0xC0, 0x10, 0x40, 0x00, 0x14, 0x00, 0x9C, 0x00, 0xE4, 0x03, 0x6C, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00,
0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6C, 0xFF, 0x02, 0x00, 0x68, 0xFF, 0x01, 0x00,
0x50, 0xFF, 0x05, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
0x01, 0x00, 0x92, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xF0, 0xF0, 0x34, 0xFF, 0x05, 0x01,
0xF0, 0xF0, 0xF0, 0xF0
};

View File

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psc", "psc.vcproj", "{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.ActiveCfg = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.Build.0 = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.ActiveCfg = Release|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,184 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="psc"
ProjectGUID="{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
RootNamespace="psc"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="test.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath=".\main.cpp"
>
</File>
<File
RelativePath=".\pcode.h"
>
</File>
<File
RelativePath=".\vb.h"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -0,0 +1,98 @@
Attribute VB_Name = "Module1"
'this is a sample to test ripping a decoder with variant types from a malware to reuse it from C
Public Declare Sub cb Lib "dummy" (ByVal dwMilliseconds As Long)
Public Declare Sub scb Lib "dummy" (ByVal msg As String)
Sub Main()
'main is for debugging and so we can breakpoint on the call to rc4 and examine the stack to get an example of
'the exact args we need to call it from a c host successfully.
'you could also probably compile to native with debug symbols on and the stack is probably the same..havent verified though
'in pcode the bp would be ImpAdCallFPR4 opcode A0 i think it was. Look at the disasm in vbrip.
Dim tmp As String
tmp = rc4("AAAA", Chr(&H41), True)
'InputBox "", , Hex(StrPtr(tmp)) 'this is how i extracted the encrypted value from memory...
scb CStr(rc4(tmp, Chr(&H41), True)) 'replace this with a msgbox if testing in IDE
End Sub
'remember all args are byref by default.
'If type is not specified its a variant.
'if no return value type is specified, its a variant.
Public Function rc4(ByteOrString As Variant, ByVal password As String, strret As Boolean)
On Error Resume Next
Dim RB(0 To 255) As Integer, X As Long, Y As Long, Z As Long, key() As Byte, temp As Byte
Dim byteArray() As Byte
Dim plen As Long
Const LANG_US = &H409
If TypeName(ByteOrString) = "Byte()" Then
byteArray() = ByteOrString
cb 1
ElseIf TypeName(ByteOrString) = "String" Then
byteArray() = StrConv(ByteOrString, vbFromUnicode, LANG_US)
cb 2
Else
cb -1
Exit Function
End If
If TypeName(password) = "Byte()" Then
key() = password
If UBound(key) > 255 Then ReDim Preserve key(255)
cb 3
Else
If Len(password) = 0 Then
cb -2
Exit Function
End If
If Len(password) > 256 Then
key() = StrConv(Left$(CStr(password), 256), vbFromUnicode, LANG_US)
Else
key() = StrConv(CStr(password), vbFromUnicode, LANG_US)
End If
cb 4
End If
plen = UBound(key) + 1
cb 6
'Debug.Print "key=" & HexDump(Key)
'Debug.Print "data=" & HexDump(ByteArray)
For X = 0 To 255
RB(X) = X
Next X
X = 0
Y = 0
Z = 0
For X = 0 To 255
Y = (Y + RB(X) + key(X Mod plen)) Mod 256
temp = RB(X)
RB(X) = RB(Y)
RB(Y) = temp
Next X
X = 0
Y = 0
Z = 0
For X = 0 To UBound(byteArray)
Y = (Y + 1) Mod 256
Z = (Z + RB(Y)) Mod 256
temp = RB(Y)
RB(Y) = RB(Z)
RB(Z) = temp
byteArray(X) = byteArray(X) Xor (RB((RB(Y) + RB(Z)) Mod 256))
Next X
If strret Then
cb 7
rc4 = StrConv(byteArray, vbUnicode, LANG_US)
Else
cb 8
rc4 = byteArray
End If
End Function

View File

@ -0,0 +1,33 @@
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\..\Windows\SysWOW64\stdole2.tlb#OLE Automation
Module=Module1; Module1.bas
Startup="Sub Main"
HelpFile=""
ExeName32="decoder.exe"
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=-1
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
[fastBuild]
fullPath=%ap%\decoder.exe

View File

@ -0,0 +1 @@
Module1 = 68, 20, 1378, 940,

View File

@ -0,0 +1,65 @@
struct ObjectTable{
int lNull1; // As Long ' 0x00 (00d)
int aExecProj; // As Long ' 0x04 (04d) Pointer to a memory structure
int aProjectInfo2; // As Long ' 0x08 (08d) Pointer to Project Info 2
int Const1; // As Long ' 0x0C
int Null2; // As Long ' 0x10
int lpProjectObject; // As Long ' 0x14
char uuidObj[15]; // As Byte 'converted from 4 flags dzzie (from vb.idc)
short fCompileType; // As Integer ' 0x28 (40d) Internal flag used during compilation
short ObjectCount1; // As Integer ' 0x2A
short iCompiledObjects; // As Integer ' 0x2C (44d) Number of objects compiled.
short iObjectsInUse; // As Integer ' 0x2E (46d) Updated in the IDE to correspond the total number ' but will go up or down when initializing/unloading modules.
int lpObjectArray; // As Long ' 0x30
int fIdeFlag; // As Long ' 0x34
int lpIdeData; // As Long ' 0x38
int lpIdeData2; // As Long ' 0x3C
int aProjectName; // As Long ' 0x40 NTS
int LangID1; // As Long ' 0x44
int LangID2; // As Long ' 0x48
int lpIdeData3; // As Long ' 0x4C
int dwIdentifier; // As Long ' 0x50
};
struct CodeObject{
int aObjectInfo; // As Long ' 0x00 Pointer to the Object Info for this Object.
int Const1; // As Long ' 0x04 Always set to -1 after compiling.
int aPublicBytes; // As Long ' 0x08 Pointer to Public Variable Size integers
int aStaticBytes; // As Long ' 0x0C Pointer to Static Variables Struct
int aModulePublic; // As Long ' 0x10 Pointer to Public Variables in DATA section
int aModuleStatic; // As Long ' 0x14 Pointer to Static Variables in DATA section
int aObjectName; // As Long ' 0x18 Name of the Object.
int ProcCount; // As Long ' 0x1C Number of Methods in Object
int aProcNamesArray;// As Long ' 0x20 If present, pointer to Method names array.
int oStaticVars; // As Long ' 0x24 Offset to Static Vars from aModuleStatic
int ObjectType; // As Long ' 0x28 Flags defining the Object Type.
int Null3; // As Long ' 0x2C Not valid after compilation.
};
struct ObjectInfo{
short wRefCount; // 0 As Integer ' Always 1 after compilation.
short ObjectIndex; // 2 As Integer '
int aObjectTable; // 4 As Long ' Pointer to the Object Table
int lpIdeData; // 8 Long ' Zero after compilation. Used in IDE only.
int lpPrivateObject; // 0xC As Long ' Pointer to Private Object Descriptor.
int dwReserved; // 0x10 As Long
int Null2; // 0x14 As Long
int aObject; // 0x18 As Long ' points to the parent tObject
int lpProjectData; // 0x1c As Long ' 0x1C [can someone verify this?]
short NumberOfProcs; // 0x20 As Integer
short wMethodCount2; // 0x22 As Integer ' Zeroed out after compilation. IDE only.
int lpMethods; // 0x24 As Long ' Pointer to Array of Methods.
short iConstantsCount; // 0x28 As Integer ' Number of Constants
short iMaxConstants; // 0x2A As Integer ' Maximum Constants to allocate.
int lpIdeData2; // 0x2C As Long
int lpIdeData3; // 0x30 As Long
int lpConstantPool; // 0x34 As Long 'can be immediatly followed by OptionalObjectInfo
};
ObjectTable objtable = {0};
CodeObject codeObj = {0};
ObjectInfo objInfo = {0};
typedef void (__stdcall *CreateIExprSrvObj)(int,int,int);

View File

@ -0,0 +1,9 @@
Attribute VB_Name = "Module1"
Option Explicit
Sub main()
Dim s As New SpeechLib.SpVoice
Call s.Speak("Early binding is cool")
End Sub

View File

@ -0,0 +1,34 @@
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\Windows\SysWOW64\stdole2.tlb#OLE Automation
Reference=*\G{C866CA3A-32F7-11D2-9602-00C04F8EE628}#5.4#0#..\..\..\..\..\..\Windows\System32\Speech\Common\sapi.dll#Microsoft Speech Object Library
Module=Module1; Module1.bas
Startup="Sub Main"
HelpFile=""
ExeName32="Project1.exe"
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=-1
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
[fastBuild]
fullPath=%ap%\Project1.exe

View File

@ -0,0 +1 @@
Module1 = 52, 52, 468, 436,

View File

@ -0,0 +1,2 @@
Example of using early binding from pcode.
We also do a live swap of a const pool entry and run it again with a new message.

View File

@ -0,0 +1,160 @@
#include <windows.h>
#include <stdio.h>
#include <conio.h>
struct ObjectTable{
int lNull1; // As Long ' 0x00 (00d)
int aExecProj; // As Long ' 0x04 (04d) Pointer to a memory structure
int aProjectInfo2; // As Long ' 0x08 (08d) Pointer to Project Info 2
int Const1; // As Long ' 0x0C
int Null2; // As Long ' 0x10
int lpProjectObject; // As Long ' 0x14
char uuidObj[15]; // As Byte 'converted from 4 flags dzzie (from vb.idc)
short fCompileType; // As Integer ' 0x28 (40d) Internal flag used during compilation
short ObjectCount1; // As Integer ' 0x2A
short iCompiledObjects; // As Integer ' 0x2C (44d) Number of objects compiled.
short iObjectsInUse; // As Integer ' 0x2E (46d) Updated in the IDE to correspond the total number ' but will go up or down when initializing/unloading modules.
int lpObjectArray; // As Long ' 0x30
int fIdeFlag; // As Long ' 0x34
int lpIdeData; // As Long ' 0x38
int lpIdeData2; // As Long ' 0x3C
int aProjectName; // As Long ' 0x40 NTS
int LangID1; // As Long ' 0x44
int LangID2; // As Long ' 0x48
int lpIdeData3; // As Long ' 0x4C
int dwIdentifier; // As Long ' 0x50
};
struct CodeObject{
int aObjectInfo; // As Long ' 0x00 Pointer to the Object Info for this Object.
int Const1; // As Long ' 0x04 Always set to -1 after compiling.
int aPublicBytes; // As Long ' 0x08 Pointer to Public Variable Size integers
int aStaticBytes; // As Long ' 0x0C Pointer to Static Variables Struct
int aModulePublic; // As Long ' 0x10 Pointer to Public Variables in DATA section
int aModuleStatic; // As Long ' 0x14 Pointer to Static Variables in DATA section
int aObjectName; // As Long ' 0x18 Name of the Object.
int ProcCount; // As Long ' 0x1C Number of Methods in Object
int aProcNamesArray;// As Long ' 0x20 If present, pointer to Method names array.
int oStaticVars; // As Long ' 0x24 Offset to Static Vars from aModuleStatic
int ObjectType; // As Long ' 0x28 Flags defining the Object Type.
int Null3; // As Long ' 0x2C Not valid after compilation.
};
struct ObjectInfo{
short wRefCount; // 0 As Integer ' Always 1 after compilation.
short ObjectIndex; // 2 As Integer '
int aObjectTable; // 4 As Long ' Pointer to the Object Table
int lpIdeData; // 8 Long ' Zero after compilation. Used in IDE only.
int lpPrivateObject; // 0xC As Long ' Pointer to Private Object Descriptor.
int dwReserved; // 0x10 As Long
int Null2; // 0x14 As Long
int aObject; // 0x18 As Long ' points to the parent tObject
int lpProjectData; // 0x1c As Long ' 0x1C [can someone verify this?]
short NumberOfProcs; // 0x20 As Integer
short wMethodCount2; // 0x22 As Integer ' Zeroed out after compilation. IDE only.
int lpMethods; // 0x24 As Long ' Pointer to Array of Methods.
short iConstantsCount; // 0x28 As Integer ' Number of Constants
short iMaxConstants; // 0x2A As Integer ' Maximum Constants to allocate.
int lpIdeData2; // 0x2C As Long
int lpIdeData3; // 0x30 As Long
int lpConstantPool; // 0x34 As Long 'can be immediatly followed by OptionalObjectInfo
};
int __stdcall MsgBox(wchar_t *str)
{
if(str == NULL || *str == NULL) return 0;
return MessageBoxW(0, str, L"In C",0);
}
unsigned char pcode[] = {
0x04, 0x74, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x04, 0x78, 0xFF, 0x24, 0x01,
0x00, 0x0D, 0x70, 0x00, 0x02, 0x00, 0x14, 0x00, 0x74, 0x10, 0x40, 0x00, 0x04, 0x00, 0x08, 0x00,
0x18, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xFF, 0x03, 0x00,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xE9, 0xE9, 0xE9, 0xE9, 0xCC, 0xCC, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x9E, 0x9E, 0x9E, 0x9E, 0x5C, 0x15, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
struct COMDEF{
int unk;
void* lpData1;
void* lpData2;
int unk2;
};
void main(void){
int rv = 0;
void* constPool[20] = {0};
int lpProjObj[10] = {0};
ObjectTable objtable = {0};
CodeObject codeObj = {0};
ObjectInfo objInfo = {0};
typedef IUnknown* (__stdcall *CreateIExprSrvObj)(int,int,int);
HMODULE h = (HMODULE)LoadLibrary("msvbvm60.dll");
int lpProcCallEngine = (int)GetProcAddress(h,"ProcCallEngine");
CreateIExprSrvObj IExprSrvObj = (CreateIExprSrvObj)GetProcAddress(h,"CreateIExprSrvObj");
//printf("ProcCallEngine = %x, CreateIExprSrvObj=%x\n", lpProcCallEngine,IExprSrvObj);
IUnknown *iunk = IExprSrvObj(0,4,0); //initilize runtime
int mainLastOffset = (int)&pcode + (0x18); //last offset - funcstart
(*(int*)mainLastOffset) = (int)&objInfo; //patch lastOffset of pcode to point to our dynamic ObjInfo Struct
objInfo.aObject = (int)&codeObj;
objInfo.lpConstantPool = (int)&constPool;
objInfo.aObjectTable = (int)&objtable;
objtable.lpProjectObject = (int)&lpProjObj; //ENGINE:66104EAB [ebp-2Ch] = ObjTable.lpProjectObject[0x0C]; (heap memory) unknown
BSTR msg = SysAllocString(L"Early binding is cool");
//401230 = {96749377-3391-11D2-9EE3-00C04F797396} CLSID_SpVoice
unsigned char clsid[16] = {0x77, 0x93, 0x74, 0x96, 0x91, 0x33, 0xD2, 0x11, 0x9E, 0xE3, 0x00, 0xC0, 0x4F, 0x79, 0x73, 0x96};
//401240 = {269316D8-57BD-11D2-9EEE-00C04F797396} IID_ISpeechVoice
unsigned char iid[16] = {0xD8, 0x16, 0x93, 0x26, 0xBD, 0x57, 0xD2, 0x11, 0x9E, 0xEE, 0x00, 0xC0, 0x4F, 0x79, 0x73, 0x96};
COMDEF comdef = {0}; // {0x00, 0x00, 0x00, 0x00, 0x30, 0x12, 0x40, 0x00, 0x40, 0x12, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00};
comdef.lpData1 = &clsid;
comdef.lpData2 = &iid;
constPool[0] = msg;
constPool[1] = &comdef;
constPool[2] = &iid;
HRESULT hh = CoInitialize(NULL);
printf("Launching pcode CoInitialize = %x\n", hh);
_asm{
//int 3
mov edx, mainLastOffset
mov ecx, lpProcCallEngine
call ecx
}
//live updates to const pool are ok
constPool[0] = SysAllocString(L"Dont make me say it again!");
_asm{
//int 3
mov edx, mainLastOffset
mov ecx, lpProcCallEngine
call ecx
}
if(iunk!=NULL) iunk->Release(); //doesnt really matter...
printf("Press any key to exit...");
getch();
}

View File

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psc", "psc.vcproj", "{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.ActiveCfg = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.Build.0 = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.ActiveCfg = Release|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

Binary file not shown.

View File

@ -0,0 +1,176 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="psc"
ProjectGUID="{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
RootNamespace="psc"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="test.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath=".\main.cpp"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -0,0 +1,9 @@
Attribute VB_Name = "Module1"
Sub Main()
End Sub
Function add(ByVal x As Long) As Long
add = x + 1
End Function

View File

@ -0,0 +1,33 @@
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\Windows\SysWOW64\stdole2.tlb#OLE Automation
Module=Module1; Module1.bas
Startup="Sub Main"
HelpFile=""
ExeName32="first.exe"
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=-1
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
[fastBuild]
fullPath=C:\Users\dzzie\Desktop\P-Code_Rip_samples\c_host\1_firstTest\first.exe

View File

@ -0,0 +1 @@
Module1 = 52, 52, 1027, 693,

View File

@ -0,0 +1 @@
Simple return value from pcode.

View File

@ -0,0 +1,134 @@
#include <windows.h>
#include <stdio.h>
#include <conio.h>
/*
add 1 to function argument and return value
401500 Module1.Proc_401500:
401500 6C 0C00 ILdRf [arg_C]
401503 F5 01000000 LitI4 0x1
401508 AA AddI4
401509 71 78FF FStR4 [var_88]
40150C 14 ExitProcI4
40150D db 0 0 0 98
*/
struct ObjectTable{
int lNull1; // As Long ' 0x00 (00d)
int aExecProj; // As Long ' 0x04 (04d) Pointer to a memory structure
int aProjectInfo2; // As Long ' 0x08 (08d) Pointer to Project Info 2
int Const1; // As Long ' 0x0C
int Null2; // As Long ' 0x10
int lpProjectObject; // As Long ' 0x14
char uuidObj[15]; // As Byte 'converted from 4 flags dzzie (from vb.idc)
short fCompileType; // As Integer ' 0x28 (40d) Internal flag used during compilation
short ObjectCount1; // As Integer ' 0x2A
short iCompiledObjects; // As Integer ' 0x2C (44d) Number of objects compiled.
short iObjectsInUse; // As Integer ' 0x2E (46d) Updated in the IDE to correspond the total number ' but will go up or down when initializing/unloading modules.
int lpObjectArray; // As Long ' 0x30
int fIdeFlag; // As Long ' 0x34
int lpIdeData; // As Long ' 0x38
int lpIdeData2; // As Long ' 0x3C
int aProjectName; // As Long ' 0x40 NTS
int LangID1; // As Long ' 0x44
int LangID2; // As Long ' 0x48
int lpIdeData3; // As Long ' 0x4C
int dwIdentifier; // As Long ' 0x50
};
struct CodeObject{
int aObjectInfo; // As Long ' 0x00 Pointer to the Object Info for this Object.
int Const1; // As Long ' 0x04 Always set to -1 after compiling.
int aPublicBytes; // As Long ' 0x08 Pointer to Public Variable Size integers
int aStaticBytes; // As Long ' 0x0C Pointer to Static Variables Struct
int aModulePublic; // As Long ' 0x10 Pointer to Public Variables in DATA section
int aModuleStatic; // As Long ' 0x14 Pointer to Static Variables in DATA section
int aObjectName; // As Long ' 0x18 Name of the Object.
int ProcCount; // As Long ' 0x1C Number of Methods in Object
int aProcNamesArray;// As Long ' 0x20 If present, pointer to Method names array.
int oStaticVars; // As Long ' 0x24 Offset to Static Vars from aModuleStatic
int ObjectType; // As Long ' 0x28 Flags defining the Object Type.
int Null3; // As Long ' 0x2C Not valid after compilation.
};
struct ObjectInfo{
short wRefCount; // 0 As Integer ' Always 1 after compilation.
short ObjectIndex; // 2 As Integer '
int aObjectTable; // 4 As Long ' Pointer to the Object Table
int lpIdeData; // 8 Long ' Zero after compilation. Used in IDE only.
int lpPrivateObject; // 0xC As Long ' Pointer to Private Object Descriptor.
int dwReserved; // 0x10 As Long
int Null2; // 0x14 As Long
int aObject; // 0x18 As Long ' points to the parent tObject
int lpProjectData; // 0x1c As Long ' 0x1C [can someone verify this?]
short NumberOfProcs; // 0x20 As Integer
short wMethodCount2; // 0x22 As Integer ' Zeroed out after compilation. IDE only.
int lpMethods; // 0x24 As Long ' Pointer to Array of Methods.
short iConstantsCount; // 0x28 As Integer ' Number of Constants
short iMaxConstants; // 0x2A As Integer ' Maximum Constants to allocate.
int lpIdeData2; // 0x2C As Long
int lpIdeData3; // 0x30 As Long
int lpConstantPool; // 0x34 As Long 'can be immediatly followed by OptionalObjectInfo
};
unsigned char pcode[] = {
0x6C, 0x0C, 0x00, 0xF5, 0x01, 0x00, 0x00, 0x00, 0xAA, 0x71, 0x78, 0xFF, 0x14, 0x00, 0x00, 0x00,
0x98, 0x10, 0x40, 0x00, 0x08, 0x00, 0x04, 0x00, 0x10, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xF5
};
void main(void){
int rv = 0;
int constPool[20] = {0};
int lpProjObj[10] = {0};
ObjectTable objtable = {0};
CodeObject codeObj = {0};
ObjectInfo objInfo = {0};
typedef void (__stdcall *CreateIExprSrvObj)(int,int,int);
HMODULE h = (HMODULE)LoadLibrary("msvbvm60.dll");
int lpProcCallEngine = (int)GetProcAddress(h,"ProcCallEngine");
CreateIExprSrvObj IExprSrvObj = (CreateIExprSrvObj)GetProcAddress(h,"CreateIExprSrvObj");
//printf("ProcCallEngine = %x, CreateIExprSrvObj=%x\n", lpProcCallEngine,IExprSrvObj);
IExprSrvObj(0,4,0); //initilize runtime
int func_lastOffset = (int)&pcode[0x10];
//printf("func_lastOffset = %x first = %x\n", func_lastOffset, (unsigned char*)pcode[0x10]);
int* i = (int*)&pcode[0x10];
*i = (int)&objInfo; //patch RTMI to point to our dynamic ObjInfo Struct
objInfo.aObject = (int)&codeObj;
objInfo.lpConstantPool = (int)&constPool;
objInfo.aObjectTable = (int)&objtable;
objtable.lpProjectObject = (int)&lpProjObj;
printf("calculating 5 + 1 \n");
_asm{
//int 3
push 5
mov edx, func_lastOffset
mov ecx, lpProcCallEngine
call ecx
mov rv, eax
}
printf("retval = %d\n", rv);
printf("Press any key to exit...");
getch();
}

View File

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psc", "psc.vcproj", "{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.ActiveCfg = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.Build.0 = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.ActiveCfg = Release|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

Binary file not shown.

View File

@ -0,0 +1,194 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="psc"
ProjectGUID="{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
RootNamespace="psc"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="test.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\main.cpp"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -0,0 +1,29 @@
We have two interlinked functions in this example.
The C host sets a global variable used as a for loop maxCount
and implements two callbacks:
* __mMsgbox__ prints a string message to the console
* __getData__ returns a variant back to the vb pcode
Type based on numeric arg passed in.
```
output:
------------------------------------
getData(0)
string callback: 0 TypeName(v) = String
string callback: Value = this is my string
getData(1)
string callback: 1 TypeName(v) = Byte()
string callback: Ubound: 19
string callback: Value = AAAAAAAAAAAAAAAAAAAA
getData(2)
string callback: 2 TypeName(v) = Date
string callback: Value = 3/18/2014 9:24:57 PM
getData(3)
string callback: 3 TypeName(v) = Long
string callback: Value = 32
Press any key to exit...
```

View File

@ -0,0 +1,114 @@
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include "vb.h" //structures
#include "pcode.h"
int lpProcCallEngine = 0;
int offset_sub_main;
int offset_getDataTest;
void __declspec(naked) stubCall_getDataTest(){
_asm{
//int 3
mov edx, offset_getDataTest
mov ecx, lpProcCallEngine
jmp ecx
}
}
//Declare Function getData Lib "dummy" (ByVal key As Long) As Variant
VARIANT __stdcall getData(int arg){
VARIANT v = {VT_EMPTY};
SAFEARRAY* sa = 0;
printf("getData(%d)\n",arg);
switch(arg){
case 0:
v.vt = VT_BSTR;
v.bstrVal = SysAllocString(L"this is my string");
break;
case 1:
sa = SafeArrayCreateVector(VT_UI1, 0, 20);
memset(sa->pvData, 0x41, 20);
v.vt = VT_ARRAY | VT_UI1;
v.parray = sa;
break;
case 2:
v.vt = VT_DATE;
v.date = 41716.892329; //2014-03-18 21:24:57 todo: research VarDateFromUdate
break;
default:
v.vt = VT_I4;
v.intVal = 32;
}
return v;
}
void __stdcall mMsgBox(char* arg){
printf("string callback: %s\n",arg);
}
void main(void){
int rv = 0;
int abort = 0;
int constPool[20] = {0};
int lpProjObj[10] = {0};
int globals[10] = {0};
objInfo.aObject = (int)&codeObj;
objInfo.lpConstantPool = (int)&constPool;
objInfo.aObjectTable = (int)&objtable;
objtable.lpProjectObject = (int)&lpProjObj;
codeObj.aModulePublic = (int)&globals;
globals[0] = 3; //maxCount
HMODULE hRuntime = (HMODULE)LoadLibrary("msvbvm60.dll");
lpProcCallEngine = (int)GetProcAddress(hRuntime,"ProcCallEngine");
CreateIExprSrvObj IExprSrvObj = (CreateIExprSrvObj)GetProcAddress(hRuntime,"CreateIExprSrvObj");
IExprSrvObj(0,4,0); //initilize runtime enough for most things to work (COM, native pcode handlers etc)
offset_sub_main = (int)&sub_main + 0x2C;
(*(int*)offset_sub_main) = (int)&objInfo;
offset_getDataTest = (int)&getDataTest + 0x100;
(*(int*)offset_getDataTest) = (int)&objInfo;
constPool[0x0] = (int)&stubCall_getDataTest;
constPool[0x1] = (int)&getData;
constPool[0x2] = (int)GetProcAddress(hRuntime,"rtcTypeName");
constPool[0x3] = (int)SysAllocString(L"TypeName(v) = ");
constPool[0x4] = (int)SysAllocString(L" ");
constPool[0x5] = (int)&mMsgBox;
constPool[0x6] = (int)SysAllocString(L"Byte()");
constPool[0x7] = (int)SysAllocString(L"Ubound: ");
constPool[0x8] = (int)SysAllocString(L"Value = ");
constPool[0x9] = (int)GetProcAddress(hRuntime,"rtcStrConvVar2");
_asm{
//int 3
mov edx, offset_sub_main
mov ecx, lpProcCallEngine
call ecx
}
printf("\nPress any key to exit...");
getch();
}

View File

@ -0,0 +1,37 @@
unsigned char sub_main[] = {
0xF5, 0x00, 0x00, 0x00, 0x00, 0x04, 0x78, 0xFF, 0x94, 0x08, 0x00, 0x00, 0x00, 0xFE, 0x64, 0x70,
0xFF, 0x29, 0x00, 0x04, 0x78, 0xFF, 0x04, 0x60, 0xFF, 0x0A, 0x00, 0x00, 0x08, 0x00, 0x35, 0x60,
0xFF, 0x04, 0x78, 0xFF, 0x66, 0x70, 0xFF, 0x13, 0x00, 0x14, 0x00, 0x00, 0xA4, 0x10, 0x40, 0x00,
0x04, 0x00, 0x1C, 0x00, 0x2C, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xFF, 0x02, 0x00,
0x80, 0x10, 0x00, 0x04, 0x40, 0xFF, 0x0A, 0x01, 0x00, 0x08, 0x00, 0x3C, 0x04, 0x40, 0xFF, 0xFC,
0xF6, 0x5C, 0xFF, 0x04, 0x5C, 0xFF, 0x0B, 0x02, 0x00, 0x04, 0x00, 0x31, 0x58, 0xFF, 0x1B, 0x03,
0x00, 0x6C, 0x58, 0xFF, 0x2A, 0x31, 0x54, 0xFF, 0x80, 0x10, 0x00, 0xFB
};
unsigned char getDataTest[] = {
0x80, 0x10, 0x00, 0x04, 0x40, 0xFF, 0x0A, 0x01, 0x00, 0x08, 0x00, 0x3C, 0x04, 0x40, 0xFF, 0xFC,
0xF6, 0x5C, 0xFF, 0x04, 0x5C, 0xFF, 0x0B, 0x02, 0x00, 0x04, 0x00, 0x31, 0x58, 0xFF, 0x1B, 0x03,
0x00, 0x6C, 0x58, 0xFF, 0x2A, 0x31, 0x54, 0xFF, 0x80, 0x10, 0x00, 0xFB, 0xFE, 0x23, 0x3C, 0xFF,
0x1B, 0x04, 0x00, 0x2A, 0x23, 0x38, 0xFF, 0x6C, 0x54, 0xFF, 0x2A, 0x23, 0x34, 0xFF, 0x04, 0x30,
0xFF, 0x34, 0x6C, 0x30, 0xFF, 0x0A, 0x05, 0x00, 0x04, 0x00, 0x3C, 0x32, 0x08, 0x00, 0x3C, 0xFF,
0x38, 0xFF, 0x34, 0xFF, 0x30, 0xFF, 0x6C, 0x58, 0xFF, 0x1B, 0x06, 0x00, 0xFB, 0x30, 0x1C, 0xCD,
0x00, 0x04, 0x5C, 0xFF, 0xFC, 0x60, 0x2C, 0xFF, 0x04, 0x2C, 0xFF, 0x04, 0x50, 0xFF, 0xFF, 0x01,
0x1B, 0x07, 0x00, 0x6C, 0x50, 0xFF, 0xF4, 0x01, 0xFC, 0xCB, 0xFB, 0xFE, 0x23, 0x3C, 0xFF, 0x2A,
0x23, 0x38, 0xFF, 0x04, 0x34, 0xFF, 0x34, 0x6C, 0x34, 0xFF, 0x0A, 0x05, 0x00, 0x04, 0x00, 0x3C,
0x32, 0x06, 0x00, 0x3C, 0xFF, 0x38, 0xFF, 0x34, 0xFF, 0x3A, 0x0C, 0xFF, 0x08, 0x00, 0xF5, 0x09,
0x04, 0x00, 0x00, 0xF5, 0x40, 0x00, 0x00, 0x00, 0x04, 0x50, 0xFF, 0x4D, 0x1C, 0xFF, 0x11, 0x60,
0x04, 0x40, 0xFF, 0x0A, 0x09, 0x00, 0x10, 0x00, 0x04, 0x40, 0xFF, 0xFB, 0xEF, 0xFC, 0xFE, 0x60,
0x31, 0x54, 0xFF, 0x36, 0x04, 0x00, 0x40, 0xFF, 0xFC, 0xFE, 0x1E, 0xE0, 0x00, 0x3A, 0x1C, 0xFF,
0x08, 0x00, 0x04, 0x5C, 0xFF, 0xFB, 0xEF, 0x40, 0xFF, 0x60, 0x31, 0x54, 0xFF, 0x35, 0x40, 0xFF,
0x6C, 0x54, 0xFF, 0x04, 0x3C, 0xFF, 0x34, 0x6C, 0x3C, 0xFF, 0x0A, 0x05, 0x00, 0x04, 0x00, 0x3C,
0x6C, 0x3C, 0xFF, 0x04, 0x54, 0xFF, 0xFC, 0x58, 0x2F, 0x3C, 0xFF, 0xFD, 0x95, 0x10, 0x00, 0x00,
0xA4, 0x10, 0x40, 0x00, 0x0C, 0x00, 0x80, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
0x00, 0x00, 0x00, 0x01, 0x6C, 0xFF, 0x02, 0x00, 0x54, 0xFF, 0x01, 0x00, 0x50, 0xFF, 0x05, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xFF, 0x01, 0x00, 0x5C, 0xFF, 0x02, 0x00, 0x00, 0x00,
0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x01, 0x00,
0x38, 0xFF, 0x01, 0x00, 0x34, 0xFF, 0x01, 0x00, 0x30, 0xFF, 0x01, 0x00, 0x40, 0xFF, 0x02, 0x00
};

View File

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psc", "psc.vcproj", "{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.ActiveCfg = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.Build.0 = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.ActiveCfg = Release|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,184 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="psc"
ProjectGUID="{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
RootNamespace="psc"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="test.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath=".\main.cpp"
>
</File>
<File
RelativePath=".\pcode.h"
>
</File>
<File
RelativePath=".\vb.h"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -0,0 +1,39 @@
Attribute VB_Name = "Module1"
'lets have our loader feed us some different data based on a key we pass in including a byte array
Public Declare Function getData Lib "dummy" (ByVal key As Long) As Variant
Public Declare Sub mMsgBox Lib "dummy" (ByVal msg As String)
Dim maxCount As Long 'set from host language..yes we are fancy and in complete control.
Sub Main()
Dim i As Long
For i = 0 To maxCount
getDataTest i
Next
End Sub
Function getDataTest(key As Long) As Variant
Dim v As Variant, t As String, msg As String, b() As Byte
v = getData(key)
t = TypeName(v)
msg = "TypeName(v) = " & t
mMsgBox key & " " & msg
If t = "Byte()" Then
b() = v
mMsgBox "Ubound: " & UBound(b)
msg = "Value = " & StrConv(b, vbUnicode, &H409)
Else
msg = "Value = " & v
End If
mMsgBox msg
End Function

View File

@ -0,0 +1,33 @@
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\..\Windows\SysWOW64\stdole2.tlb#OLE Automation
Module=Module1; Module1.bas
Startup="Sub Main"
HelpFile=""
ExeName32="decoder.exe"
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=-1
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
[fastBuild]
fullPath=%ap%\decoder.exe

View File

@ -0,0 +1 @@
Module1 = 68, 20, 1378, 940,

View File

@ -0,0 +1,65 @@
struct ObjectTable{
int lNull1; // As Long ' 0x00 (00d)
int aExecProj; // As Long ' 0x04 (04d) Pointer to a memory structure
int aProjectInfo2; // As Long ' 0x08 (08d) Pointer to Project Info 2
int Const1; // As Long ' 0x0C
int Null2; // As Long ' 0x10
int lpProjectObject; // As Long ' 0x14
char uuidObj[15]; // As Byte 'converted from 4 flags dzzie (from vb.idc)
short fCompileType; // As Integer ' 0x28 (40d) Internal flag used during compilation
short ObjectCount1; // As Integer ' 0x2A
short iCompiledObjects; // As Integer ' 0x2C (44d) Number of objects compiled.
short iObjectsInUse; // As Integer ' 0x2E (46d) Updated in the IDE to correspond the total number ' but will go up or down when initializing/unloading modules.
int lpObjectArray; // As Long ' 0x30
int fIdeFlag; // As Long ' 0x34
int lpIdeData; // As Long ' 0x38
int lpIdeData2; // As Long ' 0x3C
int aProjectName; // As Long ' 0x40 NTS
int LangID1; // As Long ' 0x44
int LangID2; // As Long ' 0x48
int lpIdeData3; // As Long ' 0x4C
int dwIdentifier; // As Long ' 0x50
};
struct CodeObject{
int aObjectInfo; // As Long ' 0x00 Pointer to the Object Info for this Object.
int Const1; // As Long ' 0x04 Always set to -1 after compiling.
int aPublicBytes; // As Long ' 0x08 Pointer to Public Variable Size integers
int aStaticBytes; // As Long ' 0x0C Pointer to Static Variables Struct
int aModulePublic; // As Long ' 0x10 Pointer to Public Variables in DATA section
int aModuleStatic; // As Long ' 0x14 Pointer to Static Variables in DATA section
int aObjectName; // As Long ' 0x18 Name of the Object.
int ProcCount; // As Long ' 0x1C Number of Methods in Object
int aProcNamesArray;// As Long ' 0x20 If present, pointer to Method names array.
int oStaticVars; // As Long ' 0x24 Offset to Static Vars from aModuleStatic
int ObjectType; // As Long ' 0x28 Flags defining the Object Type.
int Null3; // As Long ' 0x2C Not valid after compilation.
};
struct ObjectInfo{
short wRefCount; // 0 As Integer ' Always 1 after compilation.
short ObjectIndex; // 2 As Integer '
int aObjectTable; // 4 As Long ' Pointer to the Object Table
int lpIdeData; // 8 Long ' Zero after compilation. Used in IDE only.
int lpPrivateObject; // 0xC As Long ' Pointer to Private Object Descriptor.
int dwReserved; // 0x10 As Long
int Null2; // 0x14 As Long
int aObject; // 0x18 As Long ' points to the parent tObject
int lpProjectData; // 0x1c As Long ' 0x1C [can someone verify this?]
short NumberOfProcs; // 0x20 As Integer
short wMethodCount2; // 0x22 As Integer ' Zeroed out after compilation. IDE only.
int lpMethods; // 0x24 As Long ' Pointer to Array of Methods.
short iConstantsCount; // 0x28 As Integer ' Number of Constants
short iMaxConstants; // 0x2A As Integer ' Maximum Constants to allocate.
int lpIdeData2; // 0x2C As Long
int lpIdeData3; // 0x30 As Long
int lpConstantPool; // 0x34 As Long 'can be immediatly followed by OptionalObjectInfo
};
ObjectTable objtable = {0};
CodeObject codeObj = {0};
ObjectInfo objInfo = {0};
typedef void (__stdcall *CreateIExprSrvObj)(int,int,int);

View File

@ -0,0 +1 @@
Setup / test mem to handle global variables.

View File

@ -0,0 +1,78 @@
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include "vb.h" //structures
#include "pcode.h"
int lpProcCallEngine = 0;
/*
Dim g As Long
Private Declare Sub callback Lib "dummy.dll" (ByVal s As Long)
Sub Main()
g = 21
callback g + 1
End Sub
*/
unsigned char sub_main[] = {
0xF5, 0x15, 0x00, 0x00, 0x00, 0x99, 0x08, 0x00, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x00, 0xF5,
0x01, 0x00, 0x00, 0x00, 0xAA, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x3C, 0x14, 0x90, 0x10, 0x40, 0x00,
0x04, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xE9, 0xE9, 0xE9, 0xE9, 0xCC, 0xCC, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x9E, 0x9E, 0x9E, 0x9E, 0x5C, 0x15, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x15, 0x00, 0x00
};
//examples progress callback (same vb declare as sleep)
void __stdcall callback(int arg){
printf("c callback received %d\n",arg);
}
void main(void){
int rv = 0;
int abort = 0;
int constPool[20] = {0};
int lpProjObj[10] = {0};
int publicVars[10] = {0};
objInfo.aObject = (int)&codeObj;
objInfo.lpConstantPool = (int)&constPool;
objInfo.aObjectTable = (int)&objtable;
objtable.lpProjectObject = (int)&lpProjObj;
HMODULE hRuntime = (HMODULE)LoadLibrary("msvbvm60.dll");
lpProcCallEngine = (int)GetProcAddress(hRuntime,"ProcCallEngine");
CreateIExprSrvObj IExprSrvObj = (CreateIExprSrvObj)GetProcAddress(hRuntime,"CreateIExprSrvObj");
IExprSrvObj(0,4,0); //initilize runtime enough for most things to work (COM, native pcode handlers etc)
constPool[0x0] = (int)&callback;
int offset_sub_main = (int)&sub_main + 0x1C;
(*(int*)offset_sub_main) = (int)&objInfo;
codeObj.aModulePublic = &publicVars[0];
_asm{
//int 3
mov edx, offset_sub_main
mov ecx, lpProcCallEngine
call ecx
mov rv, eax
}
printf("global[0] = %d\n", publicVars[0]);
printf("Press any key to exit...");
getch();
}

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psc", "psc.vcproj", "{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.ActiveCfg = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.Build.0 = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.ActiveCfg = Release|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,184 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="psc"
ProjectGUID="{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
RootNamespace="psc"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="test.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath=".\main.cpp"
>
</File>
<File
RelativePath=".\pcode.h"
>
</File>
<File
RelativePath=".\vb.h"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -0,0 +1,13 @@
Attribute VB_Name = "Module1"
Option Explicit
Dim g As Long
Private Declare Sub callback Lib "dummy.dll" (ByVal s As Long)
Sub Main()
g = 21
callback g + 1
End Sub

View File

@ -0,0 +1,33 @@
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\..\Windows\SysWOW64\stdole2.tlb#OLE Automation
Module=Module1; Module1.bas
Startup="Sub Main"
HelpFile=""
ExeName32="Project1.exe"
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=-1
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
[fastBuild]
fullPath=%ap%\Project1.exe

View File

@ -0,0 +1 @@
Module1 = 52, 52, 1192, 701,

View File

@ -0,0 +1,65 @@
struct ObjectTable{
int lNull1; // As Long ' 0x00 (00d)
int aExecProj; // As Long ' 0x04 (04d) Pointer to a memory structure
int aProjectInfo2; // As Long ' 0x08 (08d) Pointer to Project Info 2
int Const1; // As Long ' 0x0C
int Null2; // As Long ' 0x10
int lpProjectObject; // As Long ' 0x14
char uuidObj[15]; // As Byte 'converted from 4 flags dzzie (from vb.idc)
short fCompileType; // As Integer ' 0x28 (40d) Internal flag used during compilation
short ObjectCount1; // As Integer ' 0x2A
short iCompiledObjects; // As Integer ' 0x2C (44d) Number of objects compiled.
short iObjectsInUse; // As Integer ' 0x2E (46d) Updated in the IDE to correspond the total number ' but will go up or down when initializing/unloading modules.
int lpObjectArray; // As Long ' 0x30
int fIdeFlag; // As Long ' 0x34
int lpIdeData; // As Long ' 0x38
int lpIdeData2; // As Long ' 0x3C
int aProjectName; // As Long ' 0x40 NTS
int LangID1; // As Long ' 0x44
int LangID2; // As Long ' 0x48
int lpIdeData3; // As Long ' 0x4C
int dwIdentifier; // As Long ' 0x50
};
struct CodeObject{
int aObjectInfo; // As Long ' 0x00 Pointer to the Object Info for this Object.
int Const1; // As Long ' 0x04 Always set to -1 after compiling.
int aPublicBytes; // As Long ' 0x08 Pointer to Public Variable Size integers
int aStaticBytes; // As Long ' 0x0C Pointer to Static Variables Struct
int* aModulePublic; // As Long ' 0x10 Pointer to Public Variables in DATA section
int aModuleStatic; // As Long ' 0x14 Pointer to Static Variables in DATA section
int aObjectName; // As Long ' 0x18 Name of the Object.
int ProcCount; // As Long ' 0x1C Number of Methods in Object
int aProcNamesArray;// As Long ' 0x20 If present, pointer to Method names array.
int oStaticVars; // As Long ' 0x24 Offset to Static Vars from aModuleStatic
int ObjectType; // As Long ' 0x28 Flags defining the Object Type.
int Null3; // As Long ' 0x2C Not valid after compilation.
};
struct ObjectInfo{
short wRefCount; // 0 As Integer ' Always 1 after compilation.
short ObjectIndex; // 2 As Integer '
int aObjectTable; // 4 As Long ' Pointer to the Object Table
int lpIdeData; // 8 Long ' Zero after compilation. Used in IDE only.
int lpPrivateObject; // 0xC As Long ' Pointer to Private Object Descriptor.
int dwReserved; // 0x10 As Long
int Null2; // 0x14 As Long
int aObject; // 0x18 As Long ' points to the parent tObject
int lpProjectData; // 0x1c As Long ' 0x1C [can someone verify this?]
short NumberOfProcs; // 0x20 As Integer
short wMethodCount2; // 0x22 As Integer ' Zeroed out after compilation. IDE only.
int lpMethods; // 0x24 As Long ' Pointer to Array of Methods.
short iConstantsCount; // 0x28 As Integer ' Number of Constants
short iMaxConstants; // 0x2A As Integer ' Maximum Constants to allocate.
int lpIdeData2; // 0x2C As Long
int lpIdeData3; // 0x30 As Long
int lpConstantPool; // 0x34 As Long 'can be immediatly followed by OptionalObjectInfo
};
ObjectTable objtable = {0};
CodeObject codeObj = {0};
ObjectInfo objInfo = {0};
typedef void (__stdcall *CreateIExprSrvObj)(int,int,int);

View File

@ -0,0 +1,10 @@
Attribute VB_Name = "Module1"
Option Explicit
Sub main()
Dim voice As Object
Set voice = CreateObject("SAPI.SpVoice")
Call voice.Speak("Late binding is cool")
End Sub

View File

@ -0,0 +1,33 @@
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\Windows\SysWOW64\stdole2.tlb#OLE Automation
Module=Module1; Module1.bas
Startup="Sub Main"
HelpFile=""
ExeName32="Project1.exe"
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=-1
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
[fastBuild]
fullPath=%ap%\Project1.exe

View File

@ -0,0 +1 @@
Module1 = 26, 26, 572, 486,

View File

@ -0,0 +1,4 @@
sapi voice COM late binding example.

View File

@ -0,0 +1,143 @@
#include <windows.h>
#include <stdio.h>
#include <conio.h>
struct ObjectTable{
int lNull1; // As Long ' 0x00 (00d)
int aExecProj; // As Long ' 0x04 (04d) Pointer to a memory structure
int aProjectInfo2; // As Long ' 0x08 (08d) Pointer to Project Info 2
int Const1; // As Long ' 0x0C
int Null2; // As Long ' 0x10
int lpProjectObject; // As Long ' 0x14
char uuidObj[15]; // As Byte 'converted from 4 flags dzzie (from vb.idc)
short fCompileType; // As Integer ' 0x28 (40d) Internal flag used during compilation
short ObjectCount1; // As Integer ' 0x2A
short iCompiledObjects; // As Integer ' 0x2C (44d) Number of objects compiled.
short iObjectsInUse; // As Integer ' 0x2E (46d) Updated in the IDE to correspond the total number ' but will go up or down when initializing/unloading modules.
int lpObjectArray; // As Long ' 0x30
int fIdeFlag; // As Long ' 0x34
int lpIdeData; // As Long ' 0x38
int lpIdeData2; // As Long ' 0x3C
int aProjectName; // As Long ' 0x40 NTS
int LangID1; // As Long ' 0x44
int LangID2; // As Long ' 0x48
int lpIdeData3; // As Long ' 0x4C
int dwIdentifier; // As Long ' 0x50
};
struct CodeObject{
int aObjectInfo; // As Long ' 0x00 Pointer to the Object Info for this Object.
int Const1; // As Long ' 0x04 Always set to -1 after compiling.
int aPublicBytes; // As Long ' 0x08 Pointer to Public Variable Size integers
int aStaticBytes; // As Long ' 0x0C Pointer to Static Variables Struct
int aModulePublic; // As Long ' 0x10 Pointer to Public Variables in DATA section
int aModuleStatic; // As Long ' 0x14 Pointer to Static Variables in DATA section
int aObjectName; // As Long ' 0x18 Name of the Object.
int ProcCount; // As Long ' 0x1C Number of Methods in Object
int aProcNamesArray;// As Long ' 0x20 If present, pointer to Method names array.
int oStaticVars; // As Long ' 0x24 Offset to Static Vars from aModuleStatic
int ObjectType; // As Long ' 0x28 Flags defining the Object Type.
int Null3; // As Long ' 0x2C Not valid after compilation.
};
struct ObjectInfo{
short wRefCount; // 0 As Integer ' Always 1 after compilation.
short ObjectIndex; // 2 As Integer '
int aObjectTable; // 4 As Long ' Pointer to the Object Table
int lpIdeData; // 8 Long ' Zero after compilation. Used in IDE only.
int lpPrivateObject; // 0xC As Long ' Pointer to Private Object Descriptor.
int dwReserved; // 0x10 As Long
int Null2; // 0x14 As Long
int aObject; // 0x18 As Long ' points to the parent tObject
int lpProjectData; // 0x1c As Long ' 0x1C [can someone verify this?]
short NumberOfProcs; // 0x20 As Integer
short wMethodCount2; // 0x22 As Integer ' Zeroed out after compilation. IDE only.
int lpMethods; // 0x24 As Long ' Pointer to Array of Methods.
short iConstantsCount; // 0x28 As Integer ' Number of Constants
short iMaxConstants; // 0x2A As Integer ' Maximum Constants to allocate.
int lpIdeData2; // 0x2C As Long
int lpIdeData3; // 0x30 As Long
int lpConstantPool; // 0x34 As Long 'can be immediatly followed by OptionalObjectInfo
};
int __stdcall MsgBox(wchar_t *str)
{
if(str == NULL || *str == NULL) return 0;
return MessageBoxW(0, str, L"In C",0);
}
unsigned char pcode[] = {
0xF5, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x04, 0x68, 0xFF, 0x0A, 0x01, 0x00, 0x0C, 0x00,
0x04, 0x68, 0xFF, 0xFC, 0x34, 0xFC, 0xF8, 0x78, 0xFF, 0x35, 0x68, 0xFF, 0x3A, 0x58, 0xFF, 0x02,
0x00, 0x25, 0x08, 0x78, 0xFF, 0xFE, 0x98, 0x03, 0x00, 0x01, 0x00, 0x14, 0x88, 0x10, 0x40, 0x00,
0x04, 0x00, 0x34, 0x00, 0x2C, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x78, 0xFF, 0x03, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x68, 0xFF, 0x02, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xE9, 0xE9, 0xE9, 0xE9, 0xCC, 0xCC, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x9E, 0x9E, 0x9E, 0x9E, 0x8C, 0x15, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x15, 0x00, 0x00
};
struct COMDEF{
int unk;
void* lpData1;
void* lpData2;
int unk2;
};
void main(void){
int rv = 0;
void* constPool[20] = {0};
int lpProjObj[10] = {0};
ObjectTable objtable = {0};
CodeObject codeObj = {0};
ObjectInfo objInfo = {0};
typedef IUnknown* (__stdcall *CreateIExprSrvObj)(int,int,int);
HMODULE h = (HMODULE)LoadLibrary("msvbvm60.dll");
int lpProcCallEngine = (int)GetProcAddress(h,"ProcCallEngine");
CreateIExprSrvObj IExprSrvObj = (CreateIExprSrvObj)GetProcAddress(h,"CreateIExprSrvObj");
//printf("ProcCallEngine = %x, CreateIExprSrvObj=%x\n", lpProcCallEngine,IExprSrvObj);
IUnknown *iunk = IExprSrvObj(0,4,0); //initilize runtime
int mainLastOffset = (int)&pcode + (0x2c); //last offset - funcstart
(*(int*)mainLastOffset) = (int)&objInfo; //patch lastOffset of pcode to point to our dynamic ObjInfo Struct
objInfo.aObject = (int)&codeObj;
objInfo.lpConstantPool = (int)&constPool;
objInfo.aObjectTable = (int)&objtable;
objtable.lpProjectObject = (int)&lpProjObj; //ENGINE:66104EAB [ebp-2Ch] = ObjTable.lpProjectObject[0x0C]; (heap memory) unknown
BSTR b0 = SysAllocString(L"SAPI.SpVoice");
BSTR b2 = SysAllocString(L"Late binding is cool");
BSTR b3 = SysAllocString(L"Speak");
constPool[0x0] = b0;
constPool[0x1] = GetProcAddress(h,"rtcCreateObject2");
constPool[0x2] = b2;
constPool[0x3] = b3;
HRESULT hh = CoInitialize(NULL);
printf("Launching pcode CoInitialize = %x\n", hh);
_asm{
//int 3
mov edx, mainLastOffset
mov ecx, lpProcCallEngine
call ecx
}
if(iunk!=NULL) iunk->Release(); //doesnt really matter...
printf("Press any key to exit...");
getch();
}

View File

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psc", "psc.vcproj", "{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.ActiveCfg = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.Build.0 = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.ActiveCfg = Release|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

Binary file not shown.

View File

@ -0,0 +1,176 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="psc"
ProjectGUID="{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
RootNamespace="psc"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="test.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath=".\main.cpp"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -0,0 +1,25 @@
Attribute VB_Name = "Module1"
Option Explicit
Declare Function mMsgBox Lib "dummy" (ByVal msgPtr As Long) As Long
Type cfg
str1 As String
int1 As Long
End Type
Sub Main()
End Sub
Function test(ByRef c As cfg) As Long
mMsgBox StrPtr(Hex(VarPtr(c)))
mMsgBox StrPtr("c.int1 = 0x" & Hex(c.int1))
mMsgBox StrPtr(c.str1)
Dim tmp As String
tmp = "will i get a crash? " & c.str1
mMsgBox StrPtr(tmp)
End Function

View File

@ -0,0 +1,34 @@
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\Windows\SysWOW64\stdole2.tlb#OLE Automation
Module=Module1; Module1.bas
Startup="Sub Main"
HelpFile=""
Title="Project1"
ExeName32="Project1.exe"
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=-1
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
[fastBuild]
fullPath=%ap%\Project1.exe

View File

@ -0,0 +1 @@
Module1 = 52, 52, 1005, 643,

View File

@ -0,0 +1,8 @@
This sample shows how to:
* pass a cfg structure from C to the pcode
* implement a messagebox in C with string data from pcode (we can not use vb msgbox)
* use a BSTR from the const pool as a message
* use a string and int from the struct

View File

@ -0,0 +1,155 @@
#include <windows.h>
#include <stdio.h>
#include <conio.h>
struct ObjectTable{
int lNull1; // As Long ' 0x00 (00d)
int aExecProj; // As Long ' 0x04 (04d) Pointer to a memory structure
int aProjectInfo2; // As Long ' 0x08 (08d) Pointer to Project Info 2
int Const1; // As Long ' 0x0C
int Null2; // As Long ' 0x10
int lpProjectObject; // As Long ' 0x14
char uuidObj[15]; // As Byte 'converted from 4 flags dzzie (from vb.idc)
short fCompileType; // As Integer ' 0x28 (40d) Internal flag used during compilation
short ObjectCount1; // As Integer ' 0x2A
short iCompiledObjects; // As Integer ' 0x2C (44d) Number of objects compiled.
short iObjectsInUse; // As Integer ' 0x2E (46d) Updated in the IDE to correspond the total number ' but will go up or down when initializing/unloading modules.
int lpObjectArray; // As Long ' 0x30
int fIdeFlag; // As Long ' 0x34
int lpIdeData; // As Long ' 0x38
int lpIdeData2; // As Long ' 0x3C
int aProjectName; // As Long ' 0x40 NTS
int LangID1; // As Long ' 0x44
int LangID2; // As Long ' 0x48
int lpIdeData3; // As Long ' 0x4C
int dwIdentifier; // As Long ' 0x50
};
struct CodeObject{
int aObjectInfo; // As Long ' 0x00 Pointer to the Object Info for this Object.
int Const1; // As Long ' 0x04 Always set to -1 after compiling.
int aPublicBytes; // As Long ' 0x08 Pointer to Public Variable Size integers
int aStaticBytes; // As Long ' 0x0C Pointer to Static Variables Struct
int aModulePublic; // As Long ' 0x10 Pointer to Public Variables in DATA section
int aModuleStatic; // As Long ' 0x14 Pointer to Static Variables in DATA section
int aObjectName; // As Long ' 0x18 Name of the Object.
int ProcCount; // As Long ' 0x1C Number of Methods in Object
int aProcNamesArray;// As Long ' 0x20 If present, pointer to Method names array.
int oStaticVars; // As Long ' 0x24 Offset to Static Vars from aModuleStatic
int ObjectType; // As Long ' 0x28 Flags defining the Object Type.
int Null3; // As Long ' 0x2C Not valid after compilation.
};
struct ObjectInfo{
short wRefCount; // 0 As Integer ' Always 1 after compilation.
short ObjectIndex; // 2 As Integer '
int aObjectTable; // 4 As Long ' Pointer to the Object Table
int lpIdeData; // 8 Long ' Zero after compilation. Used in IDE only.
int lpPrivateObject; // 0xC As Long ' Pointer to Private Object Descriptor.
int dwReserved; // 0x10 As Long
int Null2; // 0x14 As Long
int aObject; // 0x18 As Long ' points to the parent tObject
int lpProjectData; // 0x1c As Long ' 0x1C [can someone verify this?]
short NumberOfProcs; // 0x20 As Integer
short wMethodCount2; // 0x22 As Integer ' Zeroed out after compilation. IDE only.
int lpMethods; // 0x24 As Long ' Pointer to Array of Methods.
short iConstantsCount; // 0x28 As Integer ' Number of Constants
short iMaxConstants; // 0x2A As Integer ' Maximum Constants to allocate.
int lpIdeData2; // 0x2C As Long
int lpIdeData3; // 0x30 As Long
int lpConstantPool; // 0x34 As Long 'can be immediatly followed by OptionalObjectInfo
};
int __stdcall mMsgBox(wchar_t *str)
{
if(str == NULL || *str == NULL) return 0;
return MessageBoxW(0, str, L"In C",0);
}
struct CFG{
BSTR str1;
int int1;
};
unsigned char test[] = {
0x6C, 0x0C, 0x00, 0x5E, 0x00, 0x00, 0x04, 0x00, 0xFD, 0x69, 0x58, 0xFF, 0x04, 0x48, 0xFF, 0x0A,
0x01, 0x00, 0x08, 0x00, 0x04, 0x48, 0xFF, 0xFD, 0xFE, 0x44, 0xFF, 0x5E, 0x00, 0x00, 0x04, 0x00,
0x0A, 0x02, 0x00, 0x04, 0x00, 0x3C, 0x2F, 0x44, 0xFF, 0x36, 0x04, 0x00, 0x58, 0xFF, 0x48, 0xFF,
0x3A, 0x34, 0xFF, 0x03, 0x00, 0x07, 0x0C, 0x00, 0x04, 0x00, 0x4D, 0x68, 0xFF, 0x03, 0x40, 0x04,
0x58, 0xFF, 0x0A, 0x01, 0x00, 0x08, 0x00, 0x04, 0x58, 0xFF, 0xFB, 0xEF, 0x48, 0xFF, 0xFD, 0xFE,
0x44, 0xFF, 0x5E, 0x00, 0x00, 0x04, 0x00, 0x0A, 0x02, 0x00, 0x04, 0x00, 0x3C, 0x2F, 0x44, 0xFF,
0x36, 0x04, 0x00, 0x58, 0xFF, 0x48, 0xFF, 0x94, 0x0C, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x00, 0x04,
0x00, 0x0A, 0x02, 0x00, 0x04, 0x00, 0x3C, 0x1B, 0x04, 0x00, 0x94, 0x0C, 0x00, 0x00, 0x00, 0x2A,
0x31, 0x30, 0xFF, 0x6C, 0x30, 0xFF, 0x5E, 0x00, 0x00, 0x04, 0x00, 0x0A, 0x02, 0x00, 0x04, 0x00,
0x3C, 0x14, 0x00, 0x00, 0x9C, 0x10, 0x40, 0x00, 0x08, 0x00, 0x4C, 0x00, 0x94, 0x00, 0x28, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFF, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0xFF, 0x01, 0x00, 0x58, 0xFF, 0x02, 0x00,
0x48, 0xFF, 0x02, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xE9, 0xE9, 0xE9, 0xE9,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x9E, 0x9E, 0x9E, 0x9E,
0xAC, 0x16, 0x00, 0x00
};
void main(void){
int rv = 0;
int constPool[20] = {0};
int lpProjObj[10] = {0};
ObjectTable objtable = {0};
CodeObject codeObj = {0};
ObjectInfo objInfo = {0};
typedef IUnknown* (__stdcall *CreateIExprSrvObj)(int,int,int);
HMODULE hRuntime = (HMODULE)LoadLibrary("msvbvm60.dll");
int lpProcCallEngine = (int)GetProcAddress(hRuntime,"ProcCallEngine");
CreateIExprSrvObj IExprSrvObj = (CreateIExprSrvObj)GetProcAddress(hRuntime,"CreateIExprSrvObj");
//printf("ProcCallEngine = %x, CreateIExprSrvObj=%x\n", lpProcCallEngine,IExprSrvObj);
IUnknown *iunk = IExprSrvObj(0,4,0); //initilize runtime
// test - 216 bytes
int offset_test = (int)&test + 0x94;
(*(int*)offset_test) = (int)&objInfo;
objInfo.aObject = (int)&codeObj;
objInfo.lpConstantPool = (int)&constPool;
objInfo.aObjectTable = (int)&objtable;
objtable.lpProjectObject = (int)&lpProjObj; //ENGINE:66104EAB [ebp-2Ch] = ObjTable.lpProjectObject[0x0C]; (heap memory) unknown
CFG cfg;
//if we had used only a wchar string, we would get a crash
//if we tried to concat it with anything. StrPtr(cfg.str1) would be ok but not much else.
cfg.str1 = SysAllocString(L"this is my string in cfg");
cfg.int1 = 0x11223344;
constPool[0x0] = (int)GetProcAddress(hRuntime,"VarPtr");
constPool[0x1] = (int)GetProcAddress(hRuntime,"rtcHexVarFromVar");
constPool[0x2] = (int)&mMsgBox;
constPool[0x3] = (int)SysAllocString(L"c.int1 = 0x");
constPool[0x4] = (int)SysAllocString(L"will i get a crash? ");
printf("Launching pcode cfg = %x\n", &cfg);
_asm{
//int 3
lea eax, cfg
push eax //Function test(ByRef c As cfg) As Long
mov edx, offset_test
mov ecx, lpProcCallEngine
call ecx
mov rv, eax ;//return value from our vb function
}
if(iunk!=NULL) iunk->Release(); //doesnt really matter...
printf("retval = %x\n", rv); //sub main can not return a value, but we can use any prototype for other funcs..no need to use only main.
printf("Press any key to exit...");
getch();
}

View File

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psc", "psc.vcproj", "{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.ActiveCfg = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.Build.0 = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.ActiveCfg = Release|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,176 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="psc"
ProjectGUID="{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
RootNamespace="psc"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="test.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath=".\main.cpp"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -0,0 +1 @@
How to interlink two pcode functions.

View File

@ -0,0 +1,174 @@
#include <windows.h>
#include <stdio.h>
#include <conio.h>
/*
Private Sub Main()
two
End Sub
Function two() As Date
DoEvents
End Function
4014C8 Module1.Sub Main:
4014C8 0A 00000000 ImpAdCallFPR4 Module1.Proc_401490
4014CD 74 74FF FStFPR8 var_8C
4014D0 14 ExitProcI4
Last Offset: 4014D4
401490 Module1.Proc_401490:
401490 0A 01000000 ImpAdCallFPR4 rtcDoEvents
401495 17 ExitProcR8
Last Offset: 401498
Const Pool
0 4010DC ExtApi Module1.Proc_401490
1 401020 ExtApi rtcDoEvents
*/
unsigned char SubMain[62] = {
0x0A, 0x00, 0x00, 0x00, 0x00, 0x74, 0x74, 0xFF, 0x14, 0x00, 0x00, 0x00, 0x88, 0x10, 0x40, 0x00,
0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC
};
unsigned char two[56] = {
0x0A, 0x01, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x88, 0x10, 0x40, 0x00, 0x04, 0x00, 0x08, 0x00,
0x08, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
struct ObjectTable{
int lNull1; // As Long ' 0x00 (00d)
int aExecProj; // As Long ' 0x04 (04d) Pointer to a memory structure
int aProjectInfo2; // As Long ' 0x08 (08d) Pointer to Project Info 2
int Const1; // As Long ' 0x0C
int Null2; // As Long ' 0x10
int lpProjectObject; // As Long ' 0x14
char uuidObj[15]; // As Byte 'converted from 4 flags dzzie (from vb.idc)
short fCompileType; // As Integer ' 0x28 (40d) Internal flag used during compilation
short ObjectCount1; // As Integer ' 0x2A
short iCompiledObjects; // As Integer ' 0x2C (44d) Number of objects compiled.
short iObjectsInUse; // As Integer ' 0x2E (46d) Updated in the IDE to correspond the total number ' but will go up or down when initializing/unloading modules.
int lpObjectArray; // As Long ' 0x30
int fIdeFlag; // As Long ' 0x34
int lpIdeData; // As Long ' 0x38
int lpIdeData2; // As Long ' 0x3C
int aProjectName; // As Long ' 0x40 NTS
int LangID1; // As Long ' 0x44
int LangID2; // As Long ' 0x48
int lpIdeData3; // As Long ' 0x4C
int dwIdentifier; // As Long ' 0x50
};
struct CodeObject{
int aObjectInfo; // As Long ' 0x00 Pointer to the Object Info for this Object.
int Const1; // As Long ' 0x04 Always set to -1 after compiling.
int aPublicBytes; // As Long ' 0x08 Pointer to Public Variable Size integers
int aStaticBytes; // As Long ' 0x0C Pointer to Static Variables Struct
int aModulePublic; // As Long ' 0x10 Pointer to Public Variables in DATA section
int aModuleStatic; // As Long ' 0x14 Pointer to Static Variables in DATA section
int aObjectName; // As Long ' 0x18 Name of the Object.
int ProcCount; // As Long ' 0x1C Number of Methods in Object
int aProcNamesArray;// As Long ' 0x20 If present, pointer to Method names array.
int oStaticVars; // As Long ' 0x24 Offset to Static Vars from aModuleStatic
int ObjectType; // As Long ' 0x28 Flags defining the Object Type.
int Null3; // As Long ' 0x2C Not valid after compilation.
};
struct ObjectInfo{
short wRefCount; // 0 As Integer ' Always 1 after compilation.
short ObjectIndex; // 2 As Integer '
int aObjectTable; // 4 As Long ' Pointer to the Object Table
int lpIdeData; // 8 Long ' Zero after compilation. Used in IDE only.
int lpPrivateObject; // 0xC As Long ' Pointer to Private Object Descriptor.
int dwReserved; // 0x10 As Long
int Null2; // 0x14 As Long
int aObject; // 0x18 As Long ' points to the parent tObject
int lpProjectData; // 0x1c As Long ' 0x1C [can someone verify this?]
short NumberOfProcs; // 0x20 As Integer
short wMethodCount2; // 0x22 As Integer ' Zeroed out after compilation. IDE only.
int lpMethods; // 0x24 As Long ' Pointer to Array of Methods.
short iConstantsCount; // 0x28 As Integer ' Number of Constants
short iMaxConstants; // 0x2A As Integer ' Maximum Constants to allocate.
int lpIdeData2; // 0x2C As Long
int lpIdeData3; // 0x30 As Long
int lpConstantPool; // 0x34 As Long 'can be immediatly followed by OptionalObjectInfo
};
int lpProcCallEngine = 0;
int rtcDoEvents = 0;
int twoLastOffset = 0;
void __declspec(naked) stubCall_two(){
_asm{
mov edx, twoLastOffset
mov ecx, lpProcCallEngine
jmp ecx
}
}
void main(void){
int rv = 0;
int constPool[20] = {0};
int lpProjObj[10] = {0};
ObjectTable objtable = {0};
CodeObject codeObj = {0};
ObjectInfo objInfo = {0};
typedef void (__stdcall *CreateIExprSrvObj)(int,int,int);
HMODULE h = (HMODULE)LoadLibrary("msvbvm60.dll");
lpProcCallEngine = (int)GetProcAddress(h,"ProcCallEngine");
rtcDoEvents = (int)GetProcAddress(h,"rtcDoEvents");
CreateIExprSrvObj IExprSrvObj = (CreateIExprSrvObj)GetProcAddress(h,"CreateIExprSrvObj");
//printf("ProcCallEngine = %x, CreateIExprSrvObj=%x\n", lpProcCallEngine,IExprSrvObj);
twoLastOffset = (int)&two + (0x401498 - 0x401490);
int mainLastOffset = (int)&SubMain + (0x4014D4 - 0x4014c8); //last offset - funcstart
constPool[0] = (int)&stubCall_two;
constPool[1] = rtcDoEvents;
IExprSrvObj(0,4,0); //initilize runtime just enough to work..
//printf("mainLastOffset = %x first = %x\n", mainLastOffset, (*(int*)mainLastOffset));
(*(int*)mainLastOffset) = (int)&objInfo; //patch RTMI of pcode to point to our dynamic ObjInfo Struct
(*(int*)twoLastOffset) = (int)&objInfo;
objInfo.aObject = (int)&codeObj;
objInfo.lpConstantPool = (int)&constPool;
objInfo.aObjectTable = (int)&objtable;
objtable.lpProjectObject = (int)&lpProjObj;
for(int i=0; i<2;i++){
_asm{
//int 3
mov edx, mainLastOffset
mov ecx, lpProcCallEngine
call ecx
mov rv, eax
}
//this sample does not take any args or return any values
printf("pcode call complete, calling again..\n");
}
printf("Press any key to exit...");
getch();
}

View File

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psc", "psc.vcproj", "{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.ActiveCfg = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Debug|Win32.Build.0 = Debug|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.ActiveCfg = Release|Win32
{F7BF03C0-A926-4A71-B419-529BE5651E0C}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,176 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="psc"
ProjectGUID="{F7BF03C0-A926-4A71-B419-529BE5651E0C}"
RootNamespace="psc"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="test.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath=".\main.cpp"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>