一个简单C程序的反编译。

本代码只作为学习用,没有任何实用价值。限于水平,反编译的分析结果也不够彻底,供初学者参考。

先看C代码:

代码不太多,没有写注释,核心代码只有一句:really_code[idx] = (key[idx] ^ SECRET_TAB[idx % 10]) % 26 + 'A';

编译选项:/Ox 最大限度的最适化。

下面是IDAPRO反编译的结果,只分析两个函数main和Register:

.text:00409E94 ; int __cdecl main(int argc,const char **argv,const char *envp)
.text:00409E94 _main           proc near               ; CODE XREF: ___tmainCRTStartup+15Ap
.text:00409E94
.text:00409E94 var_1E          = byte ptr -1Eh               ; 02h byte 没有用到,不知道有什么用处
.text:00409E94 var_1C          = byte ptr -1Ch               ; 0Bh byte 其实是和下面的1字节连在一起的,还是12字节
.text:00409E94 var_11          = byte ptr -11h               ; 01h byte
.text:00409E94 var_10          = byte ptr -10h               ; 0Ch byte
.text:00409E94 var_4           = dword ptr -4                ; 04h byte 临时变量,供防止缓冲区溢出使用
                                                             ; 请注意上面的字节分配,编译器考虑了内存对齐的问题,分配的大小在程序中不一定会全部用到
.text:00409E94 argc            = dword ptr  8                ; main函数的第1个参数
.text:00409E94 argv            = dword ptr  0Ch              ; main函数的第2个参数
.text:00409E94 envp            = dword ptr  10h              ; main函数的第3个参数,尽管我们没有设置,系统也会设置
.text:00409E94
.text:00409E94                 push    ebp                   ; 入栈ebp
.text:00409E95                 mov     ebp, esp              ; 把esp保存到ebp
.text:00409E97                 sub     esp, 1Ch              ; 在堆栈上空出1Ch字节的空间
.text:00409E9A                 mov     eax, dword_40C284     ; 和防止堆栈溢出有关,dword_40C284是个根据时间和其他东西算出来的一个值,具体要看调用main之前被调用的方法
.text:00409E9F                 xor     eax, ebp              ; 异或运算,结果保存在eax
.text:00409EA1                 mov     [ebp+var_4], eax      ; 把结果保存在临时变量,因为eax后面要被重写
; 以下是程序正式的代码
.text:00409EA4                 call    sub_4010CD            ; 注意这里,eax作为指针指向一块数据区
.text:00409EA9                 push    eax                   ; FILE * 文件指针入栈
.text:00409EAA                 call    _fflush               ; 调用fflush方法,清除缓冲区
.text:00409EAF                 push    8                     ; 入栈8
.text:00409EB1                 push    offset aInputKeyMaxD  ; "input key(max %d):" ; 入栈一个字符串指针
.text:00409EB6                 call    sub_4015A9            ; 这里就是调用printf("input key(max %d", 8),这里提示入力最大8个字符
.text:00409EBB                 call    sub_4010CD            ; 同上面&#

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值