Como identificar funções de uma DLL (Win32API)

8 Respostas   369 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

Rayner

Tópico criado em: 08/10/2018 às 12:39 - Última modificação por Corvo em 10/10/2018 às 08:45

Boa tarde, estou tentando aprender a usar o Win32API e vi que para usar uma determinada DLL é preciso descobrir suas funções. Conheço algumas mas não todas e gostaria de saber como posso descobrir que funções uma determinada dll possui? Achei uma aula aqui na CRM mesmo mas como não tem imagens eu fiquei perdido.  :math:
O livro traz a vantagem de a gente poder estar só e ao mesmo tempo acompanhado.

------------


Corvo

Resposta 1: 08/10/2018 às 13:37

Fuçar a DLL? Bom, o pessoal vai me corrigir se eu estiver errado, mas isso seria engenharia reversa, acho. Basicamente o mesmo que decriptar um jogo de RPG Maker, coisas que concordamos ser abominável na maior parte dos casos. Primeiro, eu recomendo que você procure a documentação do produto ao qual a DLL se refere. Lá você vai encontrar todas as funções, explicações detalhadas sobre elas e seus argumentos etc.

Por outro lado, não me parece ser tão abominável porque é até fácil encontrar programas específicos pra isso. Vou recomendar o da Jet Brains porque, além de o download não ter firulas, uso uma IDE deles e gosto bastante. Mas é bem capaz que esteja falando bobagens.

Syureri

Resposta 2: 08/10/2018 às 13:39

Win32API serve para você chamar métodos de uma dynamic link library (dll) feita nativamente. Acredito que ele só funcione em Windows.
Os métodos dependem da lib que você vai usar, seja a user32, kernel32 ou uma que você mesmo fez. Eu recomendaria que você desse uma olhada no conceito de P/Invoke (Platform Invoke) que se trata justamente de invocar métodos nativos através de diferentes linguagens. Esse site possui informações sobre a maioria dos métodos das bibliotecas padrões -> http://www.pinvoke.net/

Por exemplo, o método SetCursorPos da user32: http://www.pinvoke.net/default.aspx/user32.SetCursorPos
Há exemplos de como ele pode ser chamado em C# (o que é muito bom, pois C# possui uma sintaxe bem mais clara que C), e com esses exemplos pra ajudar, você pode usar o mesmo esquema com Win32API. Ex:
Código: [Selecionar]
SetCursorPos = Win32API.new('user32', 'SetCursorPos', 'ii', 'i')

result = SetCursorPos.call(0, 180)


Faz tempo que não uso, então não posso garantir que o código acima funcione.

Obviamente, para chamar funções de uma dll nativa (compilado pra machine code), além de precisar que o método seja exportável, você precisa saber o nome e os parâmetros que o método recebe. É possível descompilar uma dll nativa para assembly, mas o resultado não será nem um pouco legível.

Rayner

Resposta 3: 08/10/2018 às 20:01

Spoiler
[close]

Olá Corvo, na pesquisa que eu estava fazendo eu vi algo sobre isso mesmo (Engenharia Reversa) mas não cheguei abrir a página, apenas li um trecho e tambem vi um video onde a pessoa recomenda realmente decriptar a DLL. mas a net caiu e eu não consegui terminar de ver ;-;  Obrigado pelas dicas, vou pesquisar mais sobre isso.

Spoiler
[close]

Olá Sotelie, obrigado pelo site! Esta sendo de grande ajuda! Fiquei um pouco perdido a princípio mas junto com a aula do Raizen e os exemplos dados eu estou conseguindo entender melhor- e seu código funcionou - mas os argumentos e o retorno ainda está me dando uma dorzinha de cabeça (Argumentos do Win32api e do método call também). Aos poucos vou aprendendo a "manipular" melhor esses métodos.

Sobre os argumentos, eu estava estudando um script e me deparei com os seguintes códigos

Win32api.new('...', '...', %w(l p), '...')
...(..., ..., %w(p p p p l p), ...)
...(..., ..., %w(p p), ...)

Como é o funcionamento destes argumentos??? Em que eles diferem dos argumentos comuns? O Sotelie vai terminar as aulas de RGSS3?
O livro traz a vantagem de a gente poder estar só e ao mesmo tempo acompanhado.

------------


Syureri

Resposta 4: 09/10/2018 às 07:39 - Última modificação por Sotelie em 09/10/2018 às 07:42

Fala, Rayner o/
Então, tinha um lugar que descrevia os argumentos que tu deve passar pro Win32API. Pelo que lembro de cabeça, L = Long, V = void, P = Pointer (ou string) e I = int. Agora o resto eu esqueci mesmo haha'
A propósito, tá aqui mais um tutorial que pode ser útil.

Os argumentos tu passa como quiser, ex:
Código: [Selecionar]
Win32API.new('user32', 'SetCursorPos', 'ii', 'i') # Como uma string é uma array de caracteres em ruby, aqui só passamos a string com os argumentos mesmo.
Win32API.new('user32', 'SetCursorPos', ['i', 'i'], 'i') # Já aqui nós passamos uma array de caracteres mesmo.
Win32API.new('user32', 'SetCursorPos', %w(i i), 'i') # %w(a b) é um atalho para ['a', 'b']. É um jeito de criar arrays de strings separadas por espaços em ruby.

E preocupa não, vou terminar as aulas de rgss3 assim que terminar minha engine.

Rayner

Resposta 5: 09/10/2018 às 17:50

Fala, Rayner o/
Então, tinha um lugar que descrevia os argumentos que tu deve passar pro Win32API. Pelo que lembro de cabeça, L = Long, V = void, P = Pointer (ou string) e I = int. Agora o resto eu esqueci mesmo haha'
A propósito, tá aqui mais um tutorial que pode ser útil.

Os argumentos tu passa como quiser, ex:
Código: [Selecionar]
Win32API.new('user32', 'SetCursorPos', 'ii', 'i') # Como uma string é uma array de caracteres em ruby, aqui só passamos a string com os argumentos mesmo.
Win32API.new('user32', 'SetCursorPos', ['i', 'i'], 'i') # Já aqui nós passamos uma array de caracteres mesmo.
Win32API.new('user32', 'SetCursorPos', %w(i i), 'i') # %w(a b) é um atalho para ['a', 'b']. É um jeito de criar arrays de strings separadas por espaços em ruby.

E preocupa não, vou terminar as aulas de rgss3 assim que terminar minha engine.

Opa, obrigado pelas dicas, tutorial e exemplos. Já me ajudou bastante! Sobre os exemplos, nesse "%w(i i)" eu poderia então fazer dessa forma => ['i', 'i'] que daria no mesmo um ou outro?

Vou aguardar essas aulas, em ;) Boa sorte com a engine
O livro traz a vantagem de a gente poder estar só e ao mesmo tempo acompanhado.

------------


Syureri

Resposta 6: 09/10/2018 às 18:22

Sim, pode fazer 'ii', ['i', 'i'] ou %w(i i) que dá na mesma. É só questão de preferência o/


Rayner

Resposta 8: 09/10/2018 às 22:52

Spoiler
[close]

Entendi, obrigado  :ok:

Spoiler
[close]

Opa, obrigado por passar esses tutoriais.  :XD: Já me ajuda bastante  :wow:
___

Apenas repassando o tutorial / aula do Raizen para acrescentar no aprendizado de quem está chegando nesse tópico.

Obrigado Corvo, Sotelie e Kvothe por me ajudarem.  :ok:

Resolvido~
O livro traz a vantagem de a gente poder estar só e ao mesmo tempo acompanhado.

------------