user-0 提问: ~~看C反汇编代码的困惑~~~

回复:
user: user-0
content: 感谢各位老师、同学们的热心回复！ 就此结贴吧，祝大家每天都开心、工作顺利、学习长进快！

user: user-1
content: 1）这个是由两层循环组成的，可以使用for循环。 2）ptr ss:[esp+0x10],是一个局部变量，我们暂且命名他为count 3）mov edx,dword ptr ss:[esp+0x14]实际还是esp+10。因为之前有个push操作，所以之后会有add esp,0x4 所以应该只有一个局部变量。大致样子应该可以看出来

user: user-2
content: 搜“白盒测试”。 汇编语言asm→obj1 C/C++语言→obj2 link obj1+obj2→exe或dll 只要保证“堆栈平衡”，“调用参数约定和返回值约定一致”即可。 调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx 你走入了误区。根本不需要“从汇编转换到C”这项技能。

user: user-1
content: 就代码说事： 1）首先明确这个代码应该不是C++代码；如果是C++代码，会有ecx传入this指针，这样如果是ecx的某个偏移，就可以认定是类成员变量 2）反汇编首先要明白局部变量时保存在哪里。这个“dword ptr ss:[esp+0x140]”应该是局部变量。在函数调用时，局部变量时保留在堆栈上。 关于反汇编建议看卡巴斯基《黑客反汇编揭秘》，建议看第一版，不要看新的第二版本；那个是经典  关于IDAPro说明几条： 1）Windows代码，如果是Release代码，除非是dll库，不要指望可以反汇编出函数名。但Linux代码有机会 2）任何情况，成员变量和局部变量都是无法反汇编出来的。所以，如果辨识出变量，自己命名就好了 3）对于C++一定注意ecx，这是this指针，多数是突破口 4）C++中虚函数几乎无法反汇编，需要动态执行才可以确认。 5）不要迷信IDAPro那个自动将汇编变成C代码，那个功能基本是鸡肋：反汇编出来代码几乎不可读。我们都是手工反汇编。

user: user-0
content: 感谢各位老师、同学的帮助！我想了又想，还是直接用代码来说明我的问题吧。下面的汇编代码是我用C写的一个函数的反汇编结果，源代码很简单，但当我不回忆源代码，直接看它的汇编，尝试还原的时候麻烦就来了。请各位老师、同学试着还原，期间我再提出让我头晕的问题点。有劳各位了，先祝大家天天开心，看完后也能让我跟着大家一块开心，谢谢！  00401000   push ecx                                 00401001   push ebx 00401002   push ebp 00401003   xor ebp,ebp 00401005   push esi 00401006   push edi 00401007   mov dword ptr ss:[esp+0x10],ebp 0040100B   xor edi,edi 0040100D   test ebp,ebp 0040100F   jl short 00401048 00401011   test edi,edi 00401013   jl short 00401032 00401015   lea eax,dword ptr ds:[edi+ebp] 00401018   lea ebx,dword ptr ds:[edi+0x1] 0040101B   lea esi,dword ptr ds:[eax+eax*4] 0040101E   shl esi,1 00401020   push esi 00401021   push 0x407034                         ;  ASCII "%d " 00401026   call 00401110 0040102B   add esp,0x8 0040102E   inc esi 0040102F   dec ebx 00401030   jnz short 00401020 00401032   push 0x407030                          ;  ASCII "\r\n" 00401037   call 00401110  0040103C   mov eax,dword ptr ss:[esp+0x14] 00401040   add esp,0x4 00401043   inc edi 00401044   cmp edi,eax 00401046   jle short 00401011                      00401048   push 0x407030                           ;  ASCII "\r\n" 0040104D   call 00401110                            00401052   mov edx,dword ptr ss:[esp+0x14] 00401056  add esp,0x4 00401059  add ebp,0xA 0040105C  inc edx 0040105D  cmp ebp,0x64 00401060  mov dword ptr ss:[esp+0x10],edx 00401064  jl short 0040100B 00401066  pop edi            00401067  pop esi            00401068  pop ebp            00401069  pop ebx            0040106A  pop ecx            0040106B  retn

user: user-0
content: 是我没表达清楚，在研究逆向，面对上面的问题不知道接下来应该怎么走了。

user: user-2
content: 《程序员的自我修养——链接、装载与库》

user: user-2
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George  前微软C#编辑器的开发主管Jay Bazuzi列出的一些有助于找到正确方向的问题；他觉得前同事们应该用这些问题来问自己；实际上不管在哪里工作的开发者们都应该经常问问自己这些问题： ◆“要保证这个问题不会再出现，我该怎么做？” ◆“要想少出些Bug，我该怎么做？” ◆“要保证Bug容易被修复，我该怎么做？” ◆“要保持对变化的快速响应，我该怎么做？” ◆“要保证我的软件的运行速度，我该怎么做？” 如果大多数团队都能不时问一下自己，必定会从中得益，因为这些都是真正强而有力的问题。

user: user-2
content: 没必要还原。 直接将asm格式的反汇编模块和C/C++代码链接到一起即可。

user: user-3
content: 反汇编后的代码本来理解起来肯定是会困难  推荐先去看这本书：《C++反汇编与逆向分析技术揭秘》   虽然是C++的，但前面大部分内容适用于C

user: user-4
content: 其实全局变量应很好看才对， gnu的编译器会把全局变量统一放到程序镜像的数据段里的，直接反汇编就可以看到了。至于局部变量，只能通过对它的操作来区别了。

user: user-5
content: 使用IDA这种反编译软件，能够把二进制文件翻译成类c的伪代码。

user: user-6