-
-
一个反编译的东东 好玩 玩的过程记录了下
-
发表于:
2007-12-3 21:01
8487
-
在网上找点项目做做的,未遂,看到一个反编译软件,瞒好玩的,所以测试下,有点效果
文中的工具在 http://www.backerstreet.com/rec/recdload.htm可以下载
一:写了个冒泡排序 = = 见程序1
WIN32 VC7.0 release方式 编译
二:用工具反编译了下 程序见 程序2 图片见本文末尾
三:刚开始竟然没有看懂 一看就是错的程序吗 但是还是移值到VC++7.0一下 看来多重循环效果查了点,反编译其他的程序,效果还可以,参数什么的都能填出来
四:移植后编译了下,竟然运行正确在release下是正确的 在DEBUG模式下是正确的 具体原因么,自己OD下。
程序1:
int _tmain(int argc, _TCHAR* argv[])
{
int a[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
int temp;
int i, j;
for(i = 0; i < 10; i++)
{
for(j = i+1; j < 10; j ++)
{
if(a[i] > a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for(i = 0; i < 10; i++)
printf("%d ", a[i]);
}
程序 2
用工具反编译了下 结果是
L00401000()
{
/* unknown */ void Vc;
/* unknown */ void ebx;
/* unknown */ void V10;
/* unknown */ void esi;
/* unknown */ void edi;
/* unknown */ void V14;
/* unknown */ void V18;
/* unknown */ void V1c;
/* unknown */ void V20;
/* unknown */ void V24;
/* unknown */ void V28;
/* unknown */ void V2c;
/* unknown */ void V30;
edi = 1;
Vc = 9;
V10 = 8;
V14 = 7;
V18 = 6;
V1c = 5;
V20 = 4;
V24 = 3;
V28 = 2;
V2c = 1;
V30 = 0;
edx = & Vc;
ebx = 0xa;
do {
esi = edi;
if(edi < 0xa) {
do {
eax = *(esp + esi * 4 + 0xc);
ecx = *edx;
if(ecx > eax) {
*edx = eax;
*(esp + esi * 4 + 0xc) = ecx;
}
esi = esi + 1;
} while(esi < 0xa);
}
edi = edi + 1;
edx = edx + 4;
} while(ebx = ebx - 1);
esi = 0;
do {
L004010A7(0x4060fc, *(esp + esi * 4 + 0xc));
esi = esi + 1;
} while(esi < 0xa);
return 0;
}
程序 3
int _tmain(int argc, _TCHAR* argv[])
{
/* unknown */ int Vc;
/* unknown */ int ebx;
/* unknown */ int V10;
/* unknown */ int esi;
/* unknown */ int edi;
/* unknown */ int V14;
/* unknown */ int V18;
/* unknown */ int V1c;
/* unknown */ int V20;
/* unknown */ int V24;
/* unknown */ int V28;
/* unknown */ int V2c;
/* unknown */ int V30;
int eax, ecx; //把寄存器改成变量 - -
int *edx;
int a[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; // 之所以加这个是因为*(esp + esi * 4 + 0xc); //这里的 ESP基于堆栈, 要把ESP换成a 数组的首地址。
int *esp;
esp = a;
edi = 1;
Vc = 9;
V10 = 8;
V14 = 7;
V18 = 6;
V1c = 5;
V20 = 4;
V24 = 3;
V28 = 2;
V2c = 1;
V30 = 0; // 这些东西其实是 ESP+XX的东西 这里用 a[10]代替了 IDA也会分析出来这个 后面有的地方用到这些变量 所以 a[10]不能完全代替 = =
edx = & Vc;
ebx = 0xa;
do {
esi = edi;
if(edi < 0xa) {
do {
eax = *(esp + esi * 4 + 0xc);
ecx = *edx;
if(ecx > eax) {
*edx = eax;
*(esp + esi * 4 + 0xc) = ecx;
}
esi = esi + 1;
} while(esi < 0xa);
}
edi = edi + 1;
edx = edx + 4;
} while(ebx = ebx - 1); // 这句比较郁闷, 刚开始一看,怎么结束条件是这个,以为肯定错了,幸亏还是移植了下
/* esi = 0;
do {
L004010A7(0x4060fc, *(esp + esi * 4 + 0xc)); // 这个是pintf函数 反编译的效果还是很好的 怕改了 知道就好 下面自己实现
esi = esi + 1;
} while(esi < 0xa);*/
for(int i = 0; i < 10; i++)
printf("%d ", a[i]);
return 0;
}
反编译的效果
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课