首页
社区
课程
招聘
[旧帖] [求助][分享]新菜鸟banlei的学习日记 0.00雪花
发表于: 2008-11-12 10:50 3738

[旧帖] [求助][分享]新菜鸟banlei的学习日记 0.00雪花

2008-11-12 10:50
3738

昨天是11月11日,光棍节,是个值得纪念的日子,因此我决定从今天也就是11月12日开始在看雪论坛上写我的菜鸟日记,不出意外的话,应该是每两天一篇。

刚来看雪,看了一些必须看的须知后,就开始看 CCDebuger的OllyDBG 入门系列,看了
OllyDBG 入门系列(三)时,就想自己分析代码了,在分析到如下代码时出了问题:(00401328 地址处的那条指令)

00401328 |. E8 A5000000        CALL CrackHea.004013D2       ; 关键,要按F7键跟进去
用F7跟进去以后,分析里面的代码
004013D2 /$ 56                PUSH ESI                                    
004013D3 |. 33C0              XOR EAX,EAX                     
……
……
00401405 |. 81F6 53757A79     XOR ESI,797A7553                           
0040140B \. C3                RETN
这里面的代码分析了几次都没读懂,后来看了CCDebuger版主的注释,才能勉强懂,但也没全懂。

有以下学得:
CMP AL,2D                     原来是比较AL中的字符是否为负号。
SUB AL,30                原来是把字符转化成对应的数字(这一点自己知道,但在分析时想不起
                   来,比如我们输入的是“3”,这是一个字符,在电脑里存放的是3的
                   ASCII,要把其转化成数字“3”,就要减去30)

XOR EAX,EDX                   如果EDX是-1,那么就是把EAX取反。
OR AL,AL
JNZ SHORT CrackHea.004013F0                这两条指令原来是用来判断是否已把用户输入
                                            的注册码计算完

下面是求助:
求助一:
004013D5 |. 8D35 C4334000     LEA ESI,DWORD PTR DS:[4033C4]  ; 把注册码框中的数值送到ESI
这行代码应该是把[4033C4]的偏移地址送入ESI,[4033C4]的偏移地址应该就是4033C4,但注释是“把注册码框中的数值送到ESI”, 后来试着改变注册框中的数值(一开始是12345666,后来是我自己改的45),而在信息栏中,ESI=(恒等于)4033C4,但是后面紧跟的ASCII就变了,一开始是12345666,后来变成45.
这是怎么回事?既然ESI=(恒等于)4033C4,那么ASCII不就应该是4033C4对应的ASCII吗?为什么会发生变化??

求助二:
LEA ECX,DWORD PTR DS:[ECX+ECX*4]   把前面运算后保存在ECX中的结果乘5再送到ECX
LEA ECX,DWORD PTR DS:[EAX+ECX*2]     每位字符运算后的值与2倍上一位字符运算后值相
                                           加后送ECX
这两条指令为什么要这样计算啊??这样计算是为了什么啊?

求助三:
说白了,就是CrackHea.004013D2这个子程序的目的是为了干嘛啊?是为了计算注册框中的计算值吗?应该是为了比较CMP EAX,ESI,但为什么还要进行计算?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
LEA是取地址指令,ESI保存的是地址

至于LEA ECX,DWORD PTR DS:[ECX+ECX*4]
这是LEA的一种妙用,效果就等于ECX乘以5,比MUL去实现ECX*5来方便

CrackHea.004013D2这个子程序做的就是加密工作,根据用户的输入得出注册码,看看是否正确

以上纯属个人看法,正确与否还有待高手斧正
2008-11-15 00:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢,程序我已经读懂。

今天的求助:
在第三版的《加密与解密》中的29页,函数wsprintf(name,TEXT("%d"),code)
书中说函数wsprintfA是将数字转换成字符,那么其返回值是放在哪里,在29页中,返回值似乎是放在ESP中的,但一般的API函数不是放在EAX中吗??
2008-11-23 23:24
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
题目说得太简单,不好意思,补充一下:
在第三版的《加密与解密》中的29页,,阅读“;函数wsprintf(name,TEXT("%d"),code)”(引用文中的黑体字)上面的部分,应该是得出结论:ESI中放的是计算出来的序列号。
00401370 add edi,edx   ;code+=edx
而在
0040138D  push ebp     
0040138e  push eax
0040138f   call [00404004]   ;LSTRCMP函数比较字符

难道在wsprintfA函数中,已把计算出的真正序列号传给了EBP????
2008-11-23 23:42
0
雪    币: 328
活跃值: (10)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
5
int wsprintf(
  LPTSTR lpOut,    // output buffer
  LPCTSTR lpFmt,   // format-control string
  ...              // optional arguments
);lpOut 

[out] Pointer to a buffer to receive the formatted output. The maximum size of the buffer is 1024 bytes.


wsprintf的返回值是放在第一个参数指向的内存里的
2008-11-25 09:17
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
路过,瞧瞧。
2008-11-25 09:51
0
游客
登录 | 注册 方可回帖
返回
//