第一次自己分析一个关键CALL,还有好多没有弄懂的地方。
0042BD07 MOV EAX,DWORD PTR SS:[ESP+3C] ; 点击的横坐标EAX==X
0042BD0B MOV ESI,DWORD PTR SS:[ESP+40] ; 点击的纵坐标ESI==Y
0042BD0F CMP ECX,1
0042BD12 MOV DWORD PTR SS:[ESP+1C],EAX
0042BD16 MOV DWORD PTR SS:[ESP+18],ESI
0042BD1A JNZ SHORT ZhaoCha.0042BD2E
0042BD1C MOV DWORD PTR SS:[ESP+3C],1F4 ; 图片的宽
0042BD24 MOV DWORD PTR SS:[ESP+40],1C2 ; 图片的高
0042BD2C JMP SHORT ZhaoCha.0042BD3E
0042BD2E MOV DWORD PTR SS:[ESP+3C],17D ; 不同图片的大小不同??
0042BD36 MOV DWORD PTR SS:[ESP+40],11E
0042BD3E MOV EDI,DWORD PTR DS:[4795F4] ; 4795f4存储的是一个指针
0042BD44 MOV ECX,DWORD PTR DS:[EDI+8] ; [
+8]=两幅图片X边界的区分值
0042BD47 CMP EAX,ECX ; 比较X得到点击的版面是左边还是右边
0042BD49 JL SHORT ZhaoCha.0042BD5C ; 如果在右边就转换X到左边的坐标
0042BD4B MOV EDX,DWORD PTR SS:[ESP+3C]
0042BD4F ADD EDX,ECX
0042BD51 CMP EAX,EDX
0042BD53 JG SHORT ZhaoCha.0042BD5C
0042BD55 MOV EDX,DWORD PTR DS:[EDI+4] ; 最左边的小边界框的宽度 7
0042BD58 SUB EDX,ECX
0042BD5A ADD EAX,EDX
0042BD5C MOV EDX,DWORD PTR DS:[EDI] ; EDX=上边界的大小
0042BD5E CMP ESI,EDX ; 纵坐标y小于上边界,跳到最后
0042BD60 JL ZhaoCha.0042C07B
0042BD66 MOV ECX,DWORD PTR SS:[ESP+40]
0042BD6A ADD ECX,EDX
0042BD6C CMP ESI,ECX
0042BD6E JG ZhaoCha.0042C07B ; 纵坐标y大于下边界,跳到最后
0042BD74 MOV ECX,DWORD PTR DS:[EDI+4] ; 最左边的小边界框的宽度 7
0042BD77 CMP EAX,ECX
0042BD79 JL ZhaoCha.0042C07B ; 横坐标x小于左边界,跳到最后
0042BD7F MOV EDI,DWORD PTR SS:[ESP+3C]
0042BD83 ADD EDI,ECX
0042BD85 CMP EAX,EDI
0042BD87 JG ZhaoCha.0042C07B ; 如果点到了中间的边界。跳到最后
0042BD8D SUB EAX,ECX ; X减去左边界框的宽度,得到在图片中的X
0042BD8F SUB ESI,EDX ; Y减去上面部分UI界面占用的宽度,得到在图片中的坐标Y
0042BD91 MOV DWORD PTR SS:[ESP+3C],EAX
0042BD95 MOV EAX,DWORD PTR SS:[EBP+4]
0042BD98 MOV DWORD PTR SS:[ESP+40],ESI
0042BD9C MOVSX ESI,WORD PTR DS:[EBX+A20]
0042BDA3 TEST EAX,EAX
0042BDA5 JE SHORT ZhaoCha.0042BDC1 ; 某值为空。跳走,没看懂
0042BDA7 MOV ECX,DWORD PTR SS:[EBP+8]
0042BDAA SUB ECX,EAX
0042BDAC MOV EAX,2AAAAAAB
0042BDB1 IMUL ECX
0042BDB3 SAR EDX,5
0042BDB6 MOV EAX,EDX
0042BDB8 SHR EAX,1F
0042BDBB ADD EDX,EAX
0042BDBD CMP EDX,ESI
0042BDBF JA SHORT ZhaoCha.0042BDC8
0042BDC1 MOV ECX,EBP
0042BDC3 CALL ZhaoCha.00430C30
0042BDC8 MOV EDX,DWORD PTR SS:[EBP+4]
0042BDCB MOV EAX,DWORD PTR DS:[4A260D]
0042BDD0 LEA EDI,DWORD PTR DS:[ESI+ESI*2]
0042BDD3 XOR ESI,ESI
0042BDD5 SHL EDI,6
0042BDD8 ADD EDI,EDX ; EDI与是否已经被点击的地址有关
0042BDDA TEST EAX,EAX
0042BDDC JLE ZhaoCha.0042BF5A
0042BDE2 LEA ECX,DWORD PTR DS:[EBX+238] ; 用ECX获得茬矩形的宽和高
0042BDE8 LEA EBP,DWORD PTR DS:[EDI+2A] ; 用EBP可以获取茬的TOP和LEFT坐标
0042BDEB 10 MOV DWORD PTR SS:[ESP+10],ECX
0042BDEF MOVSX EDX,WORD PTR SS:[EBP-14] ; 循环的开始
0042BDF3 CMP DWORD PTR SS:[ESP+3C],EDX
0042BDF7 JL SHORT ZhaoCha.0042BE3E ; 如果X小于茬矩形的LEFT就跳
0042BDF9 PUSH 0
0042BDFB CALL ZhaoCha.00444050 ; 获取对应茬矩形的宽度
0042BE00 MOVSX ECX,WORD PTR SS:[EBP-14]
0042BE04 ADD EAX,ECX
0042BE06 MOV ECX,DWORD PTR SS:[ESP+3C]
0042BE0A CMP ECX,EAX
0042BE0C JA SHORT ZhaoCha.0042BE39 ; 大于LEFT+矩形宽度 就跳
0042BE0E MOVSX EDX,WORD PTR SS:[EBP]
0042BE12 CMP DWORD PTR SS:[ESP+40],EDX
0042BE16 JL SHORT ZhaoCha.0042BE39 ; 小于茬矩形TOP就跳
0042BE18 MOV ECX,DWORD PTR SS:[ESP+10]
0042BE1C PUSH 0
0042BE1E CALL ZhaoCha.00444090 ; 获取对应茬矩形的高度
0042BE23 MOVSX ECX,WORD PTR SS:[EBP]
0042BE27 ADD EAX,ECX
0042BE29 MOV ECX,DWORD PTR SS:[ESP+40]
0042BE2D CMP ECX,EAX
0042BE2F JA SHORT ZhaoCha.0042BE39 ; 大于TOP+矩形高度就跳
0042BE31 MOV AL,BYTE PTR DS:[ESI+EDI+3E]
0042BE35 TEST AL,AL ; 以上条件满足就查看是否被点击过了
0042BE37 JE SHORT ZhaoCha.0042BE56 ; 如果没有被点击过就OK,否则比较下一个
0042BE39 MOV EAX,DWORD PTR DS:[4A260D] ; 茬总数
0042BE3E MOV ECX,DWORD PTR SS:[ESP+10]
0042BE42 INC ESI ; 比较次数+1
0042BE43 ADD EBP,2 ; 推动指针
0042BE46 ADD ECX,24 ; 推动指针
0042BE49 CMP ESI,EAX
0042BE4B MOV DWORD PTR SS:[ESP+10],ECX
0042BE4F ^JL SHORT ZhaoCha.0042BDEF ; 循环看五个茬矩形是否都比较过了
0042BE51 JMP ZhaoCha.0042BF5A
0042BE56 PUSH 2
0042BE58 MOV ECX,ZhaoCha.0049AF74
0042BE5D MOV BYTE PTR DS:[ESI+EDI+3E],1 ; 标记为已经点击过了
0042BE62 CALL ZhaoCha.00427FA0
0042BE67 CMP EAX,1
在得到茬矩形的数据以后就可以模拟点击了。
[课程]FART 脱壳王!加量不加价!FART作者讲授!