简单编写追码软件的读注册码程序
老大说要多多发文章。所以有了以下垃圾文章。水平太菜,初吾爱汇编论坛,让各位大神,大牛见笑了。老大的第二文章之注册码。搜索::Shark恒 零基础逆向教程之图文版【获得注册码】
地址:https://www.52hb.com/thread-666-1-1.html ,软件简单,就用它了。
先注册下,让OD断下,老大在文章里已经提到
我这里追的位置如图:
因为这个注册码因为用户名不同,计算出来的也不相同,所以可以把注册码写入到一个
固定的内存地址处,让固定的内存地址处保存注册码字符串,用外部程序来读这个固定内存地址里的注册码,就可以简单的实现了。这里
还是先跳到空白区域里写代码。如下图:
把注册码放到0041183C的内存地址处,这里循环了10次,共40个字节,是因为可以多复制,但是不能少复制,多复制了也没事,后面的是00,
外部程序读取时遇到00就作为是字符串结束了。可以跟踪一下,如下图,复制了40个字节。
现在已经把注册码复制到一个固定的内存地址0x0041183C处了。
用OD的保存成功后,如果运行这个修改后的软件,注册时会出现崩溃,是因为当前代码段只有可读权限,没有可写权限。
所以用loadpe要改下.text区段的内存可写属性,打上勾就可以了。如下图:
现在算是把这个处理完了。。。下面就是用程序读注册码了。。
这里只用一个按钮能读取就可以了。 代码如下:
void CtestwriteDlg::OnBnClickedButton1() //读注册码
{
DWORD pid = 0;
HWND hWnd = ::FindWindow(NULL,"IPsearch");
if (hWnd == NULL)
{
MessageBox("请找开程序窗口!");
return;
}
GetWindowThreadProcessId(hWnd, &pid);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (hProcess == NULL)
{
MessageBox("打开进程失败!");
return;
}
DWORD pAddress = 0x41183c; //这里为内存地址处
BOOL bRet = FALSE;
char szRegCodeBuf = {0};
bRet = ReadProcessMemory(hProcess,(LPCVOID)pAddress, szRegCodeBuf, MAX_PATH, NULL);
if (bRet == FALSE)
{
DWORD dErrorCode =GetLastError();
CString strErrorCode;
strErrorCode.Format("读进程内存失败,错误码:%d",dErrorCode);
MessageBox(strErrorCode);
return;
}
CString strRegCode;
strRegCode = "注册码是: ";
strRegCode += szRegCodeBuf;
MessageBox(strRegCode);
OutputDebugString(strRegCode);
CloseHandle(hProcess);
}
测试结果如下:
成功读取出来了。
下面继续测试下是否正确:
帐号:吾爱汇编论坛测试, 注册码是: 68D6755AACB9158D1A161E88DA778C7E
测试注册成功。保存在注册表位置下如:
初学菜鸟,内容简单,文中有错误之处,还请各位高手指出来。谢谢。{:5_116:}
感谢楼主分享教程,学习了
很好,学习了
感谢分享,学习了
不错啊,这个我还不会呢。。。。。写代码读内存
不错,可以学习一下
感谢楼主分享!支持!。
{:5_116:}大神的思路学习了
你后面补码、、也就是把那个注册码一直写啊写的那一段代码我确实没看懂啊
520Kelly 发表于 2014-11-19 18:36
你后面补码、、也就是把那个注册码一直写啊写的那一段代码我确实没看懂啊
为了把注册码保存到一个固定的位置处啊,这样,外部程序就能读取了,如果你不保存起来,怎么读取啊,因为你点错误确定后,后面的数据会把注册码保存的数据能覆盖掉,所以最好直接保存固定位置部,这样,就很方便读取了。我是菜鸟,向大神学习。。。