本代码只作为学习用,没有任何实用价值。限于水平,反编译的分析结果也不够彻底,供初学者参考。
先看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 ; 同上面&#