本来是想写给cm 大赛的。但动作太迟缓了。没报上名。把源码帖上来,以备以后使用。若能对和我一样的菜鸟有所帮助,则甚感欣慰。 注册码规则: 用户名和注册码都是8 个 ascII 字符。 一组可用的注册码: 用户名:abcdefgh 注册码:hcafbegd 算法描述: 注册码的算法: 使用了“八皇后”问题模型。“八皇后”问题的描述为:将国际象棋中的 8 个皇后放到棋盘的单元格中,要求任意两个皇后不在同一行、同一列或方格的同一条对角线上。 用户名每个字母代码棋盘的行号。行号从 0开始。注册码每个字母表示是各行的皇后所在的列号。列号从 0开始。 行号和列号的计算方法是:各个字母在字串中的由小到大的排序索引。 例如,上面的注册码中,注册码中第一个字母 h 在注册码字串中由小到大排序后的索引为 7 。用户名中,与之对应的 a 在用户名串中由小到大排序后的索引值为 0 。则第0行的皇后位于第7 列。 依次把皇后放好以后,检查皇后的放置是否符合规则,符合则认为注册码合法。 反调试: 程序中开辟了一个后台线程,这个线程负责设置一个函数指针,以决定较验注册码调用的函数。正常情况下,后台线程启动时将函数指针指向错误的较验函数,用竞争锁持有一个变量。当发现有线程等待此锁时,修改函数指针指向正确的较验函数,并释放此锁,以使前台进程继续执行。 当程序被跟踪调试时,后台线程被挂起。则程序会执行错误的较验函数。这个函数是计算 128 个皇后放到棋盘的问题。很考验调试者的耐心和cpu的质量。本人菜鸟。只为熟悉 windows 编程和复习 c++ 而做此题目。所以只为 爆破 而跑进来的人,对不起啦,这东东没一点儿挑战性。涉及到一些有意思的知识点。 1、手动查找API地址并调用之,哈希API字串。是为了避免静态分析到 createthread()等敏感的函数。 2、八皇后算法。用来较验注册码。避免了明文比较。 我有空就会编辑着帖一下对代码的说明。或流程什么的。有问题请跟帖。 运行环境:windows XP. 编译环境 vs2005[1] 手动查找API地址并调用之 如果我们调用了系统API,正常编译的情况下,编译器会在导入表中生成此API的信息。比如,API的名称字串。解密者很容易根据这些信息猜测程序的执行流程,甚至设计思路。所以我们想把它隐藏起来。隐藏需要做两个工作:1、避免导入表中携带 api字串信息。2、避免在程序中直接 call 此 api。 关于HASH API的原因和方法,下文有描述甚为用心,我就不耍斧头了。 参考文章【Anti Virus专题】1.2 - 3.hash扫描获得api函数地址 上面的文章中代码都是用 汇编来实现的。我用c 实现了一下,虽然指令多了些,但更方便菜鸟学习。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!