苏紫方璇 发表于 2021-6-28 15:38

整个简单的cm娱乐一下

本帖最后由 苏紫方璇 于 2021-6-30 00:39 编辑

一个简单的c/c++控制台cm,可爆破可逆算法,自我感觉适合新手练习,没反调试,成功失败有明显提示。
由于过于简单Key就不给了,容易猜出来。






6.30
附上源码参考交流,源码为vs2015工程,编译后部分地方需要手动修改,已在源码中注释

苏紫方璇 发表于 2021-6-28 23:24

iTruth 发表于 2021-6-28 22:55
把004013EC处的push 0改为push 1之后把输出的代码直接复制粘贴即可

是未曾设想过的破解方式呢666

iTruth 发表于 2021-6-28 22:55

把004013EC处的push 0改为push 1之后把输出的代码直接复制粘贴即可

xiaoyu2032 发表于 2021-6-29 10:13

iTruth 发表于 2021-6-28 22:55
把004013EC处的push 0改为push 1之后把输出的代码直接复制粘贴即可

大佬这个怎么看出来的?
我研究了一晚上,只能看出来这个程序大概是根据硬件信息算了一个类似hash的32位码,失败、成功的提示信息都是加密保存的,可能需要输入的码正确才能解密出来,这样在没有能力逆算法的情况下,很难找到关键跳转,不知道理解的对不对?

苏紫方璇 发表于 2021-6-29 10:37

xiaoyu2032 发表于 2021-6-29 10:13
大佬这个怎么看出来的?
我研究了一晚上,只能看出来这个程序大概是根据硬件信息算了一个类似hash的32位 ...

hash是md5目测楼上大佬把算法整明白了,提示信息并不参与算法key解密,只是给搜字符串加点障碍,另外提示一下,关键跳转是用其他方式实现的,并非是条件转移指令

xiaoyu2032 发表于 2021-6-29 11:15

苏紫方璇 发表于 2021-6-29 10:37
hash是md5目测楼上大佬把算法整明白了,提示信息并不参与算法key解密,只是给搜字符串加点障碍,另外提 ...

上午再跟了一会,想找到提示字符串的怎么出来的,失败字符串放置12FD1C这个地址,之前是一堆其他信息,通过xor 0x1A解出来的,想找解密前字符串的怎么来的,发现代码有些奇怪。如下:
00166DD3    0000            add byte ptr ds:,al
00166DD5    0000            add byte ptr ds:,al
00166DD7    0008            add byte ptr ds:,cl
00166DD9    004400 B2       add byte ptr ds:,al

7C92E460    8B1C24          mov ebx,dword ptr ss:
前面几步都是把相加的结果放在eax指向的地址,第四步执行后就调到系统领空7C92E460去了,好奇怪。
不是条件指令的话大概应该就是call 函数地址,有一个地方用了call eax,跳到不同的堆栈地址,再看看。

xiaoyu2032 发表于 2021-6-29 12:16


根据提示,终于找到了关键位置。
这种方法需要要有一个正确的码才有可能找到关掉调用函数的地址。

Call eax是关键调用,错误地址是166C9D,正确是401160正确值时要求ecx为64,错误时为23,函数地址值ecx*A403+34得出的,此处直接改会导致后续指令被覆盖

因此到上一处传入ecx的位置修改,也需要在前两个指令处修改代码,才不会覆盖掉40168B的指令。



苏紫方璇 发表于 2021-6-29 13:01

xiaoyu2032 发表于 2021-6-29 12:16
根据提示,终于找到了关键位置。
这种方法需要要有一个正确的码才有可能找到关掉调用函数的地址。



没错,验证部分是用的SEH和call一个正确的地址,若key正确,则计算结果为0x64,错误时可能为0-0x63,写完cm自己试了一下,不看算法,找解密字符串函数,查交叉引用即可发现关键位置

xiaoyu2032 发表于 2021-6-29 13:05

苏紫方璇 发表于 2021-6-29 13:01
没错,验证部分是用的SEH和call一个正确的地址,若key正确,则计算结果为0x64,错误时可能为0-0x63,写完 ...

这种要是没有正确的key,如何能找到正确的调用函数地址?

苏紫方璇 发表于 2021-6-29 13:14

xiaoyu2032 发表于 2021-6-29 13:05
这种要是没有正确的key,如何能找到正确的调用函数地址?

不清楚你是怎么找到的,我这个比较简单,看解密字串的交叉引用就可以找到,复杂环境下,没正确的key还真不好确定正确的调用地址
页: [1] 2
查看完整版本: 整个简单的cm娱乐一下