最牛的算法程序员应该有能力看着可执行代码然后写出C++的源代码

「已注销」
博客专家认证
2012-03-04 12:19:18
不管您信不信,我认为专业的算法程序员应该有能力看着可执行的二进制代码(无论是Windows的还是Linux、无论是PC还是其他MIPS、ARM的)还原出C++的代码;从理论上,多数人认为这是技术不可行的 ----- 因为经过优化的二进制代码已经不再包含任何原始源码信息。但好的算法程序员应该有能力在读懂这些反向的汇编代码后,猜测出可能的C++代码 ---- 这是难点,更多的是靠经验;
这个技术看似神乎其神的能力,我认为这是一个成功算法工程师所必备的 ----- 因为只有这样,算法工程师才可能从商业软件中窥视出其设计精髓;
...全文
567 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
gnorth 2013-05-12
  • 打赏
  • 举报
回复
有啥好争的呢,你们都该去学学逆向一个游戏,在外挂作者眼里,“从理论上,多数人认为这是技术不可行的” 这种话说出来就是小白。
用户 昵称 2012-05-05
  • 打赏
  • 举报
回复
一个程序员,应该能够做到,在本行业内,别人能做,我就能做,别人怎么做,我能看懂。
feathersky 2012-05-02
  • 打赏
  • 举报
回复
哈哈 楼主绝对是菜鸟中的战斗机!!! 就像那些不懂电脑技术的人把黑客想象成无所不能似的

我随便写个5000行的代码 用代码混淆器混淆一下给你 估计你就看不懂 更别提2进制代码了

程序员之所以能读懂某些反向的汇编代码,是因为那些代码是一些功能模块的组合,而对于这些功能模块,程序员比较熟,或者功能模块较短,可以分析出来。 也就是说程序员只能看懂他熟悉的这部分汇编功能模块,并看懂他们之间的组合关系。

世界上的算法是无数的,想你如果不懂小波分析,时空域压缩,编码算法等等。给你一段mpeg4源代码(至少几万行)没注释,估计你看1年都看不懂,更何况是二进制,哈哈。

再例如你不懂微积分,只会+-法,你去看一个复杂的二次优化问题,估计你可以看一辈子了
「已注销」 2012-05-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

我知道lz牛x 但您不能暗示自己最牛x
这样你把你抄袭的对象放到哪里去了?
[/Quote]
不牛,只是一个老“菜鸟”,都工作20年了,见过太多的牛人,才觉得自己真的很菜,这是实话;这么大一把年龄还没事去“抄抄”别人的程序;抄袭确实是很不道德的行为,所以确实经常很内疚,但我觉得写出好程序有一个方法:善于学习别人的程序;无论您是通读Linux核心代码,还是反向别人的程序;
「已注销」 2012-05-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

哈哈 楼主绝对是菜鸟中的战斗机!!! 就像那些不懂电脑技术的人把黑客想象成无所不能似的

我随便写个5000行的代码 用代码混淆器混淆一下给你 估计你就看不懂 更别提2进制代码了

程序员之所以能读懂某些反向的汇编代码,是因为那些代码是一些功能模块的组合,而对于这些功能模块,程序员比较熟,或者功能模块较短,可以分析出来。 也就是说程序员只能看懂他熟悉的这部分汇编功能模块,并看懂他们之间……
[/Quote]
菜鸟中的战斗机我绝对承认:我在带算法部门的时候说的最多的是不要相信什么大牛,因为IT变换的太快;

这个帖子本来是我从事算法开发近十年的一个小心得,算是有感而发,首先关于楼上的我先回答一下:我这里不是讲反向技术,我只是说反向技术应该是一个算法工程师应该有的“伎俩”,您说的5000行代码太少了,我们做反向研究时一般目标代码都在1MBytes以上----相信几万行应该不止吧,至于说加密技术我没有讲过一定是加密后的代码,我不是反向工程师,对于简单加密的代码通过动态的办法往往很容易就能解,如早期用SoftICE,现在IDAPro本身就有动态执行的功能 ---- 切记一点对于任何基于软件的加密都是不可靠的;另外,我特别强调了算法工程师和反向工程师的区别:算法工程师首先他必须了解这个领域,所以才可能通过汇编代码“猜测”出完整的C/C++代码,而反向工程师仅仅是抄下来;最后再很负责任的讲一句:您说的几万行太小意思了吧,这个我们在几年前就做过:我自己就曾经亲自带领2个人的团队将一个视频程序完整反向出来过,并写出C++代码;另外再次强调,算法工程师不是万能的,我仅仅说的是我自己熟悉的领域,图形学和图像学的算法要求都完全不同,给一个图形学的算法工程师看几万行的图像学源码估计他会头痛的,不要说是汇编代码了;

本来是有感而发,没想到引起一些人的不快,最后说两句:
1)我说的这些不是"impossible",在几年前我们算法团队已经在这么作了。只是多数国内企业侧重于应用层面开发,至于您一定要拿一个我不熟悉的领域和我讲事我确实没有办法;
2)有这样技巧的我不觉得是什么“牛人”,至少我的组员有几个有这样的能力;正如我说的,这只是一个算法工程师应该有的“小伎俩”,我不认为有什么了不起;正如楼上说的,计算机算法涉及的面已经很广了,至少,我看图像学的算法工程师我觉得他们很“牛”,我看那些多媒体芯片工程师觉得他们更牛,甚至那些PHP或AS的工程师都令我仰视 ----- 因为我主要侧重的是图形学;
3)IT行业没有什么“牛人”,因为IT行业的技术变换太快、涉及的领域太多;唯有不断努力学习,反向技术的目的仅仅提供了一个“偷窥”一些商业软件的手段,他不是算法工程师的全部;

很感谢楼上的说出了我心里话,我一直觉得我很菜,所以这么大一把年龄还在努力学习,当然,也经常用IDAPro把别人的程序反出来:一直搞不懂人家的商业代码为什么比我的效能高;
deep_pro 2012-05-02
  • 打赏
  • 举报
回复
我知道lz牛x 但您不能暗示自己最牛x
这样你把你抄袭的对象放到哪里去了?
deep_pro 2012-05-02
  • 打赏
  • 举报
回复
最牛x的算法程序员还用偷学?应该是别人争着反汇编最牛x的算法程序员的程序才对

lz就像一个农民,以为皇帝就是一个扛着金锄头种田的人
cnmhx 2012-05-01
  • 打赏
  • 举报
回复
that's impossible!
luoxiaoshun 2012-05-01
  • 打赏
  • 举报
回复
没用看见过那么NB的人啊
duanrencai 2012-04-30
  • 打赏
  • 举报
回复
(多数芯片设计公司都有这样的部门,只是这些部门往往是最见不得人的)
其他领域何尝不是呢
猴头 2012-04-30
  • 打赏
  • 举报
回复
同意楼上
笨球 2012-04-29
  • 打赏
  • 举报
回复
算法工程师才可能从商业软件中窥视出其设计精髓
------------------
这句话是关键!
通过看汇编,猜C/C++算法,目的也就是给自己一个“偷学”别人算法的机会。
其实我们思路可以更广一点:最牛的程序员(不一定是算法程序员),一定是不断的通过“偷学”高手的代码来提高自己的!
至于如何偷学,那就八仙过海,各显神通啦,哈哈
「已注销」 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 woxuevc2009 的回复:]

你让软件逆向工程师情何以堪?要不他们去当算法程序员!!
[/Quote]
作算法的程序员应该适当懂些反向,但是一个反向工程师未必能成为算法工程师 ---- 这是关键;
之所以提到看着汇编代码写出C++,这已经不是反向工程师所能做到的 ---- 因为您首先是能通过汇编语言理解其中的算法,及本身您在这个方面就有些研究,这已经比一般的反向工程师有更多的要求;然后是根据您自己的理解写出C++代码,而非借助工具生搬硬套的写出C++/C代码 ---- 事实上多数程序在变成目标代码后甚至您已经无法确认之前是C写的还是C++写的了,更不要说单纯意义上的还原;所以我特指这应该是算法工程师应该掌握的小伎俩;
jack_fangdb 2012-03-04
  • 打赏
  • 举报
回复
笑而不语,你试试那些手机的语音抽样压缩解压加密解密编码算法试试,还C++? ARM一般用C
colorfulcode 2012-03-04
  • 打赏
  • 举报
回复
woxuevc2009 2012-03-04
  • 打赏
  • 举报
回复
你让软件逆向工程师情何以堪?要不他们去当算法程序员!!
「已注销」 2012-03-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jack_fangdb 的回复:]

笑而不语,你试试那些手机的语音抽样压缩解压加密解密编码算法试试,还C++? ARM一般用C
[/Quote]
呵呵,这个我还真有些发言权:之前作算法时,我带的部门有个组专门是作这个 ---- 反出的C++代码然后硬件IP部门用来设计实际的芯片;语音压缩我们没研究过,但我自己亲自把一个商业软件的图形引擎还原出来了,当然是还原成C++的代码了;最后被硬件IPCore拿来设计相关加速芯片;
多数芯片设计公司都有这样的部门,只是这些部门往往是最见不得人的
t1397018 2012-03-04
  • 打赏
  • 举报
回复
这叫OD,CRACKER知道不。。。。。。
1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. C语言复杂表达式的执行步骤 66 16. C语言字符串函数大全 68 17. C语言宏定义技巧 89 18. C语言实现动态数组 100 19. C语言笔试-运算符和表达式 104 20. C语言编程准则之稳定篇 107 21. C语言编程常见问题分析 108 22. C语言编程易犯毛病集合 112 23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与return的差别 141 30. extern与static存储空间矛盾 145 31. PC-Lint与C\C++代码质量 147 32. spirntf函数使用大全 158 33. 二叉树的数据结构 167 34. 位运算应用口诀和实例 170 35. 内存对齐与ANSI C中struct内存布局 173 36. 冒泡和选择排序实现 180 37. 函数指针数组与返回数组指针的函数 186 38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针 224 46. 标准C中字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言指针的奥秘 236 50. 游戏外挂的编写原理 254 51. 程序实例分析-为什么会陷入死循环 258 52. 空指针究竟指向了内存的哪个地方 260 53. 算术表达式的计算 265 54. 结构体对齐的具体含义 269 55. 连连看AI算法 274 56. 连连看寻路算法的思路 283 57. 重新认识:指向函数的指针 288 58. 链表的源码 291 59. 高质量的子程序 295 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 346 65. C指针讲解 352 66. 关于指向指针的指针 368 67. C/C++ 误区一:void main() 373 68. C/C++ 误区二:fflush(stdin) 376 69. C/C++ 误区三:强制转换 malloc() 的返回值 380 70. C/C++ 误区四:char c = getchar(); 381 71. C/C++ 误区五:检查 new 的返回值 383 72. C 是 C++ 的子集吗? 384 73. C和C++的区别是什么? 387 74. 无条件循环 388 75. 产生随机数的方法 389 76. 顺序表及其操作 390 77. 单链表的实现及其操作 391 78. 双向链表 395 79. 程序员数据结构笔记 399 80. Hashtable和HashMap的区别 408 81. hash 表学习笔记 410 82. C程序设计常用算法代码 412 83. C语言有头结点链表的经典实现 419 84. C语言惠通面试题 428 85. C语言常用宏定义 450

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧