来这个论坛好一阵子了
看到论坛的规定,一般情况也不敢发贴
看了很长时间的精华贴,虽然有了不少进步
但是有一种情况,我想了半天,也没想出来~~~
明天是元旦,于是我大着胆子问问老大们一个很难的问题:
我看到别人分析反汇编的时候,在后边加的注释
他们是怎么知道的?
他们是怎么知道些软件的作者的算法的?
也就是说,通过学什么知识能做到这些呢?
比如说这个例子:
0167:0047AD4B MOV EAX,[EBP-44]
0167:0047AD4E LEA EDX,[EBP-40]
0167:0047AD51 CALL 004683F4
0167:0047AD56 MOV EDX,[EBP-40] ;这是真的注册码的内存地址,是以后的分析得出的!
0167:0047AD59 POP EAX ;假的注册码99999999是我输入的
0167:0047AD5A CALL 00404B84 ;这可是关键的 call主要作用对输入的注册码进行验证!
0167:0047AD5F JNZ 0047ADC4 ;这可是关键jmp一跳就完了!
0167:0047AD61 MOV EAX,0047AEE8
0167:0047AD66 CALL 00436ED4
0167:0047AD6B LEA EAX,[EBP-50]
0167:0047AD6E CALL 00468A04
0167:0047AD73 MOV EAX,[EBP-50]
下面让我们看看 call 00404b84的程序吗!
167:00404B84 PUSH EBX
0167:00404B85 PUSH ESI
0167:00404B86 PUSH EDI
0167:00404B87 MOV ESI,EAX ;用esi做eax 的镜像
0167:00404B89 MOV EDI,EDX ;用edi做edx的镜像
0167:00404B8B CMP EAX,EDX ;比较真假注册码的地址是否一样,一样就跳到注册码错误
0167:00404B8D JZ NEAR 00404C22
0167:00404B93 TEST ESI,ESI ;看假注册吗的地址是不是0是零,跳到错误
0167:00404B95 JZ 00404BFF
0167:00404B97 TEST EDI,EDI ;看注册吗的地址是不是0是零,跳到错误
0167:00404B99 JZ 00404C06
0167:00404B9B MOV EAX,[ESI-04] ;获取假注册吗的位数放到eax
0167:00404B9E MOV EDX,[EDI-04] ;获取真注册吗的位数放到edx
0167:00404BA1 SUB EAX,EDX ;比较真假注册吗位数的大小
0167:00404BA3 JA 00404BA7
0167:00404BA5 ADD EDX,EAX ;假注册吗的位数放到edx
0167:00404BA7 PUSH EDX
0167:00404BA8 SHR EDX,02 ;移2位
0167:00404BAB JZ 00404BD3 ;为零跳到错误
0167:00404BAD MOV ECX,[ESI] ;获取假注册吗的前4位
0167:00404BAF MOV EBX,[EDI] ;获取真注册吗的前四位
0167:00404BB1 CMP ECX,EBX ; 比较
0167:00404BB3 JNZ 00404C0D ;不相等跳到错误
0167:00404BB5 DEC EDX ;把输入的注册吗的位数再减1
0167:00404BB6 JZ 00404BCD ;为零跳到错误
0167:00404BB8 MOV ECX,[ESI+04] ;获取假注册吗的后四位
0167:00404BBB MOV EBX,[EDI+04] ;获取真注册吗的后四位
0167:00404BBE CMP ECX,EBX ;比较
0167:00404BC0 JNZ 00404C0D ;不等跳到错误
0167:00404BC2 ADD ESI,BYTE +08 ;把假注册吗的地址加8位
0167:00404BC5 ADD EDI,BYTE +08 ;把真注册吗的地址家8位
0167:00404BC8 DEC EDX ;再把假注册吗的位数再减1
0167:00404BC9 JNZ 00404BAD ;不为零跳到上面再比较
0167:00404BCB JMP SHORT 00404BD3
0167:00404BCD ADD ESI,BYTE +04
0167:00404BD0 ADD EDI,BYTE +04
0167:00404BD3 POP EDX ;取出保存假注册吗的位数
0167:00404BD4 AND EDX,BYTE +03 ;把假注册吗的位数和三与一下
0167:00404BD7 JZ 00404BFB ;为零跳到错误
0167:00404BD9 MOV ECX,[ESI] ;取出假注册吗后面的4位数
0167:00404BDB MOV EBX,[EDI] ;取出真注册吗后面的4位数
0167:00404BDD CMP CL,BL ;比较
0167:00404BDF JNZ 00404C22 ;不相等跳到错误
0167:00404BE1 DEC EDX ;把假注册吗的位数减一
0167:00404BE2 JZ 00404BFB ;为零跳到错误
0167:00404BE4 CMP CH,BH ;比较前两位
0167:00404BE6 JNZ 00404C22 ;不等跳到错误
0167:00404BE8 DEC EDX ;把假注册吗的位数再减一
0167:00404BE9 JZ 00404BFB ;为零跳到错误
0167:00404BEB AND EBX,00FF0000
0167:00404BF1 AND ECX,00FF0000
0167:00404BF7 CMP ECX,EBX ;比较后两位
0167:00404BF9 JNZ 00404C22 ;不等跳到错误
0167:00404BFB ADD EAX,EAX
0167:00404BFD JMP SHORT 00404C22
0167:00404BFF MOV EDX,[EDI-04]
看,后面的注释多么详细~~
难道就是通过前面的指令吗?
我自学汇编一个多月
我只能看出什么比较呀,跳转呀之类的
我为什么就看不出这些算法呢?
高手们,我应该学些什么知识才能向这些高手那样
一眼就能看出这些复杂的算法呢?
谢谢~~~~
[培训]传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!