能力值:
( LV2,RANK:10 )
126 楼
root60931讲得有道理,这种情况确实有可能存在。出现这种情况,我上面说的简单办法就失效了
这样检测函数参数个数的方法得改进改进了。
深入到函数内部去,看其对参数的引用情况,再结合外面的Push情况,综合考虑。
但遇到某些变态函数,有参数,但在函数内部就是不使用这些参数。情况又不确定了。。。。。
各位有啥好主意呢?
能力值:
( LV2,RANK:10 )
127 楼
[QUOTE='day[WG];705258']熬夜一年多?
为楼主捏了一把汗!
还有,楼主的目标真的很强大.[/QUOTE]
没办法,白天上班,只能晚上敲敲代码了。
能力值:
( LV2,RANK:10 )
128 楼
牛人!!好崇拜啊
能力值:
(RANK:1060 )
129 楼
基本上没有万金油啊
能力值:
( LV2,RANK:10 )
130 楼
您指的是确定函数参数个数问题?
root60931提到的情况应该在实际编译器中不会出现吧?????
不确定,目前还没碰到过这种情况。
能力值:
( LV9,RANK:170 )
131 楼
貌似在两个代码框下就无法再按反编译键,想打开第二个文件还要回到函数列表框里。
鉴于是演示版自然不能要求太高。主要功能实现的不错,再接再厉。
个人期待能开发相应的OD插件,对局部函数代码进行解析。这样意义会更大一些。
毕竟,目前很少会有人想完全逆向一个很复杂的程序,也往往没这个必要。关键代码的解析更实用。
能力值:
(RANK:420 )
132 楼
能力值:
( LV9,RANK:170 )
133 楼
奇怪,我随便用VC6.0编译一段代码,用这个工具就蹦了
代码如下:
#include <stdio.h>
int main()
{
return 0;
}
编译后的PE文件:
test.rar
测试平台 vista.
烦请楼主解释一下原因,谢谢!
上传的附件:
能力值:
( LV2,RANK:10 )
134 楼
我用xp平台运行了c-decompier反编译你给出的例子,是没问题的。
c-decompuler是从我的网站上下载的:
http://www.c-decompiler.com/C-Decompiler.rar
不知你用的是从哪里下载的。
难道你是在vista环境下运行该反编译器的?
我到是从没在vista运行过,不知道在vista下能正确反编译给出的例子否?
能正确反编译的话,估计反编译你这个例子应该没问题的。
感谢你的测试,下次我得到vista平台运行试试看。
能力值:
( LV2,RANK:10 )
135 楼
我测试了一下,不支行DLL
能力值:
(RANK:420 )
136 楼
能力值:
( LV2,RANK:10 )
137 楼
To Rock大牛,
当前版本的c-decompiler运行您这个exe, 挂了
等以后版本稳定了,再帮您试试。
能力值:
( LV2,RANK:10 )
138 楼
TO dnybz,
确实不支持dll
能力值:
(RANK:420 )
139 楼
Ps. 我不是大牛. >.<
那那個 C code 呢?
Compiling C code ----> exe ----> Decompiling exe -----> C code.
我指的是在 http://bbs.pediy.com/showthread.php?t=89799 的那個 source code.
可行嗎?
謝謝。
能力值:
( LV2,RANK:10 )
140 楼
修掉rock源代码中的编译小错误,编译后生成exe试了一下。
整体流程还在,两个malloc函数给丢失了。。。。
下面是反出来的代码
// Proc: _tmain
int _tmain(int argc, _TCHAR argv)
{
int loc1;
int loc2;
int loc3;
int loc4;
int loc5;
int loc6;
int loc7; /* esp */
int loc8; /* eax */
int loc9; /* ecx */
int loc10; /* edx */
int loc11; /* Dmy */
int loc12; /* ebp */
loc1 = 2;
while ((loc1 > 19)) {
printf ();
loc7 = (loc7 + 4);
loc8 = &loc1;
scanf ();
loc7 = (loc7 + 8);
} /* end of while */
loc8 = loc1;
loc8 = (loc8 & 0x80000001);
if loc8--;
loc8 = (loc8 | 0xFFFFFFFE);
loc8++;
}
goto L1;
}
else {
loc8 = loc1;
loc8 = (loc8 << 2);
malloc ();
loc7 = (loc7 + 4);
loc2 = loc8;
loc8 = loc1;
loc8 = (loc8 << 2);
malloc ();
loc7 = (loc7 + 4);
loc9 = loc2;
= loc8;
loc8 = loc2;
printf ();
loc7 = (loc7 + 8);
loc3 = 0;
loc8 = loc1;
loc8 = (loc8 - 1);
loc8 = loc8;
loc8 = (loc8 - loc10);
loc8 = (loc8 >> 1);
loc4 = loc8;
loc5 = 0;
while ((loc8 < loc1)) {
loc8 = loc5;
loc6 = 0;
while ((loc8 < loc1)) {
loc8 = loc6;
loc8 = loc5;
loc9 = loc2;
loc10 = ;
loc8 = loc6;
= 0;
loc8 = loc6;
loc8 = (loc8 + 1);
loc6 = loc8;
} /* end of while */
loc8 = loc5;
loc8 = (loc8 + 1);
loc5 = loc8;
} /* end of while */
loc8 = loc3;
loc9 = loc2;
loc10 = ;
loc8 = loc4;
= 1;
loc5 = 2;
while ((loc5 <= loc8)) {
loc8 = loc1;
loc8 = (loc8 * loc1);
loc8 = loc1;
loc9 = loc3;
loc11 = loc9;
loc11 = (loc11 + loc8);
loc11 = (loc11 + 0xFFFFFFFF);
loc8 = loc11;
loc11 = loc8;
loc8 = (loc11 / loc1);
loc10 = (loc11 % loc1);
loc3 = loc10;
loc8 = loc4;
loc8 = (loc8 + 1);
loc11 = loc8;
loc8 = (loc11 / loc1);
loc10 = (loc11 % loc1);
loc4 = loc10;
loc8 = loc2;
loc9 = ;
loc10 = loc3;
loc8 = ;
loc8 = (loc8 + loc4);
if loc8 = loc3;
loc8 = (loc8 + 2);
loc11 = loc8;
loc8 = (loc11 / loc1);
loc10 = (loc11 % loc1);
loc3 = loc10;
loc8 = loc1;
loc9 = loc4;
loc11 = loc9;
loc11 = (loc11 + loc8);
loc11 = (loc11 + 0xFFFFFFFF);
loc8 = loc11;
loc11 = loc8;
loc8 = (loc11 / loc1);
loc10 = (loc11 % loc1);
loc4 = loc10;
}
loc8 = loc3;
loc9 = loc2;
loc10 = ;
loc8 = loc4;
loc9 = loc5;
= loc9;
loc8 = loc5;
loc8 = (loc8 + 1);
loc5 = loc8;
} /* end of while */
loc8 = loc1;
printf ();
loc7 = (loc7 + 8);
loc5 = 0;
loc8 = loc5;
if (loc8 < loc1) {
loc6 = 0;
while ((loc8 < loc1)) {
loc8 = loc6;
loc8 = loc2;
loc9 = ;
loc10 = loc5;
loc11 = loc10;
loc11 = (loc11 * 4);
loc11 = (loc11 + loc9);
loc8 = loc11;
loc9 = loc6;
loc10 = ;
printf ();
loc7 = (loc7 + 8);
loc8 = loc6;
loc8 = (loc8 + 1);
loc6 = loc8;
} /* end of while */
printf ();
loc7 = (loc7 + 4);
loc8 = loc5;
loc8 = (loc8 + 1);
loc5 = loc8;
}
else {
printf ();
loc7 = (loc7 + 4);
loc8 = 0;
loc9 = loc12;
loc10 = 0x411D4F;
loc7 = (loc7 + 264);
return (loc8);
}
}
}
能力值:
( LV2,RANK:10 )
141 楼
演示版本距离实战还差十万八千里啊
能力值:
(RANK:420 )
142 楼
好的開始是成功的一半。
能力值:
( LV9,RANK:170 )
143 楼
我是在vista下测试的。你给的例子能够反编译。但自己编写的这个例子就不行了。
我就是下载你顶楼提供的那个连接。我又下了一遍,测试结果一样。
出错的地方我截图给你看吧。
上图是运行出错后弹出调试界面的截图。
楼主不妨考虑一下原因,加油吧
上传的附件:
能力值:
( LV2,RANK:10 )
144 楼
[QUOTE=kaien;706260]我是在vista下测试的。你给的例子能够反编译。但自己编写的这个例子就不行了。
我就是下载你顶楼提供的那个连接。我又下了一遍,测试结果一样。
出错的地方我截图给你看吧。
上图是运行出错后弹出调试界面的截图。
楼主不妨考虑一下原因,加油吧[/QUOTE]
感谢kaien的热心。我这边没有vista平台。但我大概猜到是甚么原因了。
应该是在检测识别Main函数的地方出错了。
VC6,VC2003,VC2005,VC2008 的main函数识别都是在xp平台下进行的。vista平台的main'函数识别可能与XP不一样。
win2000,win2003,vista,win7等等的main函数识别以后再一起加进去了。
能力值:
( LV3,RANK:20 )
145 楼
能力值:
( LV2,RANK:10 )
146 楼
非常感谢doking提供该论文。很简短的一篇博士论文(103页)。
连夜拜读,其对应的开源工具在此:
http://idc.sourceforge.net/wiki/
自动反编译和交互式反编译相结合是比较好的解决方法。
完全自动反编译理论上是做不到的,某些情况下借助人工交互能起到很好的效果。
大家发现甚么其他资料,一起分享,众人拾柴火焰高!
再次感谢doking
能力值:
( LV2,RANK:10 )
147 楼
以前用IDA+手工做过几个大的项目的逆向,感觉要反编译STL难度极大。
像vector, set, map, list 等容器类, 对象直接嵌入其中,所以不同的对象
就会产生不同的代码,而且不同的编译器版本,优化等,产生的代码差异也会
很大。
能力值:
( LV2,RANK:10 )
148 楼
路漫漫。。 祝 幸运常伴!
能力值:
( LV2,RANK:10 )
149 楼
To QQQWLX,
STL的反编译确实难度极大。正在想办法解决中。有兴趣的话,咱两交流交流。第一帖有我的邮箱。
能力值:
( LV2,RANK:10 )
150 楼
谢谢cxjin