• 标 题:diy pe5 (2千字)
  • 作 者:pll621
  • 时 间:2002-8-19 12:24:01
  • 链 接:http://bbs.pediy.com

申明,这批文章没有什么技术含量,我仅仅是向大家提供一个得到注册码方法


程序:某国产软件xxx.exe
注册码检验方式:网络校验
原文件加壳:未知壳
脱壳用trw找到入口点,pedump,修复iat,过程省略(很简单,不值得写)

脱壳后继续更踪找到注册码判断点
mov edx,xxxxxxx==》edx 是网络注册码
mov eax,xxxxxxx===》eax 是自己输入的注册码
call xxxxxxx==》这段是比较的call
jz xxxxxx==》不等就完蛋
由于是网络校验,这个形式调用了很多次,每次都能d edx看到不同的注册码,
可见是把你输入的注册码和网络数据库里的注册码,逐个比较,如果相等就
成功,直接改那个jz就ok了,不过我们如何得到这个数据库所有的注册码呢?
我一开始的想法是用messagebox,更改其跳转到自己的程序:
push 0
push edx
push edx
push 0
call messagebox
这样不是就能看到注册码么?但是有个缺点就是一次只能看到一个,而且还有可能导致
网络超时,
于是就换种思路,再每次调用的时候保存dx的注册码,最后再ExitProcess的时候把所有的注册码写到一个文件里面,
这样的话就需要先VirtualAlloc内存,然后creatfile,在lstrcpy,然后writefile,最后closefile 和VirtualFree这片内存
真是麻烦之又麻烦,如果程序没有这些函数,还要自己构造相关函数,对我这种能简化就简化的人来说,是比较痛苦的一件事
,但是在实际操作的时候,突然想到,我写上篇文章的时候有过写ini的api,马上想到是WritePrivateProfileString,查api手册看看
BOOL WritePrivateProfileString(

    LPCTSTR lpAppName,    // pointer to section name
    LPCTSTR lpKeyName,    // pointer to key name
    LPCTSTR lpString,    // pointer to string to add
    LPCTSTR lpFileName     // pointer to initialization filename
  );    

真是个好东东啊,不要分配内存,也不要打开文件句柄,只要这个四个指针就ok
实际操作的时候就可以这样来更改,当然首先更改原来的程序跳到自己的程序
自己的程序:
inc key==》每次都改变一下key的内容,不要把所有的注册码都写道一个key里面,那岂不是白干了:)
push filename===>文件名(xxx.ini)的指针*自己在程序中找个空白的地方用winhex添一个就行了,然后转换成rav push 这个rav
push edx==>本来是push 要更改的string地址,这里就是edx了,我们的注册码
push key==>key 名称的指针了
push sectionname==>段名称指针,(我实际构造的时候这个段名称就是serial)
call WritePrivateProfileString
mov eax,xxxxxx==》恢复原程序动作
jmp xxxxxx==》跳回原程序

程序执行完后,就可以去c:\windows(也就是你安装windows的目录)里面找这个xxx.ini文件了,打开一看,哈哈所有的注册码排列的整整齐齐
真是happy啊,由此拓展,用这样的方法可以记录很多有用的信息给我们,比如你想了解某个地址,堆栈,寄存器等的变化情况,又不想去一次一次中断看,
就插一段这样的语句,是不是很省事情哦

后记:
希望大家在操作的时候多动脑筋,没有作不到,只有想不到,很多看似简单的东西,其实还是有很大的用处的。



                                                            你的朋友:pll621