Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4737243
  • 博文数量: 206
  • 博客积分: 5240
  • 博客等级: 大校
  • 技术积分: 3224
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 21:40
文章分类

全部博文(206)

文章存档

2013年(13)

2012年(8)

2011年(33)

2010年(152)

我的朋友

分类:

2010-08-20 19:46:49

AAuto提供了一个功能,就是直接加载当前EXE内的静态函数指针,
这个功能一直是没有公开的,但是可以用来执行内部机器码。
exe = raw.loadDll( )
exe.api(函数地址,"void(void)" )

因为AAuto是动态语言,内联汇编是没有意义的。

但是注入到对方EXE里是可以的,实际上可以实现一个简单的语法解析器,将汇编译成机器码,这个作为一个模块。然后再将执行作为一个模块。

今天我对process库进行了大量的改进,已经可以很好的支持写入机器码并创建函数以执行,将一这步的工作进行了简化,进程读写的函数也进行了大量的改进,以支持大家写入机器码的需求。

这样就可以将精力集中于汇编到机器码的转换这一块。

最新版本process对象提供了malloc函数来分配内存,可以直接调用process库的writeString函数往这个指针里写机器机,最后用process库的remoteApi函数创建call

请参考v0.54.8的最新文档:
process库:

远程CALL:

再提供一些例子:

//外部CALL读取命令行
//列出所有已运行进程的命令行参数
import winex;
io.open()

io.print(
"请关闭所有监控软件")
execute("pause"//按任意键继续

//遍历所有窗口
for hwnd,title,theadId,processId in winex.each(  ) { 
    
if(title != ""//如果标题不为空
    {      
        
//在外部EXE进程创建函数    
        try{

            
var getCommandLine_call = raw.remoteApi(processId,"string()"
              ,
"Kernel32.dll","GetCommandLineA");

            str = getCommandLine_call()
            io.print(processId,title,str)
        }
    }  
}


下面是以前一直未公开的一个用法,但是却可以用来写机器码(process的构造函数无参数时能打开自身进程)。

import win;
func = 
function(str){
    win.msgbox( 
"非法操作:" + str)
}

//转换为函数指针
func_c = raw.tostdcall(func,"void(str)" )

//打开当前EXE模块对象
exe = raw.loadDll()

/*
AAuto限制你对内核对象使用topointer,tonumber等函数,
以避免你随意的改动内核对象,这里我们需要一点技巧来突破此限制.
设置限制的目的是在提醒你不要随意的对内核指针动手 :)
*/

struct = {pointer ptr = func_c } 
ptr = raw.convert( struct,struct ).ptr 
//利用静态类型转换,将重指针(cdata)转换为了普通指针(pointer)
funcAddr = tonumber(ptr) //再把指针转换为内存地址

//声明一个特殊的API,调用内部函数指针
func_api = exe.api( funcAddr ,"void(str)" )

//看来是一件很无聊的事,转来转去,我们只是调用AAuto函数而已.
func_api("hello")


内存搜索QQ号:



//QQ2010登录号码内存搜索示例
import process

//打开控制台
io.open()

//这个表用来保存QQ号,并排除重复的QQ号
var qqtable = {};

//遍历所有进程
for processEntry in process.each( "QQ\.exe" ) { 
    
    io.print(
"发现QQ进程,正在搜索进程......")
    prsc = process( processEntry.th32ProcessID )
    
    
//找出第一个有效内存地址
    var mem_address,mem_size,mem_protect,mem_type = prsc.query();  
    
    
if( mem_size ){
    
        
//循环查找 
        while( 1 ){ 
            
sleep(1) 
            
            
//查找下一个有效内存
            mem_address,mem_size,mem_protect,mem_type= prsc.query(mem_address );
            
if(!mem_size)  
                
break;//找不到有效内存,退出
            
            
//读取字符串,
            var str = prsc.readString(mem_address,mem_size );  
                        
//先查找该内存是不是有类似QQ号码的字符串
            var qq = string.match( str,"(\d{5,12})\p")
            
if(qq){
                
//如果有类似的号码,再仔细分析各种可能出现的QQ号码数据
                qq = string.match( str,"(\d{5,12})\\QQ\\Wintemp")
                qq := string.match( str,
"(\d{5,12})\&ADSESSION")
                qq := string.match( str,
"(\d{5,12})\&clientkey")
                qq := string.match( str,
"(\d{5,12})\&utype\=")
                
if(qq){
                    qqtable[qq] = 
true;
                    io.print( qq )
                }; 
            }
                
            mem_address += mem_size
        };
        
    };
    
    
//关闭对象
    prsc.free();
    
        
}

io.print(
"发现以下QQ号已登录")

for(qq in qqtable){
  io.print( qq )
}



最新的process库提供了好用的外部进程内存读写、分配内存、call等功能。
阅读(775) | 评论(0) | 转发(1) |
0

上一篇:call的用法

下一篇:aauto 调用 DOS 命令

给主人留下些什么吧!~~