1. Detecting a C translated bound program
- Posted by OtterDad <otter at full?moon.co?> Oct 25, 2007
- 586 views
I have a couple of programs that refuse to behave when bound into C, but behave just fine when simply bound with the interpreter. Specific reasons for failure aren't important for this discussion. Occasionally I step on my own toes and accidentally bind a program incorrectly. Is there a way I can tell from within the bound program itself if it was translated into C so I can catch my own mistake prior to deployment? BTW I'm still using Euphoria Version 2.4. Yours, OtterDad Don't sweat it -- it's not real life. It's only ones and zeroes. Gene Spafford
2. Re: Detecting a C translated bound program
- Posted by Juergen Luethje <j.lue at gm??de> Oct 25, 2007
- 576 views
OtterDad wrote: > I have a couple of programs that refuse to behave when bound into C, but > behave > just fine when simply bound with the interpreter. Specific reasons for failure > aren't important for this discussion. Occasionally I step on my own toes and > accidentally bind a program incorrectly. Is there a way I can tell from within > the bound program itself if it was translated into C so I can catch my own > mistake > prior to deployment? BTW I'm still using Euphoria Version 2.4. You can for instance link a resource that contains version information with your translated & compiled EXE programs. In contrast, a program that is bound to the intepreter does not contain version information. Later you can right-click on your EXE file and select "properties" from the context menu. If you see a tab with version information, then it's a translated & compiled executable -- if not, it's either a bound executable, or you forgot to link the resource. Regards, Juergen
3. Re: Detecting a C translated bound program
- Posted by Matt Lewis <matthewwalkerlewis at gmail?c?m> Oct 25, 2007
- 574 views
OtterDad wrote: > > I have a couple of programs that refuse to behave when bound into C, but > behave > just fine when simply bound with the interpreter. Specific reasons for failure > aren't important for this discussion. Occasionally I step on my own toes and > accidentally bind a program incorrectly. Is there a way I can tell from within > the bound program itself if it was translated into C so I can catch my own > mistake > prior to deployment? BTW I'm still using Euphoria Version 2.4. I'll assume you mean translated, compiled and linked. It's more difficult (and probably impossible in 2.4) to do this if you're using a bound executable. You could define a constant and set it to zero. Before running emake, edit init.c (or wherever it gets assigned, maybe in one of the main*.c files) to set the constant to 1. Matt
4. Re: Detecting a C translated bound program
- Posted by Pete Lomax <petelomax at blueyonde?.co.?k> Oct 25, 2007
- 562 views
OtterDad wrote: > > I have a couple of programs that refuse to behave when bound into C, but > behave just fine when simply bound with the interpreter. > Is there a way I can tell from within the bound program itself if it was > translated into C so I can catch my own mistake prior to deployment? > BTW I'm still using Euphoria Version 2.4. If that last point is unlikely to change, you could use the entry point:
cl=command_line() if equal(cl[1],cl[2]) then -- prog is bound or translated fn=open(cl[1],"rb") void = seek(fn,#A8) ep={getc(fn),getc(fn),getc(fn),getc(fn)} close(fn) if equal(ep,{#10,#0F,#03,#00}) then -- Eu 2.4 exw entry point, I think else -- assume eu2c'd
The above is completely untested, btw. Alternatively you could try patching a 1 at offset #7F into any .exe you create via eu2c and assume that all versions of eu (/bound files) will have a 0 there, or examine the PE headers (I use OllyDebug) and see if there is anything else that sticks out, maybe an EC.LIB section, (I'm guessing now). Regards, Pete
5. Re: Detecting a C translated bound program
- Posted by OtterDad <otter at full?m?on.com> Oct 25, 2007
- 569 views
Pete Lomax wrote: > > OtterDad wrote: > > > > I have a couple of programs that refuse to behave when bound into C, but > > behave just fine when simply bound with the interpreter. > > Is there a way I can tell from within the bound program itself if it was > > translated into C so I can catch my own mistake prior to deployment? > > > BTW I'm still using Euphoria Version 2.4. > If that last point is unlikely to change, you could use the entry point: > }}} <eucode> > cl=command_line() > if equal(cl[1],cl[2]) then -- prog is bound or translated > fn=open(cl[1],"rb") > void = seek(fn,#A8) > ep={getc(fn),getc(fn),getc(fn),getc(fn)} > close(fn) > if equal(ep,{#10,#0F,#03,#00}) then -- Eu 2.4 exw entry point, I think > else -- assume eu2c'd > </eucode> {{{ > The above is completely untested, btw. > Alternatively you could try patching a 1 at offset #7F into any .exe you > create > via eu2c and assume that all versions of eu (/bound files) will have a 0 > there, > or examine the PE headers (I use OllyDebug) and see if there is anything else > that sticks out, maybe an EC.LIB section, (I'm guessing now). > > Regards, > Pete that's more what i was looking for. thanks pete. i'll try it and report back. Yours, OtterDad Don't sweat it -- it's not real life. It's only ones and zeroes. Gene Spafford
6. Re: Detecting a C translated bound program
- Posted by OtterDad <otter at ?ull-moon.c?m> Oct 26, 2007
- 598 views
OtterDad wrote: > > Pete Lomax wrote: > > > > OtterDad wrote: > > > > > > I have a couple of programs that refuse to behave when bound into C, but > > > behave just fine when simply bound with the interpreter. > > > Is there a way I can tell from within the bound program itself if it was > > > translated into C so I can catch my own mistake prior to deployment? > > > > > BTW I'm still using Euphoria Version 2.4. > > If that last point is unlikely to change, you could use the entry point: > > }}} <eucode> > > cl=command_line() > > if equal(cl[1],cl[2]) then -- prog is bound or translated > > fn=open(cl[1],"rb") > > void = seek(fn,#A8) > > ep={getc(fn),getc(fn),getc(fn),getc(fn)} > > close(fn) > > if equal(ep,{#10,#0F,#03,#00}) then -- Eu 2.4 exw entry point, I think > > else -- assume eu2c'd > > </eucode> {{{ > > The above is completely untested, btw. > > Alternatively you could try patching a 1 at offset #7F into any .exe you > > create > > via eu2c and assume that all versions of eu (/bound files) will have a 0 > > there, > > or examine the PE headers (I use OllyDebug) and see if there is anything > > else > > that sticks out, maybe an EC.LIB section, (I'm guessing now). > > > > Regards, > > Pete > > that's more what i was looking for. thanks pete. i'll try it and report back. > > Yours, OtterDad > > Don't sweat it -- it's not real life. It's only ones and zeroes. Gene Spafford
include Win32lib.ew without warning -------------------------------------------------------------------------------- -- Window Window1 constant Window1 = createEx( Window, "Window1", 0, Default, Default, 283, 97, 0, 0 ) -------------------------------------------------------------------------------- object cl, void, ep atom fn cl=command_line() if equal(cl[1],cl[2]) then -- prog is bound or translated fn=open(cl[1],"rb") void = seek(fn,#A8) ep={getc(fn),getc(fn),getc(fn),getc(fn)} close(fn) if equal(ep,{#10,#0F,#03,#00}) then -- Eu 2.4 exw entry point, I think warnErr("bound with translator") else -- assume eu2c'd warnErr("bound with C") end if else warnErr("executed with translator") end if WinMain( Window1,Normal )
on my machine bound with Eu 2.4, and translated using watcom, both bound programs report Bound with C Yours, OtterDad Don't sweat it -- it's not real life. It's only ones and zeroes. Gene Spafford
7. Re: Detecting a C translated bound program
- Posted by Pete Lomax <petelomax at bl?eyonder.co.uk> Oct 26, 2007
- 582 views
OtterDad wrote: > > Pete Lomax wrote: > > > The above is completely untested, btw. On closer inspection it has a UPX0 section in there which changes size and entry point every time, didn't realise that. On an equally unsure footing, you may be able to check for the UPX0 section as an indicator, if eu2c applies upx then I'm out of ideas. Anyway, fingers crossed: > }}} <eucode> >-- void = seek(fn,#A8) > void = seek(fn,#178) >-- if equal(ep,{#10,#0F,#03,#00}) then > if equal(ep,"UPX0") then > </eucode> {{{ Seems to identify bound eu programs for me anyway. Regards, Pete
8. Re: Detecting a C translated bound program
- Posted by Matt Lewis <matthewwalkerlewis at gma??.com> Oct 26, 2007
- 601 views
OtterDad wrote: > > on my machine bound with Eu 2.4, and translated using watcom, both bound > programs > report Bound with C > Here's a simple demonstration of how to implement my idea:
--translate.ex include misc.e integer interpreted -- This if statement is to fool the tranlator's optimizer if platform() = WIN32 then interpreted = 1 else interpreted = 0 end if if not interpreted then puts(1, "I'm translated!\n") else puts(1, "I'm interpreted!\n") end if
After translating, I edited main-.c to make sure that _1interpreted was always set to 0. Of course, your file may look a bit different, since you're using 2.4 (and the optimizer might not be as aggressive, either), but the idea is the same. // main-.c // Euphoria To C version 3.1.1 #include <time.h> #include "C:\EUPHORIA\include\euphoria.h" #include "main-.h" int Argc; char **Argv; unsigned default_heap; __declspec(dllimport) unsigned __stdcall GetProcessHeap(void); unsigned long *peek4_addr; unsigned char *poke_addr; unsigned long *poke4_addr; struct d temp_d; double temp_dbl; char *stack_base; int total_stack_size = 262144; void __stdcall WinMain(void *hInstance, void *hPrevInstance, char *szCmdLine, int iCmdShow) { int _0, _1, _2; int argc; char **argv; default_heap = GetProcessHeap(); argc = 1; Argc = 1; argv = make_arg_cv(szCmdLine, &argc); winInstance = hInstance; stack_base = (char *)&_0; _02 = (int**) malloc( 4 * 3 ); _02[0] = (int*) malloc( 4 ); _02[0][0] = 2; _02[1] = (int*) malloc( 4 * 2 ); _02[1][0] = 1; _02[1][1] = 2; _02[2] = (int*) malloc( 4 * 1 ); _02[2][0] = 0; eu_startup(_00, _01, _02, 1, (int)CLOCKS_PER_SEC, (int)CLK_TCK); init_literal(); shift_args(argc, argv); RefDS(_150); _2PI = _150; _2PI_HALF = NewDouble(DBL_PTR(_2PI)->dbl / DBL_PTR(_151)->dbl); // if platform() = WIN32 then // interpreted = 1 _1interpreted = 0; goto L1; L2: // interpreted = 0 _1interpreted = 0; L1: // if not interpreted then if (_1interpreted != 0) goto L3; // puts(1, "I'm translated!\n") EPuts(1, _179); goto L4; L3: // puts(1, "I'm interpreted!\n") EPuts(1, _180); L4: Cleanup(0); }
9. Re: Detecting a C translated bound program
- Posted by OtterDad <otter at ful?-moon.c?m> Oct 26, 2007
- 594 views
Pete Lomax wrote: > > OtterDad wrote: > > > Pete Lomax wrote: > > > > The above is completely untested, btw. > On closer inspection it has a UPX0 section in there which changes size and > entry > point every time, didn't realise that. On an equally unsure footing, you may > be able to check for the UPX0 section as an indicator, if eu2c applies upx > then > I'm out of ideas. Anyway, fingers crossed: > > }}} <eucode> > >-- void = seek(fn,#A8) > > void = seek(fn,#178) > >-- if equal(ep,{#10,#0F,#03,#00}) then > > if equal(ep,"UPX0") then > > </eucode> {{{ > Seems to identify bound eu programs for me anyway. > > Regards, > Pete Worked like a champ! Let me pretty up the code and I'll publish the function. Maybe it will come in handy for somebody else. Does it also work with 3.1.1? Thanks again! You saved me much embarrassment. Yours, OtterDad Don't sweat it -- it's not real life. It's only ones and zeroes. Gene Spafford