读书人

求破译一个加密函数的方法

发布时间: 2013-01-02 13:08:45 作者: rapoo

求破解一个加密函数的方法
本帖最后由 haprince 于 2012-11-21 14:18:14 编辑 是一个游戏程序,加密函数在一个dll里,这个dll非常关键,里面函数非常多。所以不容易被取代。我先发一个C++破解这个加密的思路。但代码我没有很明白。望解读。

DWORD l;
BYTE *p = (BYTE*)GetProcAddress(GetModuleHandle("me.dll"), "Encrypt");
VirtualProtect((void *)p, 0x200, PAGE_EXECUTE_READWRITE, &l);
*p = 0xe9;
*(DWORD *)(p + 1) = ((DWORD)dididi) - (DWORD)p - 5;
其实代码的意思我大概理解,就是取得这个dll的这个加密函数的首地址。把调用地址改成另外一个函数dididi,这是一个自己写的函数,写在一个dll里注入游戏进程。我用VB使用GetProcAddress,取得首地址,但是发现这里并没有被修改。找不到e9。而找到的却是me.dll里的原始内容。说明这只是dll文件在内存里的地址。那么BYTE *p究竟代表什么意思呢。我不会用OD,请教如何使用它找到这个地址。我的破解思路,希望是不用注入dll的方法。比如游戏程序要使用函数加密,那就把加密返回的基址,改成输入的参数基址。还有一个破解思路,是修改这个yb_mem.dll,它里面的函数是把输入参数加密,那么让它直接输出这个输入的值,也达到了破解目的。这只是想法,具体代码我也不知道怎么写。
[解决办法]
0xe9 是汇编指令 JMP

*(DWORD *)(p + 1) = ((DWORD)dididi) - (DWORD)p - 5;
这就是把 Encrypt函数的入口代码强行修改成 JMP到 自己 的函数, 这就是HOOK函数的一种方法.

如果你这个程序没有注入到目标进程, 肯定是调用不了的.

建议先看Window核心编程, 同时去<<广海>>转转, 这里比较适合游戏破解入门. <<看雪>>是比较高级点的论坛了.

读书人网 >C++

热点推荐