Показать сообщение отдельно

  #4  
Старый 24.11.2006, 20:07
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

Boomerang decompiler
Я тут недавно обнаружил на просторах sourceforge.net один проект - Boomerang decompiler. Скрины меня заинтриговали и я скачал его себе на винт вместе с исходниками и понял, что это вполне перспективная альтернатива Rec Studio.

Страничка: http://sourceforge.net/projects/boomerang/
или http://boomerang.sourceforge.net/

Бинарники: http://sourceforge.net/project/showf...group_id=48519

Сорцы доступны из CVS:
Код:
The Boomerang source is kept in CVS (Concurrent Versions System). To retrieve it use the following commands:

cvs -d:pserver:anonymous@boomerang.cvs.sourceforge.net:/cvsroot/boomerang login
(empty password)
cvs -z3 -d:pserver:anonymous@boomerang.cvs.sourceforge.net:/cvsroot/boomerang checkout -P boomerang
Скачать wincvstools для работы с CVS: http://members.lycos.nl/gkrol/files/wincvstools.zip


Замечу, что бинарники, которые выложены, нестабильны и часто падают (Access violation и все такое). Я слил сорцы, пересобрал у себя (сорцы под MS Visual Studio кстати) - работает стабильнее.
А вообще, это пока что альфа версия, но она уже по возможностям превосходит Rec Studio. Видны неплохие перспективы, и, если все пойдет по плану, то уже бетка должна выйти охрененной. Не говоря про релиз.
Так что пожелаем удачи разработчикам и не забудем про то, что это Open Source проект и вы имеете возможность внести свою лепту в его развитие.


Я решил провести экперименты с этим чудо-проектом.
1) хелловорлд.
Я скормил ему такой хеловорлд:
Код:
#include <windows.h>

#ifndef _DEBUG
#pragma comment(linker, "/NODEFAULTLIB /MERGE:.rdata=.text /MERGE:.data=.text /ALIGN:512 /ENTRY:main /SUBSYSTEM:windows")
#endif

size_t strlen(char* s)
{
	char* sp = s;
	while(*sp)
		sp++;
	return sp-s;
}


int main()
{
	char buffer[1024];
	wsprintf(buffer, "%d", strlen("String"));
	MessageBox(0, buffer, "Results", 0);
	return 0;
}
Оно выдало следующее:
Код:
void _start(char param1);

// address: 0x400220
int proc1(char *param1) {
    int eax; 		// r24
    int edx; 		// r26
    char *local0; 		// m[esp - 8]

    local0 = param1;
    edx = (int) *local0;
    while (edx != 0) {
        local0++;
        edx = (int) *local0;
    }
    eax = local0 - param1;
    return eax;
}

// address: 0x400249
void _start(char param1) {
    __size32 eax; 		// r24

    eax = proc1("String");
    wsprintfA(&param1, "%d", eax);
    MessageBoxA(0, &0x400218, "Results", 0);
    return;
}
Ясен перец, этот код нерабочий. Однако после нескольких изменений он стал компилиться и работать как оригинал:
Код:
#include <windows.h>
#define _start main
#define __size32 unsigned long
#define __size16 unsigned short

void _start(char param1);

// address: 0x400220
int proc1(char *param1) {
    int eax; 		// r24
    int edx; 		// r26
    char *local0; 		// m[esp - 8]

    local0 = param1;
    edx = (int) *local0;
    while (edx != 0) {
        local0++;
        edx = (int) *local0;
    }
    eax = local0 - param1;
    return eax;
}

// address: 0x400249
void _start() {
    __size32 eax; 		// r24
	char param1[1024];

    eax = proc1("String");
    wsprintfA(&param1, "%d", eax);
    MessageBoxA(0, &param1, "Results", 0);
    return;
}
Могу сказать одно - респект авторам!

ЗЫ. На досуге я попробую доработать это чудо природы, чтобы оно выдавало по возможности рабочий код.
 
Ответить с цитированием