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(¶m1, "%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(¶m1, "%d", eax);
MessageBoxA(0, ¶m1, "Results", 0);
return;
}
Могу сказать одно - респект авторам!
ЗЫ. На досуге я попробую доработать это чудо природы, чтобы оно выдавало по возможности рабочий код.