0x04 调试加分析 reverseMe.exe

之前的那个都是暴力的破解,今天学习了下基本32汇编,之前弄过16位汇编,所以看起来问题不大。

该连续程序是看雪论坛的一个程序,百度就可以搜索到。

首先按F8一步一步往下执行,到这里0x04 调试加分析 reverseMe.exe_第1张图片

很明显这里是调用了CreateFile这个函数,查看win32文档可以知道这里是打开Keyfile.dat这个文件,并且是这个文件必须存在,并且没有给出这个文件的路径(第一行的那个NULL)。这样就知道必须要有一个Keyfile.dat文件,否则就不进行那个jnz XreverseM.0040109A了,程序往下执行,然后退出。

创建个Keyfile.dat文件,然后发现执行跳转 jnz XreverseM.0040109A。

0x04 调试加分析 reverseMe.exe_第2张图片

走过了ReadFile(读取文件的内容),并且可以看出是把读取的内容放到了0040211A处了,到了 图片的最后一句时,又执行跳转了,然后又是错误的退出了0x04 调试加分析 reverseMe.exe_第3张图片,说明这个跳转时不能跳的,实际上,在跳转的上一句,

cmp dword ptr ds:[0x402173],0x10 把ds:[402173]和16对比(10为16进制的16),而402173恰好是pBytesRead,即文件中的字节数,小于16就进行跳转,为了不执行跳转Kefile.dat中的数据应该大于16字节。更改后不进行跳转了,0x04 调试加分析 reverseMe.exe_第4张图片

再往下走,0x04 调试加分析 reverseMe.exe_第5张图片

从4010c1处开始到4010d1处事个不断的循环,就是在检测密匙

004010C1   > /8A83 1A214000 mov al,byte ptr   ;把ds:[ebx+0x40211A] 处的值放到al中

004010C7   . |3C 00         cmp al,0x0       ;进行比较判断是否为0,即判断文件中的内容是否判断结束
004010C9   . |74 08         je XreverseM.004010D3     ;如果是0则跳转到下面的cmp esi,0x8
004010CB   . |3C 47         cmp al,0x47            ;比较是否为47(ASCII为字符G)
004010CD   . |75 01         jnz XreverseM.004010D0 ;如果是G就跳过下面的esi加一
004010CF   . |46            inc esi    ;和后面的cmp esi推测可知esi就是计数判断字符G的个数的
004010D0   > |43            inc ebx ;地址偏移向后,就是把ds:[ebx+0x40211A] 指到下一个字符
然后下面的

004010D3   > \83FE 08       cmp esi,0x8    ;判断G的个数是否小于8
004010D6   .  7C 1F         jl XreverseM.004010F7   ;如果小于8就跳转到004010F7(就是错误的结束的位置)
004010D8   .  E9 28010000   jmp reverseM.00401205   ;跳转到正确结束的位置


经过上面的分析就可以知道要保证文件中的G字符个数大于8,就能够正确破解了。

我这里随便输的0x04 调试加分析 reverseMe.exe_第6张图片

结果0x04 调试加分析 reverseMe.exe_第7张图片,真是很神奇啊。汇编大法好。

你可能感兴趣的:(OD调试学习)